Magento: Captcha zum benutzerdefinierten Kontaktformular hinzufügen


7

Ich habe ein neues benutzerdefiniertes Kontaktformular auf der Magento-Website erstellt. Ich versuche, am Ende ein Captcha hinzuzufügen.

Ich habe zu app / code / core / Mage / Captcha / etc / config.xml hinzugefügt

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

Und ich habe zu app / design / frontend / base / default / layout / captcha.xml hinzugefügt

    <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>

Und ich habe meinem Formular diesen Code hinzugefügt:

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

Und ich habe diesen Code hinzugefügt, um das Captcha anzuzeigen:

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

Dann habe ich Captcha unter Konfiguration> Kundenkonfiguration> CAPTCHA aktiviert und "Benutzerdefiniertes Kontaktformular" und dann "Anzeigemodus" auf "Immer" gewählt.

Aber ich habe das Captcha noch nicht in meinem benutzerdefinierten Formular erhalten.

Ich hoffe ich war klar

Vielen Dank


Antworten:


13

NameSpace: MyPackage und Modul: MyModule

Modulkonfiguration

Speicherort: app / etc / modules / MyPackage_MyModule.xml

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

Erstellen Sie eine Konfigurationsdatei für dieses Modul

Speicherort: 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>

Erstellen Sie dafür einen Beobachter

Speicherort: 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];
    }
}

Erstellen Sie eine local.xml für Ihr aktives Thema im Layoutordner.

<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>

Kopieren Sie nun Kontakte / form.phtml nach mymodule / Kontakte / form.phtml und fügen Sie <?php echo $this->getChildHtml('form.additional.info'); ?>Ihre Anforderung hinzu. Beispiel...

<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>

Cache leeren. Gehen Sie nun zu System -> Konfiguration -> Kundenkonfiguration -> Captcha . Wählen Sie Kontaktseite und Speichern.


Für welche Version (en) von Magento wurde diese Lösung entwickelt? ... war es für Magento 1.9. *
Jonathan Marzullo

Super - danke. Arbeitete für mich am 1.8.1.0
Erfan

Dies hat bei mir nicht funktioniert, da Sie den Magier-Captcha-Block erweitern müssen, um HTML in Ihr Formular zu bringen. Dieser Link hat mir geholfen: atwix.com/magento/captcha-in-magento
Kresimir Pendic

3

Keine Antwort auf Ihre Frage, aber Sie sollten sich HoneySpam ansehen . Es werden andere Techniken zur Vermeidung von Spam verwendet, die Kunden nicht stören.


Ich stimme dem zu. Ich habe HoneySpam verwendet und war mit den Ergebnissen zufrieden.
Marius

1

wie ich unten getan habe. Für mich geht das.

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>

controller.php in Submit-Aktion (wo Ihr Formular gesendet wurde)

//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

Genießen Sie es funktioniert super.


1

Die Lösung von Sohel Rana hat funktioniert, außer dass im ersten XML ein </ config> -Tag fehlt.

Andere Dinge zu beachten ist, dass Captcha auch in der Systemkonfiguration aktiviert sein muss.

Das Kontaktformular sollte über die URL / Kontakte und nicht über einen CMS-Seiteninhalt mit {{block}} eingerichtet sein. Der CMS-Inhalt {{block}} kann nicht mit dem XML-Layout aktualisiert werden, um das Captcha einzufügen.


0

Wenn Sie die Kernfunktion von Captcha im Kontaktformular verwenden möchten, müssen Sie ein Modul in Ihrem lokalen Verzeichnis entwickeln. Hier ist "Compny" mein Namespace und "Captcha" ist der Modulname

Erstellen Sie zunächst die Modulkonfigurationsdatei Compny_Captcha.xml in app / etc / modules /

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

Erstellen Sie die Datei module config.xml in app / code / local / Compny / Captcha / etc / 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>

Hier können Sie das Kern-Captcha-Modell überschreiben, da Captcha nach der Kundenanmeldung nicht angezeigt wird, wenn Sie Captcha nach der Kundenanmeldung anzeigen möchten. Daher müssen Sie die Funktion Mage_Captcha_Model_Zend überschreiben. Die Funktion _isUserAuth () erstellt die Datei Zend.php in app / code / local / Compny / 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();*/
}

}

In dieser Funktion müssen Sie nur den Funktionscode kommentieren.

Erstellen Sie nun das Frontend-Layout, das Sie benötigen, um contacts.xml in app / design / frontend / default / default / layout / contacts.xml zu bearbeiten. Hier müssen Sie den Captcha-Block unter hinzufügen

<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>

Danach müssen Sie den Block in der Datei frontend form.phtml in app / design / frontend / default / default / template / kontakt / form.phtml aufrufen. Geben Sie einfach die folgende Zeile ein, bevor Sie das </ul>Tag abschließen

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

Jetzt müssen Sie die Kontakt-Controller-Erstellungsdatei in app / code / local / Compny / Captcha / controller / IndexController.php überschreiben

<?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];
}

}

Jetzt ist das Captcha-Modul zum Testen bereit.

Um Captcha im Kontaktformular anzuwenden, gehen Sie zu Ihrem Admin-Panel-Einstellungssystem- > Konfiguration-> Kundenkonfiguration-> Captcha. Aktivieren Sie Captcha. Wenn es deaktiviert ist, sehen Sie "Kontaktformular" im Formularbereich für Mehrfachauswahl. Wählen Sie es aus und speichern Sie die Konfiguration. Sehen Sie Ihr Captcha im Frontend.


@SINHI S, ich habe genau das gesagt, aber leider wird es nicht einmal in der Konfiguration angezeigt. Ich bin sicher, ich habe etwas falsch gemacht. Ich weiß nicht, wie ich es erklären soll. Ich hoffe, ich kann Ihnen zeigen, wie ich es gemacht habe. Danke
Khalil

Können Sie überprüfen, ob Sie alle Ordner mit dem richtigen Namen erstellt haben?
SIBHI S

Melden Sie sich dann vom Administrator ab und erneut beim Administrator an, versuchen Sie, den Cache zu
leeren

Ich habe genau die gleichen Ordnernamen erstellt und mich vom Administrator abgemeldet und angemeldet. Trotzdem werden dieselben Optionen angezeigt: Benutzer erstellen, Anmelden, Kennwort vergessen, Als Gast auschecken und Während des Auscheckens registrieren und der neue wird nicht angezeigt
Khalil

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.