Добавление поля регистрации пользователя в Magento

Здравствуйте, уважаемые!
В этой статье я постараюсь дать описание процесса добавления нового поля в форму регистрации нового пользователя в Magento.
Существует платное решение, но если нужно всего лишь добавить одно поле, например компанию, или мобильный телефон, то покупать его несколько странно… Так что кому интересно — прошу под кат.

Для начала определимся со списком файлов, подлежащих редактированию:
  • app/code/core/Mage/Customer/Controllers/AccountController.php
  • app/code/core/Mage/Customer/Model/Entity/Setup.php
  • app/design/frontend/default/your_temlate/template/customer/form/edit.phtml
  • app/design/frontend/default/your_temlate/template/customer/form/register.phtml

Первый файл — контроллер, который обрабатывает запросы относящиеся к покупателю.
В нем необходимо сделать некоторые изменения. Существующие в сети руководства не позволяют сохранять значения для вновь созданных реквизитов покупателя, так как в новых версиях Magento способ работы с атрибутами несколько изменился.
Изменения коснутся функций createPostAction() и editPostAction(), которые вызываются при создании нового и сохранении существующего пользователя соответственно.
Найдем в первой функции строки:

if (true === $validationResult) {
          $customer->save();


В этом месте данные полученные в форме сохраняются в базу, нам необходимо добавить сюда сохранение нашего нового реквизита, назовем его cellphone:

if (true === $validationResult) {
          $customer->setData('cellphone', $this->getRequest()->getParam('cellphone'));
          $customer->save();


Для второй функции также ищем место, где происходит попытка сохранения данных, и добавляем сохранение нашего параметра:

try {
        $customer->setData('cellphone', $this->getRequest()->getParam('cellphone'));
        $customer->save();


Отлично, данные мы сохранили, теперь необходимо добавить это поле для всех новых пользователей, для этого необходимо отредактировать второй в нашем списке файл. Нас интересует функция getDefaultEntities(), она вызывается при создании нового покупателя. Найдем окончание массива attributes и добавим в него наш элемент:

'cellphone' => array(
            'label'    => 'Cell phone',
            'visible'  => true,
            'required'  => true,
            'sort_order'=> 100,
          ),


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

Теперь необходимо вывести поля в панель администратора и формы регистрации и редактирования пользователя.

Начнем с форм. За них отвечают два последних в списке файла, в них необходимо добавить следующий код:

edit.phtml

<li class="fields">
         <label for="cellphone" class="required"><em>*</em><?php echo $this->__('Cell phone') ?></label><br />
         <div class="input-box">
         <input type="text" name="cellphone" id="cellphone" value="<?php echo $this->htmlEscape($this->getCustomer()->getCellphone()) ?>" title="<?php echo $this->__('cellphone') ?>" class="required-entry input-text" />
         </div>
</li>


register.phtml

<li class="fields">
           <label for="cellphone"><?php echo $this->__('Cell phone') ?><span class="required">*</span></label><br />
           <div class="input-box">
           <input type="text" name="cellphone" id="cellphone" value="<?php echo $this->htmlEscape($this->getFormData()->getCellphone()) ?>" title="<?php echo $this->__('cellphone') ?>" class="required-entry input-text" />
           </div>
</li>



Обратите внимание, что в файле edit используется функция getCustomer(), а в register — getFormData(). Все дело в том, что в первом случае у нас уже есть объект покупателя, а во втором — нет.

Остались сущие пустяки: добавить поля атрибута в базу данных и вывести их в панель администратора.
Добавление происходит следующим образом: в начало любого файла, например вышеуказанного register.phtml добавим код.
$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$setup->addAttribute('customer', 'cellphone', array(
  'label'    => 'Cell phone',
  'type'    => 'varchar',
  'input'    => 'text',
  'visible'  => true,
  'required'  => true,
  'position'  => 1,
  ));


Зайдем на страницу регистрации нового пользователя, и новые поля будут добавлены. После этого код можно удалить.

Теперь проделаем слудющие действия (к сожалению процесса автоматического я пока не придумал):
Открываем базу в phpMyAdmin
Находим таблицу mag_eav_attribute и ищем в ней наш добавленный атрибут
Запоминаем его id
Открываем таблицу mag_customer_form_attribute
Добавляем в нее новую запись form_code='adminhtml_customer' attribute_id='найденный выше id'

Вот и все, теперь новый параметр виден везде где нужно и все сохраняется.

P.S.
Статья является аггрегацией некоторых данных с форумов magento и собственных изысканий.
Наверняка есть и другие решения, в частности написание собственного модуля, но в плане скорости однократного внедрения данное решение кажется мне оптимальным.
Из минусов — при обновлении движка возможно все изменения будут утеряны.
На момент написания было протестировано на версии 1.4.2.0


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.