magento - 自定义客户属性未保存到数据库(来自前端注册表单)

标签 magento

我在注册表单中添加了 2 个自定义属性,以收集前端客户的输入。

我的问题是前端注册表单中的数据未存储在数据库中。

我在管理区域中为这些字段输入的任何数据都会被存储,但我需要从客户那里收集信息。这是我的代码:

app/code/local/Symphony/Khaos/sql/khaos_setup/mysql4-upgrade-0.1.12-0.1.13.php(是的,我已经尝试过几次纠正这个问题)次;))

<?php 

$installer = $this;

$installer->startSetup();


$installer->addAttribute('customer', 'source', array(
    'input' => 'text',
    'type' => 'varchar',
    'label' => 'Where did you hear about us?',
    'visible' => 1,
    'required' => 0,
    'position' => 1,
    'sort_order' => 80,        
));

$installer->addAttribute('customer', 'practitioner_referrer', array(
    'input' => 'text',
    'type' => 'varchar',
    'label' => 'Referring practitioner',
    'visible' => 1,
    'required' => 0,
    'position' => 1,
    'sort_order' => 80,        
));


$installer->endSetup();

$customer = Mage::getModel('customer/attribute')->loadByCode('customer', 'source');
$forms= array('customer_account_edit', 'customer_account_create', 'adminhtml_customer', 'checkout_register');
$customer->setData('used_in_forms', $forms);
$customer->save(); 

$customer = Mage::getModel('customer/attribute')->loadByCode('customer', 'practitioner_referrer');
$forms= array('customer_account_edit', 'customer_account_create', 'adminhtml_customer', 'checkout_register');
$customer->setData('used_in_forms', $forms);
$customer->save(); 

app/code/local/Symphony/Khaos/Model/Entity/Setup.php

    <?php 
class Symphony_Khaos_Model_Entity_Setup extends Mage_Customer_Model_Entity_Setup
{
    public function getDefaultEntities(){

        return array(

                'source'=>array(
                        'type'=> 'static',
                        'label'=> 'source',
                        'visiable' => true,
                        'required' => false,
                        'sort_order' => 80,
                ),

                'practitioner_referrer'=>array(
                        'type'=> 'static',
                        'label'=> 'practitioner_referrer',
                        'visiable' => true,
                        'required' => false,
                        'sort_order' => 80,
                )

        );
    }
} 

app/code/local/Symphony/Khaos/etc/config.xml

    <?xml version="1.0"?>
<!-- 
/**
 * @category   Symphony
 * @package    Symphony_Khaos
 * @author     ModuleCreator
 * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */
 -->
<config>
    <modules>
        <Symphony_Khaos>
            <version>0.1.13</version>
        </Symphony_Khaos>
    </modules>
    <frontend>
        <routers>
            <khaos>
                <use>standard</use>
                <args>
                    <module>Symphony_Khaos</module>
                    <frontName>khaos</frontName>
                </args>
            </khaos>
        </routers>
        <layout>
            <updates>
                <khaos>
                    <file>khaos.xml</file>
                </khaos>
            </updates>
        </layout>
    </frontend>
    <admin>
        <routers>
            <khaos>
                <use>admin</use>
                <args>
                    <module>Symphony_Khaos</module>
                    <frontName>khaos</frontName>
                </args>
            </khaos>
        </routers>
    </admin>
    <adminhtml>
        <menu>
            <khaos module="khaos">
                <title>Khaos</title>
                <sort_order>71</sort_order>               
                <children>
                    <items module="khaos">
                        <title>Manage Items</title>
                        <sort_order>0</sort_order>
                        <action>khaos/adminhtml_khaos</action>
                    </items>
                </children>
            </khaos>
        </menu>
        <acl>
            <resources>
                <all>
                    <title>Allow Everything</title>
                </all>
                <admin>
                    <children>
                        <Symphony_Khaos>
                            <title>Khaos Module</title>
                            <sort_order>10</sort_order>
                        </Symphony_Khaos>
                    </children>
                </admin>
            </resources>
        </acl>
        <layout>
            <updates>
                <khaos>
                    <file>khaos.xml</file>
                </khaos>
            </updates>
        </layout>
    </adminhtml>   
    <global>
        <models>
            <khaos>
                <class>Symphony_Khaos_Model</class>
                <resourceModel>khaos_mysql4</resourceModel>
            </khaos>
            <khaos_mysql4>
                <class>Symphony_Khaos_Model_Mysql4</class>
                <entities>
                    <khaos>
                        <table>khaos</table>
                    </khaos>
                </entities>
            </khaos_mysql4>
        </models>
        <resources>
            <khaos_setup>
                <setup>
                    <module>Symphony_Khaos</module>
                    <class>Symphony_Khaos_Model_Entity_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </khaos_setup>
            <khaos_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </khaos_write>
            <khaos_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </khaos_read>          
        </resources>
        <blocks>
            <khaos>
                <class>Symphony_Khaos_Block</class>
            </khaos>
        </blocks>
        <helpers>
            <khaos>
                <class>Symphony_Khaos_Helper</class>
            </khaos>
        </helpers>   
        <fieldsets>
            <customer_account>
                <source><create>1</create><update>1</update></source>
                <practitioner_referrer><create>1</create><update>1</update></practitioner_referrer>
            </customer_account>
        </fieldsets>   
    </global>
