(Предполагается что у вас уже создана своя тема и вы хотите расширить ее возможности.)

Magento обладает стандартной страницей регистрации. Однако, некоторым магазинам необходимо получить больше информации от клиента для повышения качества обслуживания. Это могут быть такие детали как размер обуви, одежды или любимый цвет.

Добавление пользовательских полей в форму регистрации не является сложным делом, но это все-таки нетривиальная задача, так как это нельзя сделать напрямую из админпанели. В качестве примера того, как это можно сделать, я продемонстрирую добавление дополнительного поля, в которое пользователь должен будет ввести индивидуальный номер налогоплательщика.

1. Реализуем дополнительные поля в виде нового модуля. Добавим пользователю право выбирать имя группы(group_id) при регистрации а также создадим новый атрибут ИНН(inntwo).

Начнем с добавления xml файла модуля в каталог:


app/etc/modules/mygento_customer.xml

Название модуля лучше определить как “Компания_Имя” , например Mygento_Customer. Идея состоит в определении авторских прав на модуль. Соответственно добавим следующий контент:


    <config>
        <modules>
            <Mygento_Customer>
                <active>true</active>
                <codePool>local</codePool>
            </Mygento_Customer>
        </modules>
    </config>

Теперь Magento знает о нашем новом модуле. Создадим сам модуль, который будет расположен в директории


app/code/local/Mygento/Customer
Структура папок модуля:
magento/app/code/local/
	Mygento/
		Customer/
			 Block/
			 etc/
			 Helper/
			 Model/
			 sql/

Позднее мы вернемся к этим папкам.

2. Добавим поля выбора группы и ввода ИНН на странице регистрации. Копируем себе в тему шаблон страницы регистрации из:


/app/design/frontend/base/default/template/customer/form/register.phtml

И вставим в него, перед блоком :


<div class="fieldset">
            <h2 class="legend"><?php echo $this->__('Login Information') ?></h2>

следующий код:


/*Формируем массив из типов клиентских групп*/
<?php $customer_groups = Mage::helper('customer')->getGroups()->toOptionArray(); ?>
/* Блок поля для выбора группы */
<div class="fieldset">
    <h2 class="legend"><?php echo $this->__('Customer Group') ?></h2>
    <ul class="form-list">
        <?php foreach ($customer_groups as $cg): ?>
            <li class="fields required" style="margin: 2px 4px;">
                <input type="radio" name="group" id="group" value="<?php echo $cg['value']; ?>" 
                       <?php if ($cg['value'] == 1) echo 'checked=1' ?> style="vertical-align:baseline;" />
                <label style="float:none"><?php echo $cg['label']; ?></label>
            </li>
        <?php endforeach; ?>
    </ul>
</div>
/*Блок для ввода значения ИНН */
<div class="fieldset">
    <div class="input-box">
        <label for="inntwo"><?php echo $this->__('Inn') ?><
              span class="required">*</span></label><br />
        <input type="text" name="inntwo" id="inntwo" value="<?php echo 
     $this->htmlEscape($this->getFormData()->getInntwo()) ?>
" title="<?php echo $this->__('Inn') ?>"
 class="required-entry input-text" />
</div>

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

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

Атрибут group_id по умолчанию прописан в Magento. Сделаем так что атрибут inntwo тоже будет прописан. Добавим атрибут в Customer Entity Setup Model.В папке модуля создаем файл:


Model/Entity/Setup.php

Создаем в нем класс-наследник:


class Mygento_Customer_Model_Entity_Setup extends Mage_Customer_Model_Entity_Setup{
}

Копируем в него метод getDefaultEntities из файла:


app/code/core/Mage/Customer/Model/Resourse/Setup.php

Добавляем следующий код внутрь массива “attributes array” который находится в “customer array”:


'inntwo' => array(
	'label'		=> 'inntwo',
	'visible'	=> true,
	'required'	=> true,
),

параметр requred говорит, обязательно ли данное поле для заполнения.

Теперь запишем атрибут в базу данных. Внутрь файла:


<theme>/template/customer/form/register.phtml 

Сверху пропишем код:


<?php
$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$setup->addAttribute('customer', 'inntwo', array(
        'label' => 'Inn,
	'type'		=> 'varchar',
	'input'		=> 'text',
	'visible'	=> true,
	'required'	=> true,
	'position'	=> 1,
	));
?>

параметры type и input могут быть изменены если вам нужен специфичный атрибут.

Обновим страницу регистрации один раз, после чего этот код можно удалить.

4. Мagento имеет механизм Событий/Наблюдателей(events/observers). Этот механизм мониторит и позволяет реагировать на события, происходящие в системе( пользователь отправил данные, зарегистрировался и.т.д). Воспользуемся им для получения данных формы регистрации. Для этого создадим файл:


Model/Customer/observer.php

со следующим кодом:


<?php

class Mygento_Customer_Model_Customer_Observer extends Mage_Core_Model_Abstract {

    public function customer_save_before($observer) {
        $postData = Mage::app()->getRequest()->getPost();
        $group_id = $postData['group'];
        try {
            $customer = $observer->getCustomer();
            if ($group_id == 2) {
                $customer->setGroupId(2);
            } else {
                $customer->setGroupId(1);
            }
        } catch (Exception $e) {
            Mage::log("customer_save_before observer failed: " . $e->getMessage());
        }
        $postData = Mage::app()->getRequest()->getPost();
        $customer = $observer->getCustomer();
        $customer->setInntwo($_POST['inntwo']);
    }

}

?>

В нем описано получение данных методом POST и присвоение их регистрируемому пользователю.

5. Объявим наш mygento_customer_save_observer.

В папке модуля создаем файл:


etc/config.xml 

Вставляем код:


<?xml version="1.0"?>
<config>
    <modules>
        <Mygento_Customer>
            <version>1.0</version>
        </Mygento_Customer>
    </modules>
    <global>       
        <events>
            <customer_save_before>
                <observers>
                    <mygento_customer_save_observer>
                        <type>singleton</type>
                        <class>Mygento_Customer_Model_Customer_Observer</class>
                        <method>customer_save_before</method>
                    </mygento_customer_save_observer>
                </observers>
            </customer_save_before>
        </events>
    </global>
</config>

6. Теперь атрибуты установлены и записываются в базу. Добавим дополнительное поле в админпанели которое будет показывать ИНН.


копируем app/code/core/mage/adminhtml/block/customer/grid.php
в app/code/local/mage/adminhtml/block/customer/grid.php

добавляем код в метод protected function _prepareCollection() 
->addAttributeToSelect('inntwo')

добавляем код в attributes array:
$this->addColumn('inntwo', array(
            'header'    => Mage::helper('customer')->__('inntwo'),
            'width'     => '100',
            'index'     => 'inntwo'
        ));

Это добавит новую колонку для ИНН в админпанель.