Magento:カスタムのお問い合わせフォームにキャプチャを追加する


7

Magentoのウェブサイトで新しいカスタム連絡先フォームを作成しました。その最後にキャプチャを追加しようとしています。

app / code / core / Mage / Captcha / etc / config.xmlに追加しました

                <customcontacts>
                    <label>Custom Contact Form</label>
                </customcontacts>

そしてapp / design / frontend / base / default / layout / captcha.xmlに追加しました

    <customcontacts>
    <reference name="customcontacts">
        <block type="core/text_list" name="form.additional.info">
            <block type="captcha/captcha" name="captcha">
                <reference name="head">
                    <action method="addJs"><file>mage/captcha.js</file></action>
                </reference>
                <action method="setFormId"><formId>customcontacts</formId></action>
                <action method="setImgWidth"><width>230</width></action>
                <action method="setImgHeight"><width>50</width></action>
            </block>
        </block>
    </reference>
</customcontacts>

そして、私は私のフォームにこのコードを追加しました:

<script type="text/javascript">
//<![CDATA[
$('form-validate-captcha').captcha.refresh($('catpcha-reload'));
//]]>

そして、私はキャプチャを表示するためにこのコードを追加しました:

<div><?php echo $this->getChildHtml('captcha'); ?></div>

次に、[構成]> [顧客の構成]> [キャプチャ]でキャプチャを有効にし、[カスタムの連絡先フォーム]を選択してから、[表示モード]を[常に]に設定します。

しかし、まだカスタムフォームでキャプチャを取得していません。

私は明確だったと思います

ありがとう


回答:


13

NameSpace:MyPackageおよびモジュール:MyModule

モジュール構成

場所:app / etc / modules / MyPackage_MyModule.xml

<config>
<modules>
    <MyPackage_MyModule>
        <active>true</active>
        <codePool>local</codePool>
    </MyPackage_MyModule>
</modules>

このモジュールの構成ファイルを作成します

場所:app / code / local / MyPackage / MyModule / etc / config.xml

<config>
<modules>
    <MyPackage_MyModule>
        <version>0.0.0.1</version>
    </MyPackage_MyModule>
</modules>
<global>
    <models>
        <mymodule>
            <class>MyPackage_MyModule_Model</class>
        </mymodule>
    </models>
    <events>
        <controller_action_predispatch_contacts_index_post>
            <observers>
                <mymodule>
                    <class>mymodule/observer</class>
                    <method>checkContacts</method>
                </mymodule>
            </observers>
        </controller_action_predispatch_contacts_index_post>
    </events>
</global>
<default>
    <captcha>
        <frontend>
            <areas>
                <contacts>
                    <label>Contacts Page</label>
                </contacts>
            </areas>
        </frontend>
    </captcha>
    <customer>
        <captcha>
            <always_for>
                <contacts>1</contacts>
            </always_for>
        </captcha>
    </customer>
</default>

そのためのオブザーバーを作成します

場所:app / code / local / MyPackage / MyModule / Model / Observer.php

class MyPackage_MyModule_Model_Observer
{
    public function checkContacts($observer){
        $formId = 'contacts';
        $captchaModel = Mage::helper('captcha')->getCaptcha($formId);
        if ($captchaModel->isRequired()) {
            $controller = $observer->getControllerAction();
            $word = $this->_getCaptchaString($controller->getRequest(), $formId);
            if (!$captchaModel->isCorrect($word)) {
                Mage::getSingleton('customer/session')->addError(Mage::helper('captcha')->__('Incorrect CAPTCHA.'));
                $controller->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
                $url =  Mage::getUrl('contacts');
                $controller->getResponse()->setRedirect($url);
            }
        }
        return $this;
    }
    /**
     * Get Captcha String
     *
     * @param Varien_Object $request
     * @param string $formId
     * @return string
     */
    protected function _getCaptchaString($request, $formId)
    {
        $captchaParams = $request->getPost(Mage_Captcha_Helper_Data::INPUT_NAME_FIELD_VALUE);
        return $captchaParams[$formId];
    }
}