</config>

app/design/frontend/metabolics/default/template/persistent/checkout/onepage/billing.phtml

<?php
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    design
 * @package     base_default
 * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
/** @var Mage_Checkout_Block_Onepage_Billing $this */
?>
<form id="co-billing-form" action="">
<fieldset>
    <ul class="form-list">
    <?php if ($this->customerHasAddresses()): ?>
        <li class="wide">
            <label for="billing-address-select"><?php echo $this->__('Select a billing address from your address book or enter a new address.') ?></label>
            <div class="input-box">
                <?php echo $this->getAddressesHtmlSelect('billing') ?>
            </div>
        </li>
    <?php endif; ?>
    <li id="billing-new-address-form"<?php if ($this->customerHasAddresses()): ?> style="display:none;"<?php endif; ?>>
        <fieldset>
            <input type="hidden" name="billing[address_id]" value="<?php echo $this->getAddress()->getId() ?>" id="billing:address_id" />
            <ul>
                <li class="fields"><?php echo $this->getLayout()->createBlock('customer/widget_name')->setObject($this->getAddress()->getFirstname() ? $this->getAddress() : $this->getQuote()->getCustomer())->setForceUseCustomerRequiredAttributes(!$this->isCustomerLoggedIn())->setFieldIdFormat('billing:%s')->setFieldNameFormat('billing[%s]')->toHtml() ?></li>
                <li class="fields">
                    <div class="field">
                        <label for="billing:company"><?php echo $this->__('Company') ?></label>
                        <div class="input-box">
                            <input type="text" id="billing:company" name="billing[company]" value="<?php echo $this->escapeHtml($this->getAddress()->getCompany()) ?>" title="<?php echo $this->__('Company') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('company') ?>" />
                        </div>
                    </div>
        <?php if(!$this->isCustomerLoggedIn()): ?>
                    <div class="field">
                        <label for="billing:email" class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
                        <div class="input-box">
                            <input type="text" name="billing[email]" id="billing:email" value="<?php echo $this->escapeHtml($this->getAddress()->getEmail()) ?>" title="<?php echo $this->__('Email Address') ?>" class="input-text validate-email required-entry" />
                        </div>
                    </div>
        <?php endif; ?>
                </li>
        <?php $_streetValidationClass = $this->helper('customer/address')->getAttributeValidationClass('street'); ?>
                <li class="wide">
                    <label for="billing:street1" class="required"><em>*</em><?php echo $this->__('Address') ?></label>
                    <div class="input-box">
                        <input type="text" title="<?php echo $this->__('Street Address') ?>" name="billing[street][]" id="billing:street1" value="<?php echo $this->escapeHtml($this->getAddress()->getStreet(1)) ?>" class="input-text <?php echo $_streetValidationClass ?>" />
                    </div>
                </li>
        <?php $_streetValidationClass = trim(str_replace('required-entry', '', $_streetValidationClass)); ?>
        <?php for ($_i = 2, $_n = $this->helper('customer/address')->getStreetLines(); $_i <= $_n; $_i++): ?>
                <li class="wide">
                    <div class="input-box">
                        <input type="text" title="<?php echo $this->__('Street Address %s', $_i) ?>" name="billing[street][]" id="billing:street<?php echo $_i ?>" value="<?php echo $this->escapeHtml($this->getAddress()->getStreet($_i)) ?>" class="input-text <?php echo $_streetValidationClass ?>" />
                    </div>
                </li>
        <?php endfor; ?>
                <?php if ($this->helper('customer/address')->isVatAttributeVisible()) : ?>
                <li class="wide">
                    <label for="billing:vat_id"><?php echo $this->__('VAT Number') ?></label>
                    <div class="input-box">
                        <input type="text" id="billing:vat_id" name="billing[vat_id]" value="<?php echo $this->escapeHtml($this->getAddress()->getVatId()) ?>" title="<?php echo $this->__('VAT Number') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('vat_id') ?>" />
                    </div>
                </li>
                <?php endif; ?>
                <li class="fields">
                    <div class="field">
                        <label for="billing:city" class="required"><em>*</em><?php echo $this->__('City') ?></label>
                        <div class="input-box">
                            <input type="text" title="<?php echo $this->__('City') ?>" name="billing[city]" value="<?php echo $this->escapeHtml($this->getAddress()->getCity()) ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('city') ?>" id="billing:city" />
                        </div>
                    </div>
                    <div class="field">
                        <label for="billing:region_id" class="required"><em>*</em><?php echo $this->__('State/Province') ?></label>
                        <div class="input-box">
                            <select id="billing:region_id" name="billing[region_id]" title="<?php echo $this->__('State/Province') ?>" class="validate-select" style="display:none;">
                                <option value=""><?php echo $this->__('Please select region, state or province') ?></option>
                            </select>
                            <script type="text/javascript">
                            //<![CDATA[
                                $('billing:region_id').setAttribute('defaultValue',  "<?php echo $this->getAddress()->getRegionId() ?>");
                            //]]>
                            </script>
                            <input type="text" id="billing:region" name="billing[region]" value="<?php echo $this->escapeHtml($this->getAddress()->getRegion()) ?>"  title="<?php echo $this->__('State/Province') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('region') ?>" style="display:none;" />
                        </div>
                    </div>
                </li>
                <li class="fields">
                    <div class="field">
                        <label for="billing:postcode" class="required"><em>*</em><?php echo $this->__('Zip/Postal Code') ?></label>
                        <div class="input-box">
                            <input type="text" title="<?php echo $this->__('Zip/Postal Code') ?>" name="billing[postcode]" id="billing:postcode" value="<?php echo $this->escapeHtml($this->getAddress()->getPostcode()) ?>" class="input-text validate-zip-international <?php echo $this->helper('customer/address')->getAttributeValidationClass('postcode') ?>" />
                        </div>
                    </div>
                    <div class="field">
                        <label for="billing:country_id" class="required"><em>*</em><?php echo $this->__('Country') ?></label>
                        <div class="input-box">
                            <?php echo $this->getCountryHtmlSelect('billing') ?>
                        </div>
                    </div>
                </li>
                <li class="fields">
                    <div class="field">
                        <label for="billing:telephone" class="required"><em>*</em><?php echo $this->__('Telephone') ?></label>
                        <div class="input-box">
                            <input type="text" name="billing[telephone]" value="<?php echo $this->escapeHtml($this->getAddress()->getTelephone()) ?>" title="<?php echo $this->__('Telephone') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('telephone') ?>" id="billing:telephone" />
                        </div>
                    </div>
                    <div class="field">
                        <label for="billing:fax"><?php echo $this->__('Fax') ?></label>
                        <div class="input-box">
                            <input type="text" name="billing[fax]" value="<?php echo $this->escapeHtml($this->getAddress()->getFax()) ?>" title="<?php echo $this->__('Fax') ?>" class="input-text <?php echo $this->helper('customer/address')->getAttributeValidationClass('fax') ?>" id="billing:fax" />
                        </div>
                    </div>
                </li>
                <?php if(!$this->isCustomerLoggedIn()): ?>

        <?php $_dob = $this->getLayout()->createBlock('customer/widget_dob') ?>
        <?php $_gender = $this->getLayout()->createBlock('customer/widget_gender') ?>
            <?php if ($_dob->isEnabled() || $_gender->isEnabled()): ?>
                <li class="fields">
                <?php if ($_dob->isEnabled()): ?>
                    <div class="field">
                        <?php echo $_dob->setDate($this->getQuote()->getCustomerDob())->setFieldIdFormat('billing:%s')->setFieldNameFormat('billing[%s]')->toHtml() ?>
                    </div>
                <?php endif; ?>
                <?php if ($_gender->isEnabled()): ?>
                    <div class="field">
                        <?php echo $_gender->setGender($this->getQuote()->getCustomerGender())->setFieldIdFormat('billing:%s')->setFieldNameFormat('billing[%s]')->toHtml() ?>
                    </div>
                <?php endif ?>
                </li>
            <?php endif ?>

            <?php if ($this->isTaxvatEnabled()):?>
                <li><?php echo $this->getTaxvatHtml() ?></li>
            <?php endif; ?>

            <div class="fieldset">
            <ul class="form-list">
                <li class="fields">
                    <div class="field">
                        <label for="source" class="required"><em>*</em><?php echo $this->__('Where did you hear about us?') ?></label>
                        <div class="input-box">
                            <input type="text" name="source" id="source" title="<?php echo $this->__('source') ?>" class="input-text required-entry" />
                        </div>
                    </div>
                    <div class="field">
                        <label for="practitioner_referrer"><?php echo $this->__('Were you referrered by a practitioner, if so, who?') ?></label>
                        <div class="input-box">
                            <input type="text" name="practitioner_referrer" id="practitioner_referrer" title="<?php echo $this->__('practitioner_referrer') ?>" class="input-text" />
                        </div>
                    </div>
                </li>
            </ul>
        </div>

                <li class="fields" id="register-customer-password">
                    <div class="field">
                        <label for="billing:customer_password" class="required"><em>*</em><?php echo $this->__('Password') ?></label>
                        <div class="input-box">
                            <input type="password" name="billing[customer_password]" id="billing:customer_password" title="<?php echo $this->__('Password') ?>" class="input-text required-entry validate-password" />
                        </div>
                    </div>
                    <div class="field">
                        <label for="billing:confirm_password" class="required"><em>*</em><?php echo $this->__('Confirm Password') ?></label>
                        <div class="input-box">
                            <input type="password" name="billing[confirm_password]" title="<?php echo $this->__('Confirm Password') ?>" id="billing:confirm_password" class="input-text required-entry validate-cpassword" />
                        </div>
                    </div>
                </li>
                <?php echo $this->getChildHtml('persistent.remember.me'); ?>
                <?php endif; ?>
                <?php if ($this->isCustomerLoggedIn() && $this->customerHasAddresses()):?>
                    <li class="control">
                        <input type="checkbox" name="billing[save_in_address_book]" value="1" title="<?php echo $this->__('Save in address book') ?>" id="billing:save_in_address_book" onchange="if(window.shipping) shipping.setSameAsBilling(false);"<?php if ($this->getAddress()->getSaveInAddressBook()):?> checked="checked"<?php endif;?> class="checkbox" /><label for="billing:save_in_address_book"><?php echo $this->__('Save in address book') ?></label>
                    </li>
                <?php else:?>
                    <li class="no-display"><input type="hidden" name="billing[save_in_address_book]" value="1" /></li>
                <?php endif; ?>
                <?php echo $this->getChildHtml('form.additional.info'); ?>
            </ul>
            <?php echo $this->getChildHtml('persistent.remember.me.tooltip'); ?>
        </fieldset>
     </li>
    <?php if ($this->canShip()): ?>
        <li class="control">
            <input type="radio" name="billing[use_for_shipping]" id="billing:use_for_shipping_yes" value="1"<?php if ($this->isUseBillingAddressForShipping()) {?> checked="checked"<?php }?> title="<?php echo  $this->__('Ship to this address') ?>" onclick="$('shipping:same_as_billing').checked = true;" class="radio" /><label for="billing:use_for_shipping_yes"><?php echo  $this->__('Ship to this address') ?></label></li>
        <li class="control">
            <input type="radio" name="billing[use_for_shipping]" id="billing:use_for_shipping_no" value="0"<?php if (!$this->isUseBillingAddressForShipping()) {?> checked="checked"<?php }?> title="<?php echo $this->__('Ship to different address') ?>" onclick="$('shipping:same_as_billing').checked = false;" class="radio" /><label for="billing:use_for_shipping_no"><?php echo $this->__('Ship to different address') ?></label>
        </li>
    <?php endif; ?>
    </ul>
    <?php if (!$this->canShip()): ?>
        <input type="hidden" name="billing[use_for_shipping]" value="1" />
    <?php endif; ?>
    <div class="buttons-set" id="billing-buttons-container">
        <p class="required"><?php echo $this->__('* Required Fields') ?></p>
        <button type="button" title="<?php echo $this->__('Continue') ?>" class="button" onclick="billing.save()"><span><span><?php echo $this->__('Continue') ?></span></span></button>
        <span class="please-wait" id="billing-please-wait" style="display:none;">
            <img src="<?php echo $this->getSkinUrl('images/opc-ajax-loader.gif') ?>" alt="<?php echo $this->__('Loading next step...') ?>" title="<?php echo $this->__('Loading next step...') ?>" class="v-middle" /> <?php echo $this->__('Loading next step...') ?>
        </span>
    </div>
