aktualny przewodnik, aby usunąć wymagane pole telefoniczne z kasy

9

Czy ktoś mógłby opublikować przewodnik dotyczący usuwania „wymaganego” pola telefonicznego w kasie w oparciu o układ Magento w wersji 1.8.0.0, większość aktualnych zasobów Google jest przestarzała i już nie działa. Wydaje się, że jest to idealne miejsce do aktualizowania poradników / poradników.

Byłoby pomocne, gdyby ktoś mógł potwierdzić działające rozwiązanie, pobierając Magento 1.8.0.0 i dostarczając dowód jego usunięcia, te fragmenty kodu są czasem pomocne, ale musimy jeszcze znaleźć działające rozwiązanie w sposób łatwy do odczytania / udokumentowania.

Alistair
źródło

Odpowiedzi:

8

Zanim 1.8.1nie będę wiedział, jak to zrobić, musisz albo zastąpić abstrakcyjną klasę rdzeniową w lokalnej puli kodów, albo przepisać każdą klasę potomną (brzydkie, wiem).

Odtąd 1.8.1przedstawili to wydarzenie customer_address_validation_after. Pozbyłem się sprawdzania poprawności za pomocą refleksji, nawet jeśli nie jestem z tego zbyt dumny. Może nie rozwiążę twojego problemu, ale pomyślałem, że i tak go opublikuję.

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

Napisałem również skrypt aktualizacji, aby zdefiniować plik jako niepotrzebny, i zredagowałem wszystkie formularze, aby usunąć weryfikację interfejsu użytkownika. Jak powiedziałem, może nie być to najlepsze rozwiązanie, ale jest lepsze niż przepisywanie 3-4 klas IMHO.

UPDATE Zespół rdzeń owinięty wydarzenie customer_address_validation_afterw ramach warunkowego począwszy od 1.9.0pośrednictwem 1.9.1.1(Naprawdę zastanawiam się, dlaczego nie ma sensu do mnie ...), więc moje rozwiązanie nie będzie działać dla tych wersji, niestety. Warunek został na szczęście usunięty 1.9.2.

fmrng
źródło
Dzięki! Po prostu umieść to w module: github.com/sreichel/magento-StackExchange_RequiredTelefon
sv3n
6

Będziesz musiał zmodyfikować Mage_Customer_Model_Address_Abstractklasę * w linii 375-377 komentując Zend Validation numeru telefonu.

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

a także sam atrybut telefonu w bazie danych usuwający wymaganą klasę. Można to zrobić za pomocą następującego zapytania

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

To zajmie się walidacją frontonu (Javascript) w polach telefonicznych.

** Pamiętaj, aby skopiować plik klasy do localkatalogu kodu *

Sander Mangel
źródło
Pamiętaj, że nie możesz rozszerzyć (przepisać) klasy abstrakcyjnej z niestandardowego rozszerzenia. Możesz skopiować tylko cały plik do app / code / local i tam go dostosować. Pamiętaj również, że ta odpowiedź działa również w wersjach Magento niższych niż 1.8.
Mark van der Sanden
Masz całkowitą rację. Zaraz
dokonam
Jak sugerują odpowiedzi pokazują, że skopiowałem plik Abstract.php z / public_html / app / code / core / Mage / Customer / Model / Address to public_html / app / code / local / Mage / Customer / Model / Address skomentował linie dotyczące numer telefonu i uruchom UPDATE eav_attribute SET is_required = 0 GDZIE kod_atrybutu = „telefon” LIMIT 1; Dotknięty 1 rząd. (Kwerenda zajęła 0,0506 s) Wyczyściłem wszystkie pamięci podręczne (moja kompilacja Magento jest zawsze wyłączona) Jednak klienci nadal muszą podać numer, zanim będą mogli dokonać transakcji. Czy ktoś może potwierdzić, że to rozwiązanie działa na 1.8.0.0, ponieważ nie działa na moim.
Alistair
2
W zapytaniu Sandera występuje mały błąd: pomiń LIMIT 1 w zapytaniu. W domyślnej instalacji CE 1.8 są 4 wpisy eav_attributez kodem „telefon”, więc nie można stwierdzić, który z nich został zaktualizowany. Następnie kod powinien działać (właśnie go przetestowałem). W przypadku części wizualnej nadal musisz usunąć <em>*</em>etykietę pola we wszystkich formularzach (kasa / edycja adresu). Oczywiście, jeśli masz zainstalowane jednoetapowe kasy, może to zastąpić niektóre domyślne funkcje Magento i ta odpowiedź może nie działać.
Mark van der Sanden,
1
Cześć Mark: Dziękuję za komentarz, sprawdziłem, czy tak jest w moim sklepie, ale mam tylko jeden atrybut eav z atrybutem „telefon” „WYBIERZ * Z atrybutu eav_atrybunek GDZIE atrybut_kod =„ telefon ”” Pokazuje wiersze 0 - 0 (1 łącznie, zapytanie zajęło 0,0005 sek.), Więc mój sklep ma tylko jeden z nich, w przeciwieństwie do twojego .. i obecnie jest ustawiony na „is_required = 0”
Alistair
5

Proponuję zmienić szablon adresu dla motywu witryny i ustawić telefon jako ukryte pole z domyślną wartością spacji lub myślnika. Nie będzie to wymagało przepisywania / nadpisywania.

Vladimir Kerkhoff
źródło
2

Czy nie można po prostu przepisać klas korzystających z abstraktu przy użyciu niestandardowego rozszerzenia i przepisać konfigurację.

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Następnie możesz stworzyć własną validatefunkcję, która wyklucza kontrolę telefoniczną, lub jeszcze lepiej sprawdza wszystkie wymagane atrybuty i sprawdza, czy zostały ustawione.

David Manners
źródło
1
To prawda, ale niestety co drugi moduł płatności lub wysyłki próbuje przepisać te klasy (mógłbym wymienić kilka). Często nie jest to opcja lub kończy się bardzo nieuporządkowana.
fmrng
ale rozwiązałeś wiele przeróbek? ponieważ wtedy możesz użyć tego rozwiązania i wprowadzić tam swoją weryfikację.
David Manners,
Oczywiście możesz to zrobić, ale musisz to zrobić dla każdego projektu, ponieważ nie wiesz, kto jeszcze przepisze te klasy. Niestety klienci zawsze proszą o usunięcie weryfikacji telefonu. Jedyne standardowe i „czyste” rozwiązanie, które wymyśliłem, to to, które opisałem w mojej odpowiedzi, i nie działa nawet dla wszystkich wersji Magento. Jeśli nie można tego zastosować, najłatwiej jest skopiować klasę abstrakcyjną do lokalnej puli kodów i zakomentować walidację ... nie najlepsza, ale jest w porządku, jeśli jej nie wykorzystasz.
fmrng
2

Właśnie spotkałem ładne, małe rozszerzenie „Webguys_Telefonkeinpflicht” Tobiego, które w zasadzie podąża za podejściem Davida. Przepisuje odpowiednie podklasy. Najbardziej podoba mi się fakt, że wywołuje on tylko zdarzenie w przepisanych klasach, a dalsze dostosowywanie odbywa się w obserwatorze zdarzeń. Obserwuje również core_block_abstract_to_html_afterzdarzenie w celu usunięcia gwiazdy i wymaganej klasy z pola wejściowego za pomocą pewnej regex czarnej magii. I oczywiście zawiera skrypt instalacyjny, który sprawia, że ​​atrybut telefonu nie jest wymagany w eav_attributetabeli. Możesz sprawdzić rozszerzenie na GitHub .

Szymon
źródło