一个Magento 1.4升级1.7的项目中,系统管理员反映客户在重置密码时出现问题,系统显示了一个致命错误,如下所示。很明显,在AccountController控制器文件中,在一个未定义对象上调用了setCustomerId()方法。
Fatal error: Call to a member function setCustomerId() on a non-object in /var/www/websites/jivity/app/code/core/Mage/Customer/controllers/AccountController.php on line xxx
根据这个错误提示,先是找到该控制器文件调用setCustomerId()方法具体位置,看到了如下的代码片段。可以发现,该方法是实例化一个resetpassword的block类之后调用的。通过提示,我们可以大概判断,问题就出现在该Block类的实例化上。很有可能该类根本就不存在了。
public function resetPasswordAction()
{
...
$this->getLayout()->getBlock('resetPassword')
->setCustomerId($customerId)
->setResetPasswordLinkToken($resetPasswordLinkToken);
...
}
既然这里调用了block,系统肯定在layout文件中有相关定义,然而非常有意思的是,在Magento 1.4版本Customer的布局文件中,根本就不存在customer_account_resetpassword句柄。这意味这Magento 1.7版本重置密码添加了一个全新的页面来实现的。那么,只需要将1.7版本中该句柄的内容复制到1.4版本即可修复该bug。即将如下内容,复制到app/design/frontend/default/当前使用模板/layout/customer.xml里即可。
<customer_account_resetpassword translate="label">
<label>Reset a Password</label>
<remove name="right"/>
<remove name="left"/>
<reference name="head">
<action method="setTitle" translate="title" module="customer">
<title>Reset a Password</title>
</action>
</reference>
<reference name="root">
<action method="setTemplate">
<template>page/1column.phtml</template>
</action>
<action method="setHeaderTitle" translate="title" module="customer">
<title>Reset a Password</title>
</action>
</reference>
<reference name="content">
<block type="customer/account_resetpassword" name="resetPassword" template="customer/form/resetforgottenpassword.phtml"/>
</reference>
</customer_account_resetpassword>
|