0

我已经成功地为客户添加了自定义字段。但是我需要这些字段显示在单页结帐中。

我已经覆盖Mage_Customer_Block_Widget_Name并创建了自己的,在(将它们添加到、和)customer/widget/name.phtml中添加了属性,它们在管理站点中工作正常,但是它们不能在结帐表单上工作。该字段显示,但它的值错误且没有 labelsql/xxx_setup/installer-x.y.z.phpadminhtml_customercustomer_account_editcheckout_registercustomer_account_create

我不知道为什么它在客户注册表中有效,但在结帐时却无效。

添加属性的安装程序代码是:

$attributes = array(
    'lastname2' =>  array(
        'frontend_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
    ));


foreach($attributes as $attribute_code=>$definition)
    {
        $installer->addAttribute('customer', $attribute_code,  $definition); 

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

name.phtml 中的代码是

<div class="<?php echo $this->getContainerClassName()?>">
    <?php if ($this->showPrefix()): ?>
        <div class="field name-prefix">
            <label for="<?php echo $this->getFieldId('prefix')?>"<?php if ($this->isPrefixRequired()) echo ' class="required"' ?>><?php if ($this->isPrefixRequired()) echo '<em>*</em>' ?><?php echo $this->getStoreLabel('prefix') ?></label>
            <div class="input-box">
                <?php if ($this->getPrefixOptions() === false): ?>
                    <input type="text" id="<?php echo $this->getFieldId('prefix')?>" name="<?php echo $this->getFieldName('prefix')?>" value="<?php echo $this->escapeHtml($this->getObject()->getPrefix()) ?>" title="<?php echo $this->getStoreLabel('prefix') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('prefix') ?>" <?php echo $this->getFieldParams() ?> />
                    <?php else: ?>
                    <select id="<?php echo $this->getFieldId('prefix')?>" name="<?php echo $this->getFieldName('prefix')?>" title="<?php echo $this->getStoreLabel('prefix') ?>" class="<?php echo $this->helper('customer/address')->getAttributeValidationClass('prefix') ?>" <?php echo $this->getFieldParams() ?>>
                        <?php foreach ($this->getPrefixOptions() as $_option): ?>
                            <option value="<?php echo $_option?>"<?php if ($this->getObject()->getPrefix()==$_option):?> selected="selected"<?php endif; ?>><?php echo $this->__($_option)?></option>
                        <?php endforeach; ?>
                </select>
                <?php endif; ?>
            </div>
        </div>
        <?php endif; ?>
    <div class="field name-firstname">
        <label for="<?php echo $this->getFieldId('firstname')?>" class="required"><em>*</em><?php echo $this->getStoreLabel('firstname') ?></label>
        <div class="input-box">
            <input type="text" id="<?php echo $this->getFieldId('firstname')?>" name="<?php echo $this->getFieldName('firstname')?>" value="<?php echo $this->escapeHtml($this->getObject()->getFirstname()) ?>" title="<?php echo $this->getStoreLabel('firstname') ?>" maxlength="255" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('firstname') ?>" <?php echo $this->getFieldParams() ?> />
        </div>
    </div>
    <?php if ($this->showMiddlename()): ?>
        <?php $isMiddlenameRequired = $this->isMiddlenameRequired(); ?>
        <div class="field name-middlename">
            <label for="<?php echo $this->getFieldId('middlename')?>"<?php echo $isMiddlenameRequired ? ' class="required"' : '' ?>><?php echo $isMiddlenameRequired ? '<em>*</em>' : '' ?><?php echo $this->getStoreLabel('middlename') ?></label>
            <div class="input-box">
                <input type="text" id="<?php echo $this->getFieldId('middlename')?>" name="<?php echo $this->getFieldName('middlename')?>" value="<?php echo $this->escapeHtml($this->getObject()->getMiddlename()) ?>" title="<?php echo $this->getStoreLabel('middlename') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('middlename') ?>" <?php echo $this->getFieldParams() ?> />
            </div>
        </div>
        <?php endif; ?>
    <div class="field name-lastname">
        <label for="<?php echo $this->getFieldId('lastname')?>" class="required"><em>*</em><?php echo $this->getStoreLabel('lastname') ?></label>
        <div class="input-box">
            <input type="text" id="<?php echo $this->getFieldId('lastname')?>" name="<?php echo $this->getFieldName('lastname')?>" value="<?php echo $this->escapeHtml($this->getObject()->getLastname()) ?>" title="<?php echo $this->getStoreLabel('lastname') ?>" maxlength="255" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('lastname') ?>" <?php echo $this->getFieldParams() ?> />
        </div>
    </div>

    <div class="field name-lastname">
        <label for="<?php echo $this->getFieldId('lastname2')?>"><?php echo $this->getStoreLabel('lastname2') ?></label>
        <div class="input-box">
            <input type="text" id="<?php echo $this->getFieldId('lastname2')?>" name="<?php echo $this->getFieldName('lastname2')?>" value="<?php echo $this->escapeHtml($this->getObject()->getLastname2()) ?>" title="<?php echo $this->getStoreLabel('lastname2') ?>" maxlength="255" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('lastname2') ?>" <?php echo $this->getFieldParams() ?> />
        </div>
    </div>

    <?php if ($this->showSuffix()): ?>
        <div class="field name-suffix">
            <label for="<?php echo $this->getFieldId('suffix')?>"<?php if ($this->isSuffixRequired()) echo ' class="required"' ?>><?php if ($this->isSuffixRequired()) echo '<em>*</em>' ?><?php echo $this->getStoreLabel('suffix') ?></label>
            <div class="input-box">
                <?php if ($this->getSuffixOptions() === false): ?>
                    <input type="text" id="<?php echo $this->getFieldId('suffix')?>" name="<?php echo $this->getFieldName('suffix')?>" value="<?php echo $this->escapeHtml($this->getObject()->getSuffix()) ?>" title="<?php echo $this->getStoreLabel('suffix') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('suffix') ?>" <?php echo $this->getFieldParams() ?> />
                    <?php else: ?>
                    <select id="<?php echo $this->getFieldId('suffix')?>" name="<?php echo $this->getFieldName('suffix')?>" title="<?php echo $this->getStoreLabel('suffix') ?>" class="<?php echo $this->helper('customer/address')->getAttributeValidationClass('suffix') ?>" <?php echo $this->getFieldParams() ?>>
                        <?php foreach ($this->getSuffixOptions() as $_option): ?>
                            <option value="<?php echo $_option?>"<?php if ($this->getObject()->getSuffix()==$_option):?> selected="selected"<?php endif; ?>><?php echo $this->__($_option)?></option>
                        <?php endforeach; ?>
                </select>
                <?php endif; ?>
            </div>
        </div>
        <?php endif; ?>
</div>
4

1 回答 1

3

您正在谈论的结帐中的此字段是地址属性,而不是客户属性。所以你需要以不同的方式加载它们。对于注册用户,您可以使用Mage::getSingleton('customer/session')->getCustomer()->getLastname2()但它不会保存到您的地址,因为还没有属性。

根据您希望 lastname2 可访问的位置,您可以为实体创建相应的customer_address属性quote_addressorder_address。它们的创建方式与您创建的方式customer相同

$installer->addAttribute($entityName, $attribute_code,  $definition); 

但这还不是全部。要正确转换属性,您需要在模块 config.xml 中设置转换规则。参见例如 的配置Mage_Sales。在global节点中有一个fieldsets具有相应规则的节点。有一个节点customer_address将地址属性转换为引用地址属性。有sales_convert_quote规则将此属性转换为订单属性。

因此,为了让您在所有配置中都可以访问您的属性,应该如下所示:

<global>
   <fieldsets>
      <customer_address>
         <lastname2>
            <to_quote_address>*</to_quote_address>
         </lastname2>
      </customer_address>
      <sales_copy_order_billing_address>
         <lastname2>
            <to_order>*</to_order>
         </lastname2>
       <sales_copy_order_billing_address>
       <sales_copy_order_shipping_address>
         <lastname2>
            <to_order>*</to_order>
         </lastname2>
       </sales_copy_order_shipping_address>
       <sales_convert_quote_address>
           <lastname2>
              <to_order_address>*</to_order_address>
              <to_customer_address>*</to_customer_address>
           </lastname2>
       </sales_convert_quote_address>
       <sales_convert_order_address>
            <lastname2>
               <to_quote_address>*</to_quote_address>
            </lastnam2e>
       <sales_convert_order_address>
       <customer_address>
           <lastname2>
              <to_quote_address>*</to_quote_address>
           </lastname2>
       </customer_address>
   </fieldsets>
</global>
于 2013-11-10T17:45:22.067 回答