Добавление поля регистрации пользователя в Magento
Здравствуйте, уважаемые!
В этой статье я постараюсь дать описание процесса добавления нового поля в форму регистрации нового пользователя в Magento.
Существует платное решение, но если нужно всего лишь добавить одно поле, например компанию, или мобильный телефон, то покупать его несколько странно… Так что кому интересно — прошу под кат.
Для начала определимся со списком файлов, подлежащих редактированию:
Первый файл — контроллер, который обрабатывает запросы относящиеся к покупателю.
В нем необходимо сделать некоторые изменения. Существующие в сети руководства не позволяют сохранять значения для вновь созданных реквизитов покупателя, так как в новых версиях Magento способ работы с атрибутами несколько изменился.
Изменения коснутся функций createPostAction() и editPostAction(), которые вызываются при создании нового и сохранении существующего пользователя соответственно.
Найдем в первой функции строки:
В этом месте данные полученные в форме сохраняются в базу, нам необходимо добавить сюда сохранение нашего нового реквизита, назовем его cellphone:
Для второй функции также ищем место, где происходит попытка сохранения данных, и добавляем сохранение нашего параметра:
Отлично, данные мы сохранили, теперь необходимо добавить это поле для всех новых пользователей, для этого необходимо отредактировать второй в нашем списке файл. Нас интересует функция getDefaultEntities(), она вызывается при создании нового покупателя. Найдем окончание массива attributes и добавим в него наш элемент:
Параметр sort_order необходимо установить больше, чем самый большой в предыдущих позициях массива, или можно перераспределить порядок.
Теперь необходимо вывести поля в панель администратора и формы регистрации и редактирования пользователя.
Начнем с форм. За них отвечают два последних в списке файла, в них необходимо добавить следующий код:
edit.phtml
register.phtml
Обратите внимание, что в файле edit используется функция getCustomer(), а в register — getFormData(). Все дело в том, что в первом случае у нас уже есть объект покупателя, а во втором — нет.
Остались сущие пустяки: добавить поля атрибута в базу данных и вывести их в панель администратора.
Добавление происходит следующим образом: в начало любого файла, например вышеуказанного register.phtml добавим код.
Зайдем на страницу регистрации нового пользователя, и новые поля будут добавлены. После этого код можно удалить.
Теперь проделаем слудющие действия (к сожалению процесса автоматического я пока не придумал):
Открываем базу в phpMyAdmin
Находим таблицу mag_eav_attribute и ищем в ней наш добавленный атрибут
Запоминаем его id
Открываем таблицу mag_customer_form_attribute
Добавляем в нее новую запись form_code='adminhtml_customer' attribute_id='найденный выше id'
Вот и все, теперь новый параметр виден везде где нужно и все сохраняется.
P.S.
Статья является аггрегацией некоторых данных с форумов magento и собственных изысканий.
Наверняка есть и другие решения, в частности написание собственного модуля, но в плане скорости однократного внедрения данное решение кажется мне оптимальным.
Из минусов — при обновлении движка возможно все изменения будут утеряны.
На момент написания было протестировано на версии 1.4.2.0
В этой статье я постараюсь дать описание процесса добавления нового поля в форму регистрации нового пользователя в 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 комментариев