Aktuelle Anleitung zum Entfernen des telefonischen Feldes von der Kasse

9

Bitte könnte jemand einen Leitfaden zum Entfernen des 'erforderlichen' Telefonfelds an der Kasse auf der Grundlage des Magento-Layouts Version 1.8.0.0 veröffentlichen. Die meisten der derzeit gegoogelten Ressourcen sind veraltet und funktionieren nicht mehr. Dies scheint der perfekte Ort zu sein, um eine aktualisierte Anleitung zu erhalten.

Es wäre hilfreich, wenn jemand die funktionierende Lösung bestätigen könnte, indem er Magento 1.8.0.0 herunterlädt und den Nachweis der Entfernung erbringt. Diese Codefragmente sind manchmal hilfreich, aber wir müssen noch eine funktionierende Lösung auf einfach zu lesende / dokumentierte Weise finden.

Alistair
quelle

Antworten:

8

Bevor 1.8.1mir keine Möglichkeiten bekannt sind, wie dies funktioniert, müssen Sie entweder die abstrakte Kernklasse im lokalen Codepool überschreiben oder jede einzelne untergeordnete Klasse neu schreiben (hässlich, ich weiß).

Von nun 1.8.1an stellten sie die Veranstaltung vor customer_address_validation_after. Ich habe die Validierung durch Reflexion beseitigt, auch wenn ich nicht zu stolz darauf bin. Könnte Ihr Problem nicht lösen, aber ich dachte, ich würde es trotzdem posten.