</fieldset>
</form>
<script type="text/javascript">
//<![CDATA[
    var billing = new Billing('co-billing-form', '<?php echo $this->getUrl('checkout/onepage/getAddress') ?>address/', '<?php echo $this->getUrl('checkout/onepage/saveBilling') ?>');
    var billingForm = new VarienForm('co-billing-form');

    //billingForm.setElementsRelation('billing:country_id', 'billing:region', '<?php echo $this->getUrl('directory/json/childRegion') ?>', '<?php echo $this->__('Select State/Province...') ?>');
    $('billing-address-select') && billing.newAddress(!$('billing-address-select').value);

    var billingRegionUpdater = new RegionUpdater('billing:country_id', 'billing:region', 'billing:region_id', <?php echo $this->helper('directory')->getRegionJson() ?>, undefined, 'billing:postcode');
    if ($('onepage-guest-register-button')) {
        Event.observe($('onepage-guest-register-button'), 'click', function(event) {
            var billingRememberMe = $('co-billing-form').select('#remember-me-box');
            if (billingRememberMe.length > 0) {
                if ($('login:guest') && $('login:guest').checked) {
                    billingRememberMe[0].hide();
                } else if ($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
                    billingRememberMe[0].show();
                }
            }
        });
    }
//]]>
</script>