レイアウトフォルダー内のアクティブなテーマにlocal.xmlを作成します。

<layout version="0.1.0">
<contacts_index_index>
    <reference name="contactForm">
        <action method="setTemplate"><template>mymodule/contacts/form.phtml</template></action>
        <block type="core/text_list" name="form.additional.info">
            <block type="captcha/captcha" name="captcha">
                <reference name="head">
                    <action method="addJs"><file>mage/captcha.js</file></action>
                </reference>
                <action method="setFormId"><formId>contacts</formId></action>
                <action method="setImgWidth"><width>230</width></action>
                <action method="setImgHeight"><width>50</width></action>
            </block>
        </block>
    </reference>
</contacts_index_index>

次に、contacts / form.phtmlをmymodule / contacts / form.phtmlにコピーし<?php echo $this->getChildHtml('form.additional.info'); ?>、要件を追加します。例...

<li class="wide">
            <label for="comment" class="required"><em>*</em><?php echo Mage::helper('contacts')->__('Comment') ?></label>
            <div class="input-box">
                <textarea name="comment" id="comment" title="<?php echo Mage::helper('contacts')->__('Comment') ?>" class="required-entry input-text" cols="5" rows="3"></textarea>
            </div>
        </li>
        <?php echo $this->getChildHtml('form.additional.info'); ?>
    </ul>

キャッシュの消去。次に、システム->構成->お客様の構成->キャプチャに移動します。連絡先ページを選択して保存します。


このソリューションが作成されたMagentoのバージョンは何ですか?... Magento 1.9でした。*
Jonathan Marzullo 2014

素晴らしいです、ありがとう。1.8.1.0で私のために働いた
Erfan

:あなたが得るHTMLにMAGEキャプチャブロックを拡張する必要があるため、これはあなたのフォームに...このリンクは、私を助け、私のために働いていなかったatwix.com/magento/captcha-in-magento
Kresimir Pendic


1

私は以下のようにしています。わたしにはできる。

layout.xml

<reference name="content">
    <block type="customer/form_register" name="multivendor_customer_form_register" template="multivendor/form/register.phtml">
        <action method="setShowAddressFields"><value>true</value></action>
        <block type="page/html_wrapper" name="multivendor.customer.form.register.fields.before" as="multivendor_form_fields_before" translate="label">
            <label>Form Fields Before</label>
        </block>


        <!-- Code Start For Display Captcha on Register page -->
        <block type="captcha/captcha" name="captcha">
                <reference name="head">
                    <action method="addJs"><file>mage/captcha.js</file></action>
                </reference>
                <action method="setFormId"><formId>vendor_form</formId></action>
                <action method="setImgWidth"><width>230</width></action>
                <action method="setImgHeight"><width>50</width></action>
        </block> 
        <!-- Code End For Display Captcha on Register page-->


    </block>
</reference>

form.phtml

<div class="field">
    <?php echo $this->getChildHtml('captcha'); ?>
</div>

submit。アクションのcontroller.php(フォームが送信された場所)

//Captcha Checking Start
$formId = 'vendor_form';
$captchaModel = Mage::helper('captcha')->getCaptcha($formId);
if ($captchaModel->isRequired()) {
    $captchaModel = Mage::helper('captcha')->getCaptcha($formId);
    if ($captchaModel->isRequired()) {
        if (!$captchaModel->isCorrect($this->_getCaptchaString($this->getRequest(), $formId))) {
            Mage::getSingleton('core/session')->addError(Mage::helper('captcha')->__('Incorrect CAPTCHA.'));
            $this->_redirectReferer('');
            return;
        }
    }
}
//Captcha Checking End

素晴らしい作品をお楽しみください。


1

最初のXMLに</ config>タグがないことを除いて、Sohel Ranaによるソリューションが機能しました。

