panduan terkini untuk menghapus bidang wajib telepon dari checkout

9

Tolong bisakah seseorang memposting panduan tentang penghapusan bidang telepon 'wajib' dalam checkout berdasarkan tata letak magento Versi 1.8.0.0, sebagian besar sumber daya Google saat ini sudah usang dan tidak lagi berfungsi. Ini akan menjadi tempat yang tepat untuk menyimpan panduan cara terbaru.

Akan sangat membantu jika seseorang dapat mengkonfirmasi solusi yang berfungsi dengan mengunduh Magento 1.8.0.0 dan memberikan bukti penghapusannya, cuplikan kode ini terkadang membantu, tetapi kami belum menemukan solusi yang berfungsi dengan cara yang mudah dibaca / didokumentasikan.

Alistair
sumber

Jawaban:

8

Sebelum 1.8.1saya tidak mengetahui cara apa pun untuk membuat pekerjaan ini, Anda harus mengganti kelas inti abstrak di kumpulan kode lokal atau menulis ulang setiap kelas anak tunggal (jelek, saya tahu).

Sejak 1.8.1saat itu, mereka memperkenalkan acara tersebut customer_address_validation_after. Saya menyingkirkan validasi dengan menggunakan refleksi, meskipun saya tidak terlalu bangga akan hal itu. Mungkin tidak menyelesaikan masalah Anda, tapi saya pikir saya tetap akan mempostingnya.

/**
 * Validate address ignoring phone-related errors
 *
 * Internally uses reflexion. Maybe not the most
 * efficient or clean implementation, but allows
 * this functionality to be implemented without
 * the need to rewrite 3 core classes.
 *
 * Listens to:
 * - customer_address_validation_after
 *
 * @param Varien_Event_Observer $observer Event observer
 */
public function validateAddress(Varien_Event_Observer $observer)
{
    /* @var $address Mage_Customer_Model_Address_Abstract */
    $address = $observer->getAddress();
    if (!$address) {
        return;
    }

    $prop = new ReflectionProperty('Mage_Customer_Model_Address_Abstract', '_errors');
    if (!$prop) {
        return;
    }
    $prop->setAccessible(true);
    $errors = $prop->getValue($address);
    $prop->setValue($address, array());

    $errorMessage = $this->getErrorMessage();
    foreach ($errors as $error) {
        if ($error !== $errorMessage) {
            $address->addError($error);
        }
    }
}

/**
 * Get standard error message
 *
 * @return string
 */
protected function getErrorMessage()
{
    return Mage::helper('customer')->__('Please enter the telephone number.');
}

Saya juga menulis skrip pembaruan untuk mendefinisikan arsip yang tidak diperlukan, dan mengedit semua formulir untuk menghapus validasi frontend. Seperti yang saya katakan, ini mungkin bukan solusi terbaik, tetapi lebih baik daripada menulis ulang 3-4 kelas IMHO.

UPDATE Tim inti dibungkus acara customer_address_validation_afterdi awal bersyarat dari 1.9.0melalui 1.9.1.1(saya benar-benar bertanya-tanya mengapa, tidak masuk akal bagi saya ...) jadi solusi saya tidak akan bekerja untuk versi ini, sayangnya. Syaratnya untungnya dihapus di 1.9.2.

fmrng
sumber
Terima kasih! Masukkan
sv3n
6

Anda perlu memodifikasi Mage_Customer_Model_Address_Abstractkelas * pada saluran 375-377 mengomentari Validasi Zend dari nomor telepon.

//if (!Zend_Validate::is($this->getTelephone(), 'NotEmpty')) {
//   $errors[] = Mage::helper('customer')->__('Please enter the telephone number.');
//}

serta atribut telepon itu sendiri dalam database menghapus kelas yang diperlukan. Ini dapat dilakukan dengan permintaan berikut

UPDATE `eav_attribute` SET `is_required` = 0 WHERE `attribute_code` = 'telephone';

Ini akan menangani validasi frontend (Javascript) dari bidang telepon.

** Pastikan untuk menyalin file kelas ke localdirektori kode Anda *

