Значение настраиваемого поля по умолчанию


Я определил атрибут lastname2 для customer и customer_address, он отображается правильно во всех формах, но когда я создаю новый адрес, он не "заполняется" значением клиента.

Есть какие-нибудь подсказки о том, как это сделать?

Определение моих полей:

$entityAttributes = array(
        'customer'=>array(
            'lastname2' =>  array(
                'store_label'=>'Apellido Materno',
                'label' => 'Apellido Materno',
                'input' => 'text',
                'type'  => 'varchar',
                //System =  False and visible true = Show in 'customer_account_create', 'customer_account_edit', 'checkout_register'
                'system'=>true,
                'visible'=>true, //Watch out!! Only visible fields get processed by the form controllers!!!
                'user_defined'=>false,
                'used_in_forms' => array('adminhtml_customer', 'customer_account_edit', 'checkout_register','customer_account_create'),
                'required' => 0,
                'position' =>69
            ),),
'customer_address'=> array(
            'lastname2' =>  array(
                'store_label'=>'Apellido Materno',
                'label' => 'Apellido Materno',
                'input' => 'text',
                'type'  => 'varchar',
                //System =  False and visible true = Show in 'customer_account_create', 'customer_account_edit', 'checkout_register'
                'system'=>false,
                'visible'=>true, //Watch out!! Only visible fields get processed by the form controllers!!!
                'user_defined'=>false,
                'used_in_forms' => array('customer_account_create','customer_register_address','customer_address_edit','adminhtml_customer_address','adminhtml_customer'),
                'required' => 0,
                'position' =>49
            ),
        ),
    );
# Install Attributes
    foreach($entityAttributes as $entity=>$attributes)
    {
        foreach($attributes as $attribute_code=>$definition)
        {
            $installer->addAttribute($entity, $attribute_code,  $definition); 

            /**
            * @var Mage_Eav_Model_Config
            */
            Mage::getSingleton('eav/config')
            ->getAttribute($entity, $attribute_code)
            ->setData('used_in_forms',$definition['used_in_forms'])
            ->save();
        }
    }

Мой config.xml (соответствующие выдержки, полная версия здесь)

<global>
<!-- [...] -->
        <fieldsets>
            <!-- @see http://www.excellencemagentoblog.com/customer-registration-fields-magento1-6 -->
            <customer_account>
                <lastname2>
                    <create>1</create>
                    <update>1</update>
                    <name>1</name>
                    <to_quote>customer_lastname2</to_quote>
                    <to_customer_address>lastname2</to_customer_address>
                    <to_customer_address>customer_lastname2</to_customer_address>
                </lastname2>
            </customer_account>      
            <customer_address>
                <lastname2>
                    <to_quote_address>*</to_quote_address>
                </lastname2>
            </customer_address>
        </fieldsets> 
<!-- [...] -->
</global>

Редактировать: Это не автозаполнение браузера, я хочу повторить поведение из полей имя и фамилия, в которых по умолчанию отображаются имя и фамилия клиента (соответственно)

Author: David Sarmiento, 2013-11-28

1 answers

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

$this->_address = Mage::getModel('customer/address');

// Init address object
if ($id = $this->getRequest()->getParam('id')) {
    $this->_address->load($id);
    if ($this->_address->getCustomerId() != Mage::getSingleton('customer/session')->getCustomerId()) {
        $this->_address->setData(array());
    }
}

if (!$this->_address->getId()) {
    $this->_address->setPrefix($this->getCustomer()->getPrefix())
        ->setFirstname($this->getCustomer()->getFirstname())
        ->setMiddlename($this->getCustomer()->getMiddlename())
        ->setLastname($this->getCustomer()->getLastname())
        ->setSuffix($this->getCustomer()->getSuffix());
}

Затем позже при получении имени html этот объект адреса устанавливается против виджета, который будет использоваться для получения данных в шаблоне.

public function getNameBlockHtml()
{
    $nameBlock = $this->getLayout()
        ->createBlock('customer/widget_name')
        ->setObject($this->getAddress());

    return $nameBlock->toHtml();
}

И, наконец, эти значения используются в самом шаблоне app/design/frontend/base/default/template/customer/widget/name.phtml.

<?php echo $this->escapeHtml($this->getObject()->getFirstname()) ?>

Таким образом, вам нужно будет либо подключиться к событию before html и внести изменения в объект адреса, либо переписать этот блок. В любом случае вам также потребуется изменить шаблон, чтобы включить в него ваши новые атрибуты.

 2
Author: David Manners, 2014-08-14 09:37:46