3

我以为我已经整理好了,但我遇到了障碍。我想在客户注册表单中添加一个“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.phpextractData()丢弃输入字段。我对 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>
4

1 回答 1

3

一种更独立的处理方式可能是在相关控制器操作 () 之前注册一个观察者,controller_action_predispatch_*以检测您的表单字段是否已被填充,如果是,则将它们重定向出去以防止本机操作处理请求。

于 2012-04-18T22:13:19.323 回答