Sander Mangel
sumber
Perhatikan bahwa Anda tidak dapat memperluas (menulis ulang) kelas abstrak dari ekstensi khusus. Anda hanya dapat menyalin seluruh file ke aplikasi / kode / lokal dan menyesuaikannya di sana. Perhatikan juga bahwa jawaban ini juga berfungsi untuk versi Magento yang lebih rendah dari 1,8.
Mark van der Sanden
Anda benar sekali. Saya akan segera mengedit
Sander Mangel
Seperti yang disarankan, saya telah menyalin Abstract.php dari / public_html / app / code / core / Mage / Pelanggan / Model / Alamat ke public_html / app / kode / lokal / Mage / Pelanggan / Model / Alamat mengomentari baris mengenai nomor telepon dan jalankan UPDATE eav_attribute SET is_required = 0 WHERE atribut_code = 'telephone' LIMIT 1; 1 baris terpengaruh. (Permintaan memakan waktu 0,0506 detik) Menghapus semua cache (kompilasi magento saya selalu mati) Namun pelanggan masih diharuskan untuk memberikan nomor sebelum mereka dapat checkout. Dapatkah seseorang tolong konfirmasikan solusi ini berfungsi pada 1.8.0.0, karena itu tidak berfungsi pada saya.
Alistair
2
Ada kesalahan kecil dalam kueri Sander: abaikan LIMIT 1 dalam kueri. Dalam pemasangan standar CE 1.8, ada 4 entri eav_attributedengan kode 'telepon', jadi Anda tidak dapat menentukan yang mana yang telah diperbarui. Maka kode harus bekerja (baru saja mengujinya). Untuk bagian visual, Anda masih harus menghapus <em>*</em>label bidang dalam semua bentuk (checkout / edit alamat). Tentu saja, jika Anda memiliki semacam checkout satu langkah terinstal, itu bisa mengesampingkan beberapa fungsi Magento default dan jawaban ini mungkin tidak berfungsi.
Mark van der Sanden
1
Hai Mark: Terima kasih atas komentar Anda, saya memang memeriksa untuk melihat apakah itu yang terjadi di toko saya, tetapi saya hanya memiliki satu eav_atribut dengan code'telephone '"SELECT * FROM eav_attribute WHERE atribut_code =' telephone '" Menampilkan baris 0 - 0 (Total 1, Query mengambil 0,0005 dtk), jadi toko saya hanya memiliki satu di antaranya, tidak seperti milik Anda .. dan saat ini disetel ke "is_required = 0"
Alistair
5

Saya menyarankan untuk mengubah templat alamat untuk tema situs dan menjadikan ponsel bidang tersembunyi dengan nilai default berupa spasi atau tanda hubung. Ini tidak memerlukan penulisan ulang / overwrites.

Vladimir Kerkhoff
sumber
2

Bisakah Anda tidak hanya menulis ulang kelas yang menggunakan abstrak menggunakan ekstensi kustom dan konfigurasi penulisan ulang.

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Kemudian Anda dapat membuat validatefungsi Anda sendiri yang akan mengecualikan pemeriksaan telepon, atau lebih baik lagi memeriksa semua atribut yang diperlukan dan memvalidasi bahwa mereka ditetapkan.

David Manners
sumber
1
Benar, tetapi sayangnya setiap pembayaran atau pengiriman modul kedua sedang mencoba untuk menulis ulang kelas-kelas tersebut (saya bisa menyebutkan beberapa). Seringkali itu bukan pilihan, atau akhirnya menjadi sangat berantakan.
fmrng
tetapi Anda telah memecahkan banyak penulisan ulang itu? karena dengan begitu Anda bisa menggunakan solusi itu dan menyuntikkan validasi Anda di sana.
David Manners
Tentu saja Anda bisa melakukan itu, tetapi Anda harus melakukannya untuk setiap proyek, karena Anda tidak tahu siapa lagi yang akan menulis ulang kelas-kelas itu. Sayangnya, pelanggan selalu meminta untuk menghapus validasi ponsel. Satu-satunya solusi standar dan "bersih" yang saya buat adalah yang saya jelaskan dalam jawaban saya, dan itu bahkan tidak berfungsi untuk semua versi Magento. Jika itu tidak dapat diterapkan, yang paling mudah adalah menyalin kelas abstrak ke kumpulan kode lokal dan mengomentari validasinya ... bukan yang terbaik, tetapi tidak apa-apa jika Anda tidak menyalahgunakannya.
fmrng
2

Saya baru saja menjumpai ekstensi kecil yang bagus "Webguys_Telefonkeinpflicht" oleh Tobi, yang pada dasarnya mengikuti pendekatan David. Ini menulis ulang subclass masing-masing. Yang saya sukai cukup banyak adalah kenyataan bahwa ia hanya mengirim acara di kelas-kelas yang ditulis ulang dan semua penyesuaian lebih lanjut kemudian dilakukan di pengamat acara. Ia juga mengamati core_block_abstract_to_html_afteracara untuk menghapus bintang dan kelas yang diperlukan dari bidang input dengan beberapa sihir hitam regex. Dan itu tentu saja dilengkapi dengan skrip pengaturan, yang membuat atribut telepon tidak diperlukan dalam eav_attributetabel. Anda dapat memeriksa ekstensi di GitHub .

Simon
sumber