非常感谢任何帮助。

亲切的问候,

詹姆斯

最佳答案

您的解决方案很好,它接近可行的解决方案,但它缺少一些最后的润色。

请注意,客户可以通过两种方式进行注册 - 通过“注册”链接或在结帐期间进行注册。您仅提供了结帐流程的模板代码,因此我仅讨论它。 “注册”链接的实现更加简单,并且似乎在上面已经提供的文章中进行了很好的描述:http://www.fontis.com.au/blog/magento/know-more-about-your-customers-adding-custom-signup-attributes

好的,关于结帐。当前解决方案的问题是:

  1. 输入的名称错误。应该是billing[<attribute_name>]
  2. 数据需要在结账过程中存储在某个地方(新列 需要报价表)并在下订单时保存到客户资料中 (需要字段集规则)

让我们来解决这些问题。

模板文件的修复很简单 - 只需重命名输入,它们应该是:

...

<input type="text" name="billing[source]" id="source" title="<?php echo 
$this->__('source') ?>" class="input-text required-entry" />

...

<input type="text" name="billing[practitioner_referrer]" id="practitioner_referrer"
title="<?php echo $this->__('practitioner_referrer') ?>" class="input-text" />

...

这将使 Magento 在预期的位置找到输入的数据。

正确的 sql 文件(即mysql4-upgrade-0.1.12-0.1.13.php)应如下所示:

