Как создать настраиваемые поля, такие как номер мобильного телефона, в форме регистрации клиента без изменения основных файлов magento?

Как создать настраиваемые поля, такие как номер мобильного телефона, в форме регистрации клиента без изменения основных файлов magento? Я пробовал, но номер мобильного телефона не сохраняется в БД

Я переопределяю класс Mage_Customer_Model_Entity_Setup с помощью Myown_Mage_Customer_Model_Entity_Setup, создавая Model/Entity/Setup.php в папке моих модулей и добавляя следующий код в массив в getDefaultEntities

'mobilenumber' => array(
                        'label'        => 'Mobile Number',
                        'visible'    => true,
                        'required'    => true,
                    ),

также мой файл конфигурации содержит следующий код

<models>
        <customer_entity>
            <rewrite>
                  <customer>Myown_Mage_Customer_Model_Entity_Setup</customer>
            </rewrite>
        </customer_entity>
    </models>

Также у меня есть это поле в template/customer/form/register.phtml

<input type="text" name="mobilenumber" id="mobilenumber" value="<?php echo $this->htmlEscape($this->getFormData()->getMobilenumber()) ?>" title="<?php echo $this->__('Mobile Number') ?>" class="required-entry input-text" />  

Есть ли что-то, что мне не хватает в этой конфигурации? Я хочу сохранить номер мобильного телефона в БД и получить его позже.


person Sreejith Sasidharan    schedule 29.09.2010    source источник
comment
вы нашли решение для этого?   -  person Miles Pfefferle    schedule 13.04.2012


Ответы (2)


Мне пришлось создать похожее поле (в данном случае referred_by) для корпоративного клиента, и вот как это было:

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

Затем я добавил поле в наборы полей клиента, что, кажется, помогает Magento понять, какие данные сохранять в базе данных:

<global>
    <fieldsets>
        <customer_account>
            <referred_by>
                <create>1</create>
                <update>0</update>
                <to_order>customer_referred_by</to_order>
            </referred_by>
        </customer_account>
    </fieldsets> 
</global>

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

class Company_Module_Model_Checkout_Type_Onepage extends Mage_Checkout_Model_Type_Onepage {
    public function saveBilling($data, $customerAddressId) {
        if (isset($data['referred_by'])) {
            // set referred for later use.
            $session    = Mage::getSingleton("customer/session");
            $session->setData("referred_by", $data['referred_by']);
        }

        return parent::saveBilling($data, $customerAddressId);
    }//end saveBilling
}

И:

<global>
    <models>
        <checkout>
            <rewrite>
                <type_onepage>Company_Module_Model_Checkout_Type_Onepage</type_onepage>
            </rewrite>
        </checkout>
    </models>   
</global>

После этого данные корректно сохранились в базе. Ура!

Надеюсь, это поможет! Спасибо, Джо

person Joseph Mastey    schedule 01.10.2010
comment
не лучше ли привязать наблюдателя к событию сохранения биллинга на кассе и добавить данные в сеанс в этот момент? Я бы очень осторожно относился к переписыванию чего-либо, связанного с Mage_Checkout или Mage_Sales... - person Jonathan Day; 08.10.2010
comment
@ Джонатан, я знаю это чувство, но на самом деле оно сработало плавно. В то время был другой код (поэтому мне все равно нужен был доступ к другим методам в этом классе), но я думаю, что ваш подход также будет работоспособным. - person Joseph Mastey; 08.10.2010
comment
справедливо, похоже, что подход соответствовал требованиям! - person Jonathan Day; 08.10.2010

Что касается вашего кода:

  1. Вам не нужно переопределять Mage_Customer_Model_Entity_Setup, потому что этот класс используется только для установки атрибутов клиента. Решение состоит в том, чтобы иметь свой собственный класс установки, который наследуется от Mage_Customer_Model_Entity_Setup.

  2. Вам также понадобится установочный файл mysql4-install

Чтобы точно увидеть, как добавить новые атрибуты для клиента, посмотрите этот модуль magento, который я сделал: https://code.google.com/p/magento-code-snippets/source/browse/#svn/trunk/PWS_ExtCustomerFields

person Anda B    schedule 02.10.2010
comment
Интересно, что его подход делает ненужным файл mysql4-installblahblah, поскольку Varien заботится о его создании каждый раз, когда они обновляют модель клиента. Я согласен с тем, что он не должен переопределять основной установочный файл, что делает необходимым добавление этого файла. - person Joseph Mastey; 03.10.2010
comment
Итак, вы говорите, что его код работает без установочного файла mysql, ему нужно всего лишь подождать месяц или два для обновления magento. - person Anda B; 03.10.2010