【问题标题】:Magento - observer error - "Customer email is required"Magento - 观察者错误 - “需要客户电子邮件”
【发布时间】:2014-05-09 15:58:22
【问题描述】:

我有以下 Magento 观察者,它在执行“checkout_controller_onepage_save_shipping_method”时处于活动状态,例如当用户结账并点击“运输方式”上的提交时

我的观察者函数如下所示:

public function afterShippingMethod($observer)
{
    $org_id = Mage::getSingleton('customer/session')->getCustomerOrganisationId(); // always a number eg. 12345
    Mage::getSingleton('customer/session')->getCustomer()->setOrganisationId($org_id)->save();
}

这个函数在正确的时间运行,但给了我一个 Magento 错误:

There has been an error processing your request
Customer email is required

显然错误中需要电子邮件地址,但由于客户已在“帐单信息”阶段输入了电子邮件地址,我不明白为什么会得到这个?

这是堆栈跟踪:

Trace:
#0 /vagrant/site.com/public_html/app/code/core/Mage/Customer/Model/Resource/Customer.php(76): Mage::exception('Mage_Customer', 'Customer email ...')
#1 /vagrant/site.com/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php(1122): Mage_Customer_Model_Resource_Customer->_beforeSave(Object(Mage_Customer_Model_Customer))
#2 /vagrant/site.com/public_html/app/code/core/Mage/Core/Model/Abstract.php(318): Mage_Eav_Model_Entity_Abstract->save(Object(Mage_Customer_Model_Customer))
#3 /vagrant/site.com/public_html/app/code/local/site/Raptor/Model/Raptor/Observer.php(25): Mage_Core_Model_Abstract->save()
#4 /vagrant/site.com/public_html/app/code/core/Mage/Core/Model/App.php(1338): site_Raptor_Model_Raptor_Observer->afterShippingMethod(Object(Varien_Event_Observer))
#5 /vagrant/site.com/public_html/app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(site_Raptor_Model_Raptor_Observer), 'afterShippingMe...', Object(Varien_Event_Observer))
#6 /vagrant/site.com/public_html/app/Mage.php(447): Mage_Core_Model_App->dispatchEvent('checkout_contro...', Array)
#7 /vagrant/site.com/public_html/app/code/core/Mage/Checkout/controllers/OnepageController.php(389): Mage::dispatchEvent('checkout_contro...', Array)
#8 /vagrant/site.com/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Checkout_OnepageController->saveShippingMethodAction()
#9 /vagrant/site.com/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('saveShippingMet...')
#10 /vagrant/site.com/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#11 /vagrant/site.com/public_html/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#12 /vagrant/site.com/public_html/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#13 /vagrant/site.com/public_html/en-us/index.php(87): Mage::run('en_us', 'store')

堆栈跟踪中的实际错误是 Customer\Model\Resource\Customer.php 中的以下内容

   if (!$customer->getEmail()) {
        throw Mage::exception('Mage_Customer', Mage::helper('customer')->__('Customer email is required'));
    }

这个错误的一切都很自我解释,但我不知道如何将组织 ID 保存到这个客户对象 - 有什么想法吗?

任何想法为什么会发生这种情况以及如何修复错误?

【问题讨论】:

  • 我认为您不必保存()给客户。你只需要设置你的 id。让我知道它是否有效
  • 谢谢,虽然这在这种情况下没有帮助,但我显然做错了什么,只是无法理解

标签: magento frameworks magento-1.7 observers


【解决方案1】:

我认为这仅适用于新客户或客人。看看您如何在Mage_Customer_Model_Session::getCustomer() 中检索客户。如果客户没有 id,您将得到一个没有数据的空客户对象。计费信息步骤中的数据尚未保存到数据库中,因此此时没有电子邮件地址。

由于在最后一个结帐步骤中生成了新客户,因此在创建订单时,必须在请求之间存储客户信息。这是在报价表中完成的。因此,您必须为 organization_id 添加另一个报价属性,以便可以将其存储到生成客户为止。为了将 organization_id 从报价转换为客户,需要在模块 config.xml 中添加一些 XML 配置:

<global>
   <fieldsets>
      <checkout_onepage_quote>
         <organisation_id>
            <to_customer>organisation_id</to_customer>
         </organisation_id>
      </checkout_onepage_quote>
   </fieldsets>
</global>

更多参考请见Mage_Checkout_Model_Type_Onepage::saveOrder():

/**
* Create order based on checkout type. Create customer if necessary.
*
* @return Mage_Checkout_Model_Type_Onepage
*/
public function saveOrder()
{
$this->validate();
$isNewCustomer = false;
switch ($this->getCheckoutMethod()) {
    case self::METHOD_GUEST:
        $this->_prepareGuestQuote();
        break;
    case self::METHOD_REGISTER:
        $this->_prepareNewCustomerQuote();
        $isNewCustomer = true;
        break;
    default:
        $this->_prepareCustomerQuote();
        break;
}

对于新客户,字段转换发生在

Mage_Checkout_Model_Type_Onepage::_prepareNewCustomerQuote() 与此行:

Mage::helper('core')->copyFieldset('checkout_onepage_quote', 'to_customer', $quote, $customer);

【讨论】:

  • 这听起来像个问题——我必须将自定义的“organisation_id”属性保存到这个客户对象中——在这个阶段是否有办法在单页结账时实现这一点?
  • 你能确认 Mage::helper 行应该添加到哪里吗?我不会修改核心吧?
  • 您不必添加它。我刚刚解释了 magento 工作流程。
  • 哦,我看到了欢呼声! Magento 有时过于复杂 :) 干杯
  • 您对新客户/客人的看法是正确的 - 当我尝试在已经登录的情况下执行相同的过程时,我没有收到“需要客户电子邮件”错误。但是,如果未登录(例如访客/新客户),同样的“需要电子邮件”问题仍然存在。
【解决方案2】:

试试这个:

public function afterShippingMethod($observer){
    $customer=Mage::getSingleton('customer/session');
    $orgId=$customer->getCustomerOrganisationId();
    $customer->getCustomer()->
    setOrganisationId($orgId)->save();
}

【讨论】:

  • @Zabs - $customer-&gt;getCustomer()-&gt;setOrganisationId($orgId)-&gt;setEmail($customer_email)save();
  • 您好我有同样的问题。我在哪里可以试试你的代码?表示哪个文件
  • @MahmoodRehman - 在课堂上 checkout_controller_onepage_save_shipping_method
【解决方案3】:

结帐时触发一个事件:'sales_convert_quote_to_order'

可以在任何模块的 config.xml 中配置此事件,如下所示:

   <events>
        <sales_convert_quote_to_order>
           <observers>
               <MODULE_sales_convert_quote_to_order>
                    <type>singleton</type>
                    <class>MODULE_Model_Observer</class>
                    <method>saveCohorts</method>
               </MODULE_sales_convert_quote_to_order>
           </observers>
        </sales_convert_quote_to_order>
    </events>

检查模块,也许你能找到问题

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    相关资源
    最近更新 更多