$installer->startSetup();

$installer->getConnection()->addColumn(
    $installer->getTable('sales/quote'),
    'customer_source',
    array(
        'type'      => Varien_Db_Ddl_Table::TYPE_TEXT,
        'length'    => '64K',
        'comment'   => 'Customer Source'
    )
);

$installer->getConnection()->addColumn(
    $installer->getTable('sales/quote'),
    'customer_practitioner_referrer',
    array(
        'type'      => Varien_Db_Ddl_Table::TYPE_TEXT,
        'length'    => '64K',
        'comment'   => 'Customer Practitioner Referrer'
    )
);

$installer->addAttribute('customer', 'source', array(
    'input' => 'text',
    'type' => 'varchar',
    'label' => 'Where did you hear about us?',
    'visible' => 1,
    'required' => 0,
    'position' => 1,
    'sort_order' => 80
));

$installer->addAttribute('customer', 'practitioner_referrer',
    array(
        'input' => 'text',
        'type' => 'varchar',
        'label' => 'Referring practitioner',
        'visible' => 1,
        'required' => 0,
        'position' => 1,
        'sort_order' => 80
    )
);

$installer->endSetup();

$customer = Mage::getModel('customer/attribute')->loadByCode('customer', 'source');
$forms= array('customer_account_edit', 'customer_account_create', 'adminhtml_customer', 'checkout_register');
$customer->setData('used_in_forms', $forms);
$customer->save();

