Модуль Magento 1.7 Captcha

В новом выпуске Magento параметры капчи в "Система-> Конфигурации-> Конфигурация клиента-> Капча" я создал новую форму под названием "Signmeup"... но, похоже, она не работает. У меня проблемы с тем, чтобы показать это:

<?php echo Mage::getSingleton('core/layout')
->createBlock('captcha/captcha_zend')
->setFormId('signmeup')
->setImgWidth(230)
->setImgHeight(50)
->setTemplate('captcha/zend.phtml')
->toHtml();?>

Сейчас этот блок не отображается на странице. (Не динамическая страница... статическая страница с основной загрузкой Mage) Вот скриншот того, о чем я говорю:

2 ответа

После нахождения кода captcha.xml в сети (которого по какой-то причине не было на моем предприятии), я создал captcha.xml и вставил этот код в папку макета.

Затем я убедился, что все это было включено в admin > Config > Customer config..

Я должен был добавить файлы phtml, которые я хотел, чтобы капча показывала:

echo $this->getChildHtml('form.additional.info');  (in php brackets.)

Как только я это сделал, все было показано и работоспособно.

Я смог сделать это, создав небольшой модуль, который добавляет модуль родной капчи в форму обзора продукта. Модуль состоит из нескольких файлов:

app/code/local/MyCompany/MyCaptcha/etc/config.xml
app/code/local/MyCompany/MyCaptcha/Model/Observer.php
app/etc/modules/MyCompany_MyCaptcha.xml
app/design/frontend/default/default/layout/mycaptcha.xml

Добавьте следующий код в файл шаблона (.phtml), содержащий форму, в которую вы хотите добавить капчу:

<?php echo $this->getLayout()->createBlock('captcha/captcha')
->setFormId('your_form_id')
->setImgWidht(230)
->setImgHeight(50)
->toHtml();
?>

замените "your_form_id" на то, что вы хотите.
В config.xml:

<config>
    <modules>
        <MyCompany_MyCaptcha>
            <version>1.0.0</version>
        </MyCompany_MyCaptcha>
    </modules>
    <frontend>
        <layout>
            <updates>
                <mycaptcha> <!-- should be some unique name -->
                    <file>mycaptcha.xml</file>
                </mycaptcha>
            </updates>
        </layout>
    </frontend>
    <!--  Now we need to add our observer. I attached mine to the 
controller_action_predispatch_review_product_post event because 
I needed to intercept product review post event. The event you 
attach your observer to will be different depending on what you're 
trying to do. -->
    <global>
        <events>
            <controller_action_predispatch_review_product_post>
                <observers>
                    <mycaptcha> <!-- these need to match -->
                        <class>MyCompany_MyCaptcha_Model_Observer</class>
                        <method>myMethod</method>
                    </mycaptcha>
                </observers>
            </controller_action_predispatch_review_product_post>
        </events>
    </global>
    <!-- Now we add our form label that will show in configuration and allow
us to turn the captcha on or off. -->
    <default>
        <captcha>
            <frontend>
                <areas>
                    <mycaptcha> <!-- these need to match -->
                        <label>My Captcha</label>
                    </mycaptcha>
                </areas>
            </frontend>
        </captcha>
    </default>
</config>

Вот и все для config.xml
Теперь давайте добавим нашего наблюдателя. Следующий код взят из http://mustakarhu.com/blog/magento-captcha-extension-ajax/ и только слегка изменен, так что выкрикивайте его.

<?php
/**
* Break the execution in case of incorrect CAPTCHA  
*
* @param Varien_Event_Observer $observer
* @return Cbad_Captcha_Model_Observer
*/

class MyModule_MyCaptcha_Model_Observer extends Mage_Captcha_Model_Observer
{

 public function myMethod($observer) { // called in config.xml
    $formId = 'your_form_id'; // you will change this value
    $captchaModel = Mage::helper('captcha')->getCaptcha($formId);
    $controller = $observer->getControllerAction();
    $request = $controller->getRequest();
    if ($captchaModel->isRequired()) {

        $request->getPost(Mage_Captcha_Helper_Data::INPUT_NAME_FIELD_VALUE);
        if (!$captchaModel->isCorrect($this->_getCaptchaString($request, $formId))) {

            if((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')) {
                // Is ajax
                $action = $request->getActionName();
                Mage::app()->getFrontController()->getAction()->setFlag(
                        $action, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);

                $controller->getResponse()->setHttpResponseCode(200);
                $controller->getResponse()->setHeader('Content-type', 'application/json');

                $controller->getResponse()->setBody(json_encode(
                        array(
                            "msg" => Mage::helper('captcha')->__('Incorrect CAPTCHA.')
                        )
                    ));

            } else {
               // Is form submit
                Mage::getSingleton('customer/session')
                    ->addError(Mage::helper('captcha')->__('Incorrect CAPTCHA.'));
                $controller->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
                Mage::getSingleton('customer/session')
                    ->setCustomerFormData($controller->getRequest()->getPost());
                $controller->getResponse()->setRedirect(Mage::getUrl('*/*'));
            }
        }
    }

    return $this;
  }
}
?>

Большая часть работы не в пути. Я оставлю MyCompany_MyCaptcha.xml для вас, чтобы вы могли разобраться самостоятельно (это невероятно просто).
На mycaptcha.xml:

<?xml version="1.0"?>
<layout version="0.1.0">
<catalog_product_view>
        <reference name="head">
            <action method="addJs"><file>mage/captcha.js</file></action>
        </reference>
</catalog_product_view>
</layout>

Этот макет XML добавляет необходимый Javascript в раздел заголовка на странице продукта. Вам нужно будет изменить дескриптор макета (catalog_product_view) на любую страницу, на которой будет находиться ваша форма.
Надеюсь, я достаточно подробно рассказал обо всем, и кто-то сможет адаптировать это к своим потребностям.

Некоторые другие ресурсы на эту тему:

Другие вопросы по тегам