その他の注意点として、システム構成でもCaptchaをオンにする必要があります。

お問い合わせフォームには、{{block}}が設定されたCMSページコンテンツではなく、/ contacts URLを介してアクセスする必要があります。CMSコンテンツ{{block}}は、キャプチャを挿入するためのXMLレイアウトで更新できません。


0

コアキャプチャ機能を使用したい場合は、ローカルディレクトリでモジュールを開発する必要があります。ここで、「Compny」は私の名前空間であり、「Captcha」はモジュール名です

まず最初にapp / etc / modules /にモジュール設定ファイルCompny_Captcha.xmlを作成します

<?xml version=”1.0″?>
<config>
<modules>
<Compny_Captcha>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Captcha/>
</depends>
</Compny_Captcha>
</modules>
</config>

app / code / local / Compny / Captcha / etc / config.xmlにモジュールconfig.xmlファイルを作成します

<?xml version=”1.0″?>

<config>
<modules>
<Compny_Captcha>
<version>1.8.0.0.0</version>
</Compny_Captcha>
</modules>
<global>
<models>
<captcha>
<rewrite>
<zend>Compny_Captcha_Model_Zend</zend>
</rewrite>
</captcha>
</models>
</global>
<default>
<captcha  translate=”label”>
<frontend>
<areas>
<contact_us>
<label>Contact us Form</label>
</contact_us>
</areas>
</frontend>
</captcha>

<customer>
<captcha>
<always_for>
<contact_us>1</contact_us>
</always_for>
</captcha>
</customer>
</default>
<frontend>
<routers>
<contacts>
<args>
<modules>
<Compny_captcha before=”Mage_Contacts”>Compny_Captcha</Compny_captcha>
</modules>
</args>
</contacts>
</routers>
</frontend>
</config>

ここでは、顧客のログイン後にcaptchaを表示する場合、顧客のログイン後にcaptchaが表示されず、Mage_Captcha_Model_Zend file _isUserAuth()関数を上書きする必要があるため、コアcaptchaモデルを上書きできます。 /Model/Zend.php

<?php

class Compny_Captcha_Model_Zend extends Mage_Captcha_Model_Zend
{

protected function _isUserAuth()
{
//die(‘function called’);
/* return Mage::app()->getStore()->isAdmin()
? Mage::getSingleton(‘admin/session’)->isLoggedIn()
: Mage::getSingleton(‘customer/session’)->isLoggedIn();*/
}

}

この関数では、関数コードのみコメントする必要があります。

次に、app / design / frontend / default / default / layout / contacts.xmlでcontacts.xmlを編集する必要があるフロントエンドレイアウトを作成します。ここにcaptchaブロックを追加する必要があります

<reference name=”content”>
<block type=”core/template” name=”contactForm” template=”contacts/form.phtml”>

<block type=”core/text_list” name=”form.additional.info”>
<block type=”captcha/captcha” name=”captcha”>
<reference name=”head”>
<action method=”addJs”><file>mage/captcha.js</file></action>
</reference>
<action method=”setFormId”><formId>contact_us</formId></action>
<action method=”setImgWidth”><width>230</width></action>
<action method=”setImgHeight”><width>50</width></action>
</block>
</block>

</block>
</reference>

その後、app / design / frontend / default / default / template / contacts / form.phtmlのフロントエンドform.phtmlファイルのブロックを呼び出す必要があります。</ul>タグを完成させる前に、以下の行を挿入するだけです。

<?php echo $this->getChildHtml(‘form.additional.info’); ?>

今度は、app / code / local / Compny / Captcha / controllers / IndexController.phpにあるコントローラー作成ファイルをオーバーライドする必要があります。