$customer = Mage::getModel('customer/attribute')->loadByCode('customer', 'practitioner_referrer');
$forms= array('customer_account_edit', 'customer_account_create', 'adminhtml_customer', 'checkout_register');
$customer->setData('used_in_forms', $forms);
$customer->save();

在该文件中,我们不仅创建客户属性,还创建报价表中的相应列,在结帐过程中输入的值将存储在其中。

字段集应包含将客户数据转换为报价数据的规则,反之亦然。这就是 config.xml 的样子:

<?xml version="1.0"?>
<!--
/**
 * @category   Symphony
 * @package    Symphony_Khaos
 * @author     ModuleCreator
 * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */
 -->
<config>
    <modules>
        <Symphony_Khaos>
            <version>0.1.13</version>
        </Symphony_Khaos>
    </modules>
    <frontend>
        <routers>
            <khaos>
                <use>standard</use>
                <args>
                    <module>Symphony_Khaos</module>
                    <frontName>khaos</frontName>
                </args>
            </khaos>
        </routers>
        <layout>
            <updates>
                <khaos>
                    <file>khaos.xml</file>
                </khaos>
            </updates>
        </layout>
    </frontend>
    <admin>
        <routers>
            <khaos>
                <use>admin</use>
                <args>
                    <module>Symphony_Khaos</module>
                    <frontName>khaos</frontName>
                </args>
            </khaos>
        </routers>
    </admin>
    <adminhtml>
        <menu>
            <khaos module="khaos">
                <title>Khaos</title>
                <sort_order>71</sort_order>
                <children>
                    <items module="khaos">
                        <title>Manage Items</title>
                        <sort_order>0</sort_order>
                        <action>khaos/adminhtml_khaos</action>
                    </items>
                </children>
            </khaos>
        </menu>
        <acl>
            <resources>
                <all>
                    <title>Allow Everything</title>
                </all>
                <admin>
                    <children>
                        <Symphony_Khaos>
                            <title>Khaos Module</title>
                            <sort_order>10</sort_order>
                        </Symphony_Khaos>
                    </children>
                </admin>
            </resources>
        </acl>
        <layout>
            <updates>
                <khaos>
                    <file>khaos.xml</file>
                </khaos>
            </updates>
        </layout>
    </adminhtml>
    <global>
        <models>
            <khaos>
                <class>Symphony_Khaos_Model</class>
                <resourceModel>khaos_mysql4</resourceModel>
            </khaos>
            <khaos_mysql4>
                <class>Symphony_Khaos_Model_Mysql4</class>
                <entities>
                    <khaos>
                        <table>khaos</table>
                    </khaos>
                </entities>
            </khaos_mysql4>
        </models>
        <resources>
            <khaos_setup>
                <setup>
                    <module>Symphony_Khaos</module>
                    <class>Mage_Customer_Model_Entity_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </khaos_setup>
            <khaos_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </khaos_write>
            <khaos_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </khaos_read>
        </resources>
        <blocks>
            <khaos>
                <class>Symphony_Khaos_Block</class>
            </khaos>
        </blocks>
        <helpers>
            <khaos>
                <class>Symphony_Khaos_Helper</class>
            </khaos>
        </helpers>
        <fieldsets>
            <customer_account>
                <source><to_quote>customer_source</to_quote></source>
                <practitioner_referrer><to_quote>customer_practitioner_referrer</to_quote></practitioner_referrer>
            </customer_account>
            <checkout_onepage_quote>
                <customer_source><to_customer>source</to_customer></customer_source>
                <customer_practitioner_referrer><to_customer>practitioner_referrer</to_customer></customer_practitioner_referrer>
            </checkout_onepage_quote>
        </fieldsets>
    </global>
