私はこれを分類したと思っていましたが、問題が発生しました。顧客登録フォームに「ハニーポット」を追加したいのですが、この手法に慣れていない場合は、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>