<?php
require_once(Mage::getModuleDir(‘controllers’,’Mage_Contacts’).DS.’IndexController.php’);
class Compny_Captcha_IndexController extends Mage_Contacts_IndexController
{

public function postAction()
{
$post = $this->getRequest()->getPost();
if ( $post ) {
$translate = Mage::getSingleton(‘core/translate’);
/* @var $translate Mage_Core_Model_Translate */
$translate->setTranslateInline(false);
try {
$postObject = new Varien_Object();
$postObject->setData($post);

$error = false;

if (!Zend_Validate::is(trim($post['name']) , NotEmpty’)) {
$error = true;
}

if (!Zend_Validate::is(trim($post['comment']) , NotEmpty’)) {
$error = true;
}

if (!Zend_Validate::is(trim($post['email']), EmailAddress’)) {
$error = true;
}

if (Zend_Validate::is(trim($post['hideit']), NotEmpty’)) {
$error = true;
}

$formId =’contact_us’;
$captchaModel = Mage::helper(‘captcha’)->getCaptcha($formId);
if ($captchaModel->isRequired()) {
if (!$captchaModel->isCorrect($this->_getCaptchaString($this->getRequest(), $formId))) {
Mage::getSingleton(‘customer/session’)->addError(Mage::helper(‘captcha’)->__(‘Incorrect CAPTCHA.’));
$this->setFlag(”, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
Mage::getSingleton(‘customer/session’)->setCustomerFormData($this->getRequest()->getPost());
$this->getResponse()->setRedirect(Mage::getUrl(‘*/*/’));
return;
}
}

if ($error) {
throw new Exception();
}
$mailTemplate = Mage::getModel(‘core/email_template’);
/* @var $mailTemplate Mage_Core_Model_Email_Template */
$mailTemplate->setDesignConfig(array(‘area => frontend’))
->setReplyTo($post['email'])
->sendTransactional(
Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE),
Mage::getStoreConfig(self::XML_PATH_EMAIL_SENDER),
Mage::getStoreConfig(self::XML_PATH_EMAIL_RECIPIENT),
null,
array(‘data => $postObject)
);

if (!$mailTemplate->getSentSuccess()) {
throw new Exception();
}

$translate->setTranslateInline(true);

Mage::getSingleton(‘customer/session’)->addSuccess(Mage::helper(‘contacts’)->__(‘Your inquiry was submitted and will be responded to as soon as possible. Thank you for contacting us.’));
$this->_redirect(‘*/*/’);

return;
} catch (Exception $e) {
$translate->setTranslateInline(true);

Mage::getSingleton(‘customer/session’)->addError(Mage::helper(‘contacts’)->__(‘Unable to submit your request. Please, try again later’));
$this->_redirect(‘*/*/’);
return;
}

} else {
$this->_redirect(‘*/*/’);
}
}

protected function _getCaptchaString($request, $formId)
{
$captchaParams = $request->getPost(Mage_Captcha_Helper_Data::INPUT_NAME_FIELD_VALUE);
return $captchaParams[$formId];
}

}

これでcaptchaモジュールをテストする準備が整いました。

お問い合わせフォームでキャプチャを適用するには、管理パネルの設定システム->設定->お客様の設定->キャプチャにアクセスして キャプチャを無効にします。フロントエンドでキャプチャを確認してください。


@SINHI Sは、私はまったく同じと述べましたが、残念ながらそれもコンフィギュレーションに表示されていない、私は私が説明するの鍬を知らない私は何か間違っていたと確信して、私はありがとう、私はそれを行っているかをお見せすることを願って
ハリル14

確認できますか。正しい名前ですべてのフォルダを作成しましたか。
SIBHI S 14

次に、管理者からログアウトし、もう一度管理者にログインして、キャッシュをフラッシュしてキャッシュをクリアしてください...
SIBHI S 14

私はまったく同じフォルダ名を使用し、ログアウトして管理者からログインしましたが、同じオプションが表示されます:ユーザーの作成、ログイン、パスワードを忘れた、ゲストとしてチェックアウト、チェックアウト中に登録、新しいものは表示されません
Khalil

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.