</config>

注意两件事:

  • <create><update>指令已被删除,因为它们是 结帐注册不需要。您可以将它们添加回来,如果 你需要它们。
  • 自定义设置模型 Symphony_Khaos_Model_Entity_Setup 已被删除,取而代之的是 Mage_Customer_Model_Entity_Setup 。这 客户设置模型足以完成所有任务。该文件与 自定义设置模型可能会被完全删除。您可以退回定制的 模型,如果您需要它来执行其他任务。

瞧 - 就是这样!这些修复将使客户在结帐注册期间看到两个附加字段。提交订单时,数据将保存到他的个人资料中。

但是,该实现并不是最好的,因为它是基于该方法的,该方法有一些缺点。该方法需要将数据存储在 Quote 表中,而这些数据条目与 Quote 模型无关。他们只是将其用作交通工具。另外,将来添加新属性将需要做太多工作 - 必须对 sql 文件、配置和模板进行修改。

正确的方法是构建一个更抽象的实现。该解决方案应将属性数据存储在 EAV 或自定义表中,并根据需要通过观察到的事件将它们添加到客户/报价模型中。模板应显示属性的通用列表,可能为需要特殊设计的属性提供特殊的渲染模型。

但是对于只有 2 个属性,您的方法就很好。

祝您与 Magento 的进一步合作顺利:)

关于magento - 自定义客户属性未保存到数据库(来自前端注册表单),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13479365/

相关文章:

ios - 使用 magento SOAP API 的 multicall 方法的正确方法是什么?

url - 由于可能的配置错误,请求超出了 10 个内部重定向的限制

magento - 在Magento中传输/迁移整个目录

mysql - 将 Magento 1.3 数据迁移/替换为 maganeto 1.6

xml - 在主题中扩展 Magento 小部件布局

javascript - Magento 表单验证仅适用于组中的最后一个复选框

Magento - 从名称获取国家/地区 ID - 有更简单/更快的方法吗?

mysql 添加复合主键约束

Magento 2 : Issue with Paypal Payment from outside India

java - 通过 API 进行 Magento 客户身份验证