/**
 * 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.');
}

Ich habe auch ein Aktualisierungsskript geschrieben, um die Datei als nicht erforderlich zu definieren, und alle Formulare bearbeitet, um die Frontend-Validierung zu entfernen. Wie ich schon sagte, es ist vielleicht nicht die beste Lösung, aber es ist besser, als IMHO 3-4 Klassen neu zu schreiben.

UPDATE Das Kernteam wickelte das Ereignis customer_address_validation_afterin einem bedingten ausgehend von 1.9.0durch 1.9.1.1(ich wirklich fragen , warum, für mich keinen Sinn macht ...) so meine Lösung funktioniert nicht für diese Versionen, leider. Die Bedingung wurde zum Glück entfernt 1.9.2.

fmrng
quelle
Vielen Dank!
Fügen Sie
6

Sie müssen die Mage_Customer_Model_Address_AbstractKlasse * in Zeile 375-377 ändern, um die Zend-Validierung der Telefonnummer zu kommentieren.

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

sowie das Telefonattribut selbst in der Datenbank, das die erforderliche Klasse entfernt. Dies kann mit der folgenden Abfrage erfolgen

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

Dadurch wird die Frontend-Validierung (Javascript) der Telefonfelder durchgeführt.

** Stellen Sie sicher, dass Sie die Klassendatei in Ihr localCodeverzeichnis kopieren. *

Sander Mangel
quelle
Beachten Sie, dass Sie eine abstrakte Klasse nicht von einer benutzerdefinierten Erweiterung aus erweitern (neu schreiben) können. Sie können die gesamte Datei nur in app / code / local kopieren und dort anpassen. Beachten Sie auch, dass diese Antwort auch für Magento-Versionen unter 1.8 funktioniert.
Mark van der Sanden
Du hast absolut recht. Ich werde sofort bearbeiten
Sander Mangel
Wie die vorgeschlagenen Antworten zeigen, habe ich die Abstract.php von / public_html / app / code / core / Mage / Customer / Model / Address nach public_html / app / code / local / Mage / Customer / Model / Address kopiert Telefonnummer und führen Sie UPDATE aus eav_attribute SET is_required = 0 WHERE attribute_code = 'phone' LIMIT 1; 1 Reihe betroffen. (Die Abfrage dauerte 0,0506 Sekunden.) Alle Caches wurden gelöscht (meine Magento-Kompilierung ist immer deaktiviert). Kunden müssen jedoch noch eine Nummer angeben, bevor sie auschecken können. Kann jemand bitte bestätigen, dass diese Lösung unter 1.8.0.0 funktioniert, da sie bei mir nicht funktioniert.
Alistair
2
Es gibt einen kleinen Fehler in Sanders Abfrage: Lassen Sie das LIMIT 1 in der Abfrage weg. In einer Standardinstallation von CE 1.8 sind 4 Einträge eav_attributemit dem Code 'Telefon' enthalten, sodass Sie nicht feststellen können, welcher aktualisiert wurde. Dann sollte der Code funktionieren (habe ihn gerade getestet). Für den visuellen Teil müssen Sie dann noch <em>*</em>die Beschriftung des Feldes in allen Formularen entfernen (Kasse / Adressbearbeitung). Wenn Sie eine Art One-Step-Checkout installiert haben, kann dies natürlich einige der Standardfunktionen von Magento überschreiben, und diese Antwort funktioniert möglicherweise nicht.
Mark van der Sanden
1
Hallo Markus: Danke für deinen Kommentar, ich habe überprüft, ob dies in meinem Shop der Fall ist, aber ich habe nur eine eav_atribute mit dem Code'telephone '"SELECT * FROM eav_attribute WHERE attribute_code =' phone '" Zeigt die Zeilen 0 - 0 an (1 insgesamt, Abfrage dauerte 0,0005 Sek.), Daher hat mein Geschäft im Gegensatz zu Ihrem nur eines davon. Und es ist derzeit auf "is_required = 0" eingestellt
Alistair
5

Ich würde vorschlagen, die Adressvorlage für das Site-Thema zu ändern und das Telefon zu einem versteckten Feld mit einem Standardwert als Leerzeichen oder Bindestrich zu machen. Dies erfordert kein Umschreiben / Überschreiben.

Vladimir Kerkhoff
quelle
2

Könnten Sie nicht einfach die Klassen, die das Abstract verwenden, mit einer benutzerdefinierten Erweiterung umschreiben und die Konfiguration neu schreiben?

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Dann können Sie Ihre eigene validateFunktion erstellen, die die telefonische Prüfung ausschließt, oder besser noch alle erforderlichen Attribute prüfen und überprüfen, ob sie festgelegt sind.

David Manners
quelle
1
Stimmt, aber leider versucht jedes zweite Zahlungs- oder Versandmodul, diese Klassen neu zu schreiben (ich könnte einige nennen). Oft ist es keine Option, oder es wird sehr chaotisch.
fmrng
Aber Sie haben diese mehrfachen Umschreibungen gelöst? Dann könnten Sie diese Lösung verwenden und Ihre Validierung dort einfügen.
David Manners
Natürlich können Sie das tun, aber Sie müssen es für jedes einzelne Projekt tun, da Sie nicht wissen, wer diese Klassen sonst noch umschreiben wird. Leider bitten Kunden immer, die Telefonüberprüfung zu entfernen. Die einzige Standard- und "saubere" Lösung, die ich gefunden habe, ist die, die ich in meiner Antwort beschrieben habe, und sie funktioniert nicht einmal für alle Magento-Versionen. Wenn dies nicht angewendet werden kann, ist es am einfachsten, die abstrakte Klasse in den lokalen Codepool zu kopieren und die Validierung zu kommentieren ... nicht die beste, aber es ist in Ordnung, wenn Sie sie nicht missbrauchen.
fmrng
2

Ich bin gerade auf eine nette kleine Erweiterung "Webguys_Telefonkeinpflicht" von Tobi gestoßen, die im Grunde Davids Ansatz folgt. Es schreibt die jeweiligen Unterklassen neu. Was mir ziemlich gut gefällt, ist die Tatsache, dass nur ein Ereignis in den umgeschriebenen Klassen ausgelöst wird und alle weiteren Anpassungen dann in einem Ereignisbeobachter vorgenommen werden. Es beobachtet auch das core_block_abstract_to_html_afterEreignis, um den Stern und die erforderliche Klasse mit etwas Regex-Schwarzmagie aus dem Eingabefeld zu entfernen. Und es kommt natürlich mit einem Setup-Skript, das das Telefonattribut in der eav_attributeTabelle nicht benötigt . Sie können die Erweiterung auf GitHub überprüfen .

Simon
quelle