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


9

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

Было бы полезно, если бы кто-нибудь мог подтвердить рабочее решение, загрузив 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 класса ИМХО.

ОБНОВЛЕНИЕ Основная команда завершила событие 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каталог кода *


Обратите внимание, что вы не можете расширять (переписывать) абстрактный класс из пользовательского расширения. Вы можете только скопировать весь файл в 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 .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.