我以为我已经整理好了,但我遇到了障碍。我想在客户注册表单中添加一个“Honey Pot”,对于那些不熟悉这种技术的人来说,这种技术涉及使用 CSS 隐藏文本输入,并假设普通机器人想要填写它。然而,人类不会看到这个字段,所以它需要验证为空。
在 Magento 中,我创建了一个新模块,将以下内容添加到 config.xml:
<global>
<fieldsets>
<customer_account>
<honeytrap><create>1</create><update>1</update></honeytrap>
</customer_account>
</fieldsets>
<models>
<customer>
<rewrite>
<customer>MyStore_Honeytrap_Model_Customer</customer>
</rewrite>
</customer>
</models>
</global>
然后,我在 validate 函数中添加了一些额外的内容来检查该字段是否为空。据我所知,这一切都是正确的,但大约line 278
在从请求中的发布数据AccountController.php
中extractData()
丢弃输入字段。我对 Magento 还是很陌生,所以也希望在这里学到一些东西,但是我如何防止该领域被剥夺职位extractData()
?
我想我只是想知道我错过了什么,我已经在互联网上阅读了一些关于添加自定义字段的帖子,据我所知这应该可以工作,但也许我错过了一些东西,因为我没有包括实体设置,因为我不需要将此字段保存在数据库中,它纯粹是为了验证注册是否来自人(尽可能)。
感谢您的帮助,我确定这可能是我错过的一些荒谬的事情。
编辑:感谢@gordon-knoppe 关于使用事件的指针:
public function check_trap(Varien_Event_Observer $observer)
{
$event = $observer->getEvent();
$post = $event->getControllerAction()->getRequest()->getPost();
// Check Honeytrap is empty
if (Zend_Validate::is( trim($post['fname']) , 'NotEmpty'))
{
$customerHelper = Mage::helper('customer');
$error = $customerHelper->__('A problem has occured with your registration.');
Mage::getModel('customer/session')->addError($error);
Mage::app()->getResponse()
->setRedirect(Mage::getUrl('customer/account', array('_secure' => true)))
->sendResponse();
exit;
}
}
有了这个config.xml
:
<events>
<controller_action_predispatch_customer_account_createpost>
<observers>
<mystore_honeytrap_observer>
<type>singleton</type>
<class>Mystore_Honeytrap_Model_Observer</class>
<method>check_trap</method>
</mystore_honeytrap_observer>
</observers>
</controller_action_predispatch_customer_account_createpost>
</events>