сучасний посібник для видалення необхідного поля для телефону з каси


9

Будь ласка, будь-хто може опублікувати керівництво по вилученню «необхідного» телефонного поля в касі на основі маґенто макета версії 1.8.0.0, більшість поточних ресурсів Google застаріли і більше не працюють. Це може здатися ідеальним місцем для оновлення інструкцій з експлуатації / керівництва.

Було б корисно, якби хтось міг підтвердити робоче рішення, завантаживши Magento 1.8.0.0 і надавши підтвердження його видалення, ці фрагменти коду іноді корисні, але нам ще потрібно знайти робоче рішення у легкому для читання / документальному оформленні способі.


Відповіді:


8

Перш ніж 1.8.1я не знаю жодних способів зробити цю роботу, вам доведеться або замінити абстрактний основний клас у локальному кодовому пулі, або переписати кожен дочірній клас (негарно, я знаю).

Відтепер 1.8.1вони представили подію customer_address_validation_after. Я позбувся валідації за допомогою рефлексії, навіть якщо не надто пишаюся цим. Можливо, не вирішити вашу проблему, але я подумав, що все-таки опублікую її.

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

Я також написав сценарій оновлення, щоб визначити поданий як не потрібний, і відредагував усі форми, щоб видалити перевірку фронтенда. Як я вже говорив, це може бути не найкращим рішенням, але це краще, ніж переписування ІМХО 3-4 класів.

UPDATE Основна команда загорнуті подія customer_address_validation_afterв умовному , починаючи з 1.9.0через 1.9.1.1(я дійсно задаюся питанням, чому, не має ніякого сенсу для мене ...) , тому моє рішення не буде працювати для цих версій, на жаль. Умовно, на щастя, було знято в 1.9.2.


Дякую! Просто поставте це в модуль: github.com/sreichel/magento-StackExchange_RequiredTelephone
sv3n

6

Вам потрібно буде змінити Mage_Customer_Model_Address_Abstractклас * на лінії 375-377, коментуючи Zend Validation номера телефону.

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

а також сам атрибут телефону в базі даних, що видаляє необхідний клас. Це можна зробити за допомогою наступного запиту

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

Це забезпечить перевірку інтерфейсу (Javascript) телефонних полів.

** Обов’язково скопіюйте файл класу у свій localкаталог кодів *


Зауважте, що ви не можете розширити (переписати) абстрактний клас зі спеціального розширення. Ви можете лише скопіювати весь файл у додаток / код / ​​локальний і налаштувати його там. Також зауважте, що ця відповідь працює і для версій Magento, які не перевищують 1,8.
Марк ван дер Санден

Ви абсолютно праві. Я одразу відредагую
Sander Mangel

Як показують запропоновані відповіді, я скопіював Abstract.php з / public_html / app / code / core / Mage / Customer / Model / Address to public_html / app / code / local / Mage / Customer / Model / Address прокоментував рядки щодо номер телефону та запустіть UPDATE eav_attribute SET is_required = 0 WHERE attribute_code = 'phone' LIMIT 1; 1 ряд зачеплений. (Запит займав 0,0506 сек.) Очищено всі кеші (моя компіляція magento завжди вимкнена). Однак клієнтам все одно потрібно дати номер, перш ніж вони зможуть отримати замовлення. Чи можете хтось підтвердити це рішення працює на 1.8.0.0, тому що він не працює на моїй.
Алістер

2
У запиті Сандера є невелика помилка: опустіть LIMIT 1 у запиті. У установці CE 1.8 за замовчуванням є 4 записи eav_attributeз кодом "телефон", тому ви не можете сказати, який з них було оновлено. Тоді код повинен працювати (тільки що його протестували). Щодо візуальної частини, вам все одно потрібно видалити <em>*</em>мітку поля у всіх формах (замовлення / редагування адреси). Звичайно, якщо у вас встановлений якийсь покроковий замовлення, він може змінити частину функціональності Magento за замовчуванням, і ця відповідь може не працювати.
Марк ван дер Санден

1
Привіт Марк: Дякую за Ваш коментар, я перевірив, чи це було так у моєму магазині, але у мене є лише один eav_atribute з кодом'telephone '"ВИБІР * ВІД eav_attribute WHERE attribute_code =' telephone '" Показ рядків 0 - 0 (Всього 1 запит зайняв 0,0005 сек), тож у моєму магазині є лише один із них, на відміну від вашого .. і наразі він встановлений на "is_required = 0"
Alistair

5

Я б запропонував змінити шаблон адреси для теми сайту і зробити телефон прихованим полем із значенням за замовчуванням пробілом або тире. Для цього не потрібно буде переписувати / перезаписувати.


2

Не могли б ви просто переписати класи, які використовують реферат, використовуючи спеціальне розширення та конфігурацію переписує.

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Тоді ви можете зробити власну validateфункцію, яка виключатиме телефонну перевірку, а ще краще перевіряє всі необхідні атрибути та валідації, які вони встановлені.


1
Щоправда, але, на жаль, кожен другий модуль оплати чи доставки намагається переписати ці класи (я міг би назвати декілька). Часто це не варіант, або в кінцевому підсумку це дуже безладно.
fmrng

але ви вирішили ці кілька переписань? Тому ви можете використовувати це рішення і ввести свою перевірку там.
Девід Маннерс

Звичайно, ви можете це зробити, але ви повинні робити це для кожного окремого проекту, оскільки ви не знаєте, хто ще збирається переписати ці класи. На жаль, клієнти завжди просять видалити перевірку телефону. Єдине стандартне і «чисте» рішення, яке я придумав - це те, що я описав у своїй відповіді, і воно навіть не працює для всіх версій Magento. Якщо цього неможливо застосувати, найпростіше - скопіювати абстрактний клас у локальний пул коду та прокоментувати перевірку ... не найкраще, але це добре, якщо ви не зловживаєте ним.
fmrng

2

Я щойно стикався з приємним невеликим розширенням Tobi "Webguys_Phonekeinpflicht" від Tobi, яке в основному слідує за підходом Девіда. Він переписує відповідні підкласи. Що мені дуже подобається, це той факт, що він розсилає події лише в переписаних класах, і все подальше налаштування потім робиться у спостерігача за подіями. Він також спостерігає за core_block_abstract_to_html_afterподією для того, щоб видалити зірку та потрібний клас із поля введення за допомогою якоїсь чорної магії з регулярними виразками. І, звичайно, йде сценарій налаштування, який робить атрибут телефону не обов'язковим у eav_attributeтаблиці. Ви можете перевірити розширення на GitHub .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.