актуальное руководство по удалению обязательного поля телефона из кассы

9

Пожалуйста, можете кто-нибудь опубликовать руководство по удалению «обязательного» телефонного поля при оформлении заказа на основе макета magento версии 1.8.0.0, большинство текущих ресурсов гугла устарели и больше не работают. Казалось бы, это идеальное место, чтобы хранить обновленные инструкции / руководство.

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

Alistair
источник

Ответы:

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 класса ИМХО.

ОБНОВЛЕНИЕ Основная команда завершила событие customer_address_validation_afterусловно, начиная с 1.9.0конца 1.9.1.1(мне действительно интересно, почему, для меня это не имеет смысла ...), поэтому мое решение не будет работать для этих версий, к сожалению. Условно был удален в 1.9.2.

fmrng
источник
Спасибо! Просто поместите это в модуль: 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каталог кода *

Сандер Мангель
источник
Обратите внимание, что вы не можете расширять (переписывать) абстрактный класс из пользовательского расширения. Вы можете только скопировать весь файл в app / code / local и настроить его там. Также обратите внимание, что этот ответ работает и для версий Magento ниже 1.8.
Марк ван дер Санден
Ты абсолютно прав. Я отредактирую сразу
Сандер Мангель
Как показывают предлагаемые ответы, я скопировал файл Abstract.php из / public_html / app / code / core / Mage / Customer / Model / Address в public_html / app / code / local / Mage / Customer / Model / Address закомментировал строки, касающиеся номер телефона и выполнить ОБНОВЛЕНИЕ eav_attribute SET is_required = 0 WHERE attribute_code = 'telephone' 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 '"SELECT * FROM eav_attribute WHERE attribute_code =' telephone '" Отображение строк 0 - 0 (Всего 1, запрос занял 0,0005 секунд), поэтому в моем магазине есть только один из них, в отличие от вашего ... и в настоящее время он установлен на "is_required = 0"
Алистер
5

Я бы предложил изменить шаблон адреса для темы сайта и сделать телефон скрытым полем со значением по умолчанию пробел или тире. Это не потребует переписывания / перезаписи.

Владимир Керхофф
источник
2

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

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Затем вы можете создать свою собственную validateфункцию, которая исключит проверку телефона или, что еще лучше, проверит все необходимые атрибуты и подтвердит, что они установлены.

Дэвид Мэннерс
источник
1
Правда, но, к сожалению, каждый второй модуль оплаты или доставки пытается переписать эти классы (я могу назвать несколько). Часто это не вариант, или он оказывается очень грязным.
fmrng
но вы решили эти несколько переписывает? потому что тогда вы могли бы использовать это решение и ввести свою валидацию там.
Дэвид Мэннерс
Конечно, вы можете сделать это, но вы должны сделать это для каждого отдельного проекта, так как вы не знаете, кто еще собирается переписать эти классы. К сожалению, клиенты всегда просят убрать проверку телефона. Единственное стандартное и «чистое» решение, которое я придумал, - это то, которое я описал в своем ответе, и оно даже не работает для всех версий Magento. Если это не может быть применено, проще всего скопировать абстрактный класс в локальный пул кода и закомментировать проверку ... не самое лучшее, но это хорошо, если вы не злоупотребляете им.
fmrng
2

Я только что столкнулся с милым небольшим расширением "Webguys_Telefonkeinpflicht" Тоби, которое в основном следует подходу Дэвида. Переписывает соответствующие подклассы. Что мне очень нравится, так это то, что оно отправляет событие только в переписанных классах, а вся дальнейшая настройка выполняется в обозревателе событий. Он также наблюдает за core_block_abstract_to_html_afterсобытием, чтобы удалить звезду и требуемый класс из поля ввода с помощью некоторого регулярного выражения черной магии. И, конечно, он поставляется со скриптом настройки, который делает атрибут телефона не обязательным в eav_attributeтаблице. Вы можете проверить расширение на GitHub .

Саймон
источник