마 젠토 2-맞춤 양식에 보안 문자를 추가하는 방법


28

양식 제출이 포함 된 사용자 정의 모듈을 개발 중입니다. 보안 문자를 추가하고 싶습니다. 또한 보안 문자가 등록 양식의 보안 문자와 일치하도록 Magento 기본 보안 문자 라이브러리를 사용하려고합니다.

답변:


35

magento 보안 문자를 사용자 정의 모듈에 사용하려면 몇 가지 단계를 수행해야합니다.

1 단계 : Vendor/Module/etc/config.xml

<? xml version = "1.0"?>
<config xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance"xsi : noNamespaceSchemaLocation = "urn : magento : module : Magento_Store : etc / config.xsd">
    <기본>
        <고객>
            <보안 문자>
                <shown_to_logged_in_user>
                    <custom_form> 1 </ custom_form>
                </ shown_to_logged_in_user>
                <항상 _for>
                    <custom_form> 1 </ custom_form>
                </ always_for>
            </ captcha>
        </ 고객>
        <captcha translate = "label">
            <프런트 엔드>
                <지역>
                    <custom_form>
                        <label> 맞춤 양식 </ label>
                    </ custom_form>
                </ areas>
            </ frontend>
        </ captcha>
    </ default>
</ config>

2 단계 : ' 관리-> 상점-> 구성-> 고객-> 고객 구성-> 보안 문자 '로 이동하여 구성하십시오. 새 양식 값 '사용자 정의 양식'을 볼 수 있습니다

3 단계 : 생성 Vendor/Module/view/frontend/layout/yourroutid_index_index.xml

<? xml version = "1.0"?>
<page xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance"layout = "1column"xsi : noNamespaceSchemaLocation = "urn : magento : framework : View / Layout / etc / page_configuration.xsd">
    <헤드>
        <title> 맞춤 양식 </ title>
    </ head>
    <본체>
        <referenceContainer name = "content">
            <block class = "Vendor \ Module \ Block \ CaptchaForm"name = "contactForm"template = "Vendor_Module :: captchaform.phtml">
                <container name = "form.additional.info"label = "양식 추가 정보">
                    <block class = "Magento \ Captcha \ Block \ Captcha"name = "captcha"after = "-"cacheable = "false">
                        <action method = "setFormId">
                            <argument name = "formId"xsi : type = "string"> custom_form </ argument>
                        </ action>
                        <action method = "setImgWidth">
                            <argument name = "width"xsi : type = "string"> 230 </ argument>
                        </ action>
                        <action method = "setImgHeight">
                            <argument name = "width"xsi : type = "string"> 50 </ argument>
                        </ action>
                    </ block>
                </ container>
            </ block>
        </ referenceContainer>
        <referenceBlock name = "head.components">
            <block class = "Magento \ Framework \ View \ Element \ Js \ Components"name = "captcha_page_head_components"template = "Magento_Captcha :: js / components.phtml"/>
        </ referenceBlock>
    </ body>
</ page>

4 단계 : Vendor/Module/Block/CaptchaForm.php

네임 스페이스 Vendor \ Module \ Block;


CaptchaForm 클래스는 \ Magento \ Framework \ View \ Element \ Template을 확장합니다.
{
    공용 함수 getFormAction ()
    {
        return $ this-> getUrl ( 'yourroute / index / post', [ '_secure'=> true]);
    }
}

5 단계 : Vendor/Moduel/view/frontend/templates/captchaform.phtml

<form class = "양식 연락처"
      action = "<? php / * @escapeNotVerified * / echo $ block-> getFormAction ();?>"
      id = "contact-form"
      method = "post"
      data-hasrequired = "<? php / * @escapeNotVerified * / echo __ ( '* 필수 필드')?>"
      data-mage-init = '{ "확인": {}}'>
    <fieldset class = "fieldset">
        <legend class = "legend"> <span> <? php / * @escapeNotVerified * / echo __ ( 'Write Us')?> </ span> </ legend> <br />

        <div class = "필드 이름 필요">
            <label class = "label"for = "name"> <span> <? php / * @escapeNotVerified * / echo __ ( 'Name')?> </ span> </ label>
            <div class = "control">
                <input name = "name"id = "name"title = "<? php / * @escapeNotVerified * / echo __ ( 'Name')?>"value = ""class = "input-text"type = "text" data-validate = "{필수 : true}"/>
            </ div>
        </ div>
        <div class = "필드 이메일 필요">
            <label class = "label"for = "email"> <span> <? php / * @escapeNotVerified * / echo __ ( 'Email')?> </ span> </ label>
            <div class = "control">
                <input name = "email"id = "email"title = "<? php / * @escapeNotVerified * / echo __ ( 'Email')?>"value = ""class = "input-text"type = "email" data-validate = "{필수 : true, 'validate-email': true}"/>
            </ div>
        </ div>
        <? php echo $ block-> getChildHtml ( 'form.additional.info'); ?>
    </ fieldset>
    <div class = "actions-toolbar">
        <div class = "primary">
            <input type = "hidden"name = "hideit"id = "hideit"value = ""/>
            <button type = "submit"title = "<? php / * @escapeNotVerified * / echo __ ( 'Submit')?>"class = "action submit primary">
                <span> <? php / * @escapeNotVerified * / echo __ ( 'Submit')?> </ span>
            </ button>
        </ div>
    </ div>
</ form>

이제 양식에 보안 문자를 볼 수 있습니다. 이제 관찰자를 사용하여 보안 문자를 검증해야합니다. 따라서 유효성 검사를 위해 포스트 컨트롤러 프리 디스패치 이벤트를 사용합니다.

6 단계 : Vendor/Module/etc/frontend/events.xml

<? xml version = "1.0"?>
<config xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance"xsi : noNamespaceSchemaLocation = "urn : magento : framework : Event / etc / events.xsd">
    <event name = "controller_action_predispatch_yourroute_index_post">
        <observer name = "captcha_custom_form"instance = "Vendor \ Module \ Observer \ CheckCustomFormObserver"/>
    </ event>
</ config>

7 단계 : Vendor/Module/Observer/CheckCustomFormObserver.php

네임 스페이스 Vendor \ Module \ Observer;

Magento \ Framework \ Event \ ObserverInterface를 사용하십시오.
Magento \ Framework \ App \ Request \ DataPersistorInterface를 사용하십시오.
Magento \ Framework \ App \ ObjectManager를 사용하십시오.
Magento \ Captcha \ Observer \ CaptchaStringResolver를 사용하십시오.

CheckCustomFormObserver 클래스는 ObserverInterface를 구현합니다.
{
    / **
     * @var \ Magento \ Captcha \ Helper \ Data
     * /
    보호 된 $ _helper;

    / **
     * @var \ Magento \ Framework \ App \ ActionFlag
     * /
    보호 된 $ _actionFlag;

    / **
     * @var \ Magento \ Framework \ Message \ Manager 인터페이스
     * /
    보호 된 $ messageManager;

    / **
     * @var \ Magento \ Framework \ App \ Response \ RedirectInterface
     * /
    보호 된 $ 리디렉션;

    / **
     * @var CaptchaStringResolver
     * /
    보호 된 $ captchaStringResolver;

    / **
     * @var DataPersistorInterface
     * /
    개인 $ dataPersistor;

    / **
     * @param \ Magento \ Captcha \ Helper \ Data $ helper
     * @param \ Magento \ Framework \ App \ ActionFlag $ actionFlag
     * @param \ Magento \ Framework \ Message \ Manager 인터페이스 $ messageManager
     * @param \ Magento \ Framework \ App \ Response \ RedirectInterface $ redirect
     * @param CaptchaStringResolver $ captchaStringResolver
     * /
    공공 함수 __construct (
        \ Magento \ Captcha \ Helper \ Data $ helper,
        \ Magento \ Framework \ App \ ActionFlag $ actionFlag,
        \ Magento \ Framework \ Message \ ManagerInterface $ messageManager,
        \ Magento \ Framework \ App \ Response \ RedirectInterface $ redirect,
        CaptchaStringResolver $ captchaStringResolver
    ) {
        $ this-> _ helper = $ helper;
        $ this-> _ actionFlag = $ actionFlag;
        $ this-> messageManager = $ messageManager;
        $ this-> redirect = $ redirect;
        $ this-> captchaStringResolver = $ captchaStringResolver;
    }

    / **
     * 사용자 지정 양식에서 보안 문자 확인
     *
     * @param \ Magento \ Framework \ Event \ Observer $ observer
     * @return void
     * /
    공용 함수 실행 (\ Magento \ Framework \ Event \ Observer $ observer)
    {
        $ formId = 'custom_form';
        $ captcha = $ this-> _ helper-> getCaptcha ($ formId);
        if ($ captcha-> isRequired ()) {
            / ** @var \ Magento \ Framework \ App \ Action \ Action $ controller * /
            $ controller = $ observer-> getControllerAction ();
            if (! $ captcha-> isCorrect ($ this-> captchaStringResolver-> resolve ($ controller-> getRequest (), $ formId))) {
                $ this-> messageManager-> addError (__ ( '잘못된 CAPTCHA.'));
                $ this-> getDataPersistor ()-> set ($ formId, $ controller-> getRequest ()-> getPostValue ());
                $ this-> _ actionFlag-> set ( '', \ Magento \ Framework \ App \ Action \ Action :: FLAG_NO_DISPATCH, true);
                $ this-> redirect-> redirect ($ controller-> getResponse (), 'yourroute / index / index');
            }
        }
    }

    / **
     * 데이터 Persistor 가져 오기
     *
     * @return DataPersistorInterface
     * /
    개인 함수 getDataPersistor ()
    {
        if ($ this-> dataPersistor === null) {
            $ this-> dataPersistor = ObjectManager :: getInstance ()
                -> get (DataPersistorInterface :: class);
        }

        $ this-> dataPersistor를 반환합니다;
    }
}

매우 상세합니다. 나는 그것을 시도 할 것이다.
Paul

@Sohel Rana 제품 리뷰 양식에 추가하는 방법
supriya mishra

@supriyamishra 확인해야합니다
Sohel Rana

1
안녕하세요 보안 문자가 표시되지만 관찰자 controller_action_predispatch _ **는이 보안 문자의 유효성이 검사되지 않아 작동하지 않는 것 같습니다
AbdulBasit

1
위의 오류를 해결했지만 내 사용자 지정 양식에서 보안 문자를 볼 수 없습니다
jafar pinjar

1

이것이 작동하지 않는 사람들을 위해 내가 한 일을해야 할 수도 있습니다.

보안 문자가 표시되지 않는 이유는 기본 설정이 _toHtml의 보안 문자가 필요한지 확인하는 기본 보안 문자 블록을 사용하기 때문입니다.

보안 문자가 항상 표시되도록 설정 한 경우이 문제가 발생하지 않았을 수도 있지만 항상 보안 문자를 표시하도록 설정되어 있지 않고 필요한 보안 문자 (예 : 계정 만들기 / 로그인 등)를 항상 표시하지 않으려는 경우 맞춤 보안 문자의 논리 만 "항상 필요"로 설정하십시오.

vendor / magento / module-captcha / Block / Captcha / DefaultCaptcha.php의 69 행에 다음이 표시됩니다.

    /**
 * Renders captcha HTML (if required)
 *
 * @return string
 */
protected function _toHtml()
{

    if ($this->getCaptchaModel()->isRequired()) {
        $this->getCaptchaModel()->generate();
        return parent::_toHtml();
    }
    return '';
}

$this->getCaptchaModel()통화 $this->_captchaData->getCaptcha()에있는 벤더 / 젠토 / 모듈 CAPTCHA / 헬퍼 / Data.php

    /**
 * Get Captcha
 *
 * @param string $formId
 * @return \Magento\Captcha\Model\CaptchaInterface
 */
public function getCaptcha($formId)
{
    if (!array_key_exists($formId, $this->_captcha)) {
        $captchaType = ucfirst($this->getConfig('type'));
        if (!$captchaType) {
            $captchaType = self::DEFAULT_CAPTCHA_TYPE;
        } elseif ($captchaType == 'Default') {
            $captchaType = $captchaType . 'Model';
        }

        $this->_captcha[$formId] = $this->_factory->create($captchaType, $formId);
    }
    return $this->_captcha[$formId];
}

여기서 getCaptcha 메소드는 렌더링 할 캡차 유형에 대한 구성 값을 확인하고 다음과 같이 팩토리를로드합니다. $this->_factory->create()

그러나이 팩토리 클래스에 들어 서면

 public function create($captchaType, $formId)
{
    $className = 'Magento\Captcha\Model\\' . ucfirst($captchaType);

    $instance = $this->_objectManager->create($className, ['formId' => $formId]);
    if (!$instance instanceof \Magento\Captcha\Model\CaptchaInterface) {
        throw new \InvalidArgumentException(
            $className . ' does not implement \Magento\Captcha\Model\CaptchaInterface'
        );
    }
    return $instance;
}

여기서 문제는 어떤 팩토리 모델에 대해서도 팩토리가 Magento Captcha 모듈에서 어떤 모양으로 보일지에 대한 것입니다.

우리는 헬퍼를 감싸고 폼 키를 확인하기 위해 플러그인을 만들어야하며 폼 키가 사용되는 경우 \ Magento \ Captcha \ Model \ DefaultModel 을 확장 하고 재정의 하는 모델을로드하는 새로운 팩토리 클래스를 만들어야합니다 isRequired () 메소드 다음과 같은 것 :

에서 \ 사용자 \ 모듈 \ 등 \ di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

<!--Custom Captcha-->
<type name="\Magento\Captcha\Helper\Data">
    <plugin name="custom-captcha" type="Your\Module\Plugin\Helper\CaptchaData" />
</type>

에서 귀하의 \ 모듈 \ 플러그인 \ 도우미 \ CaptchaData

<?php

namespace Your\Module\Plugin\Helper;

class CaptchaData
{
protected $_captcha = [];

public function __construct(
    \Your\Module\Model\CaptchaFactory $captchaFactory
) {
    $this->captchaFactory = $captchaFactory;
}

/**
 * @param \Magento\Captcha\Helper\Data $subject
 * @param \Closure $proceed
 * @param $formId
 * @return mixed
 */
public function aroundGetCaptcha(\Magento\Captcha\Helper\Data $subject, \Closure $proceed, $formId)
{
    if ($formId == 'your_form_key') {
        $this->_captcha[$formId] = $this->captchaFactory->create();
        return $this->_captcha[$formId];

    }
    return $proceed($formId);

}

}

에서 귀하의 \ 모듈 \ 모델 \ CaptchaFactory \

<?php
/**
* Captcha model factory
*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Your\Module\Model;

class CaptchaFactory
{
/**
 * @var \Magento\Framework\ObjectManagerInterface
 */
protected $_objectManager;

/**
 * @param \Magento\Framework\ObjectManagerInterface $objectManager
 */
public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager)
{
    $this->_objectManager = $objectManager;
}

/**
 * Get captcha instance
 *
 * @param string $captchaType
 * @param string $formId
 * @return \Magento\Captcha\Model\CaptchaInterface
 * @throws \InvalidArgumentException
 */
public function create()
{
    $instance = $this->_objectManager->create('Your\Module\Model\Captcha', ['formId' => 'event_subscriber']);
    if (!$instance instanceof \Magento\Captcha\Model\CaptchaInterface) {
        throw new \InvalidArgumentException(
            'Your\Module\Model\Captcha does not implement \Magento\Captcha\Model\CaptchaInterface'
        );
    }
    return $instance;
}
}

그리고 마지막으로 모델을 무시하는 모델은 \ Your \ Module \ Model \ Captcha의 필수 매개 변수입니다 .

<?php

namespace Your\Module\Model;

class Captcha extends \Magento\Captcha\Model\DefaultModel
{
    public function isRequired($login = null)
    {
        return true;
    }
 }

0

뉴스 레터 구독자 페이지에 보안 문자가 필요합니다. sohan i 뉴스 레터 관찰자 및 뉴스 레터 페이지의 보안 문자 작업이 사용되었습니다.

1) app / code / Vendorname / Modulename / etc / config.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
    <default>
        <customer>
            <captcha>
                <shown_to_logged_in_user>
                    <custom_newsletter>1</custom_newsletter>
                </shown_to_logged_in_user>
                <always_for>
                    <custom_newsletter>1</custom_newsletter>
                </always_for>
            </captcha>
        </customer>
        <captcha translate="label">
            <frontend>
                <areas>
                    <custom_newsletter>
                        <label>Newsletter Form</label>
                    </custom_newsletter>
                </areas>
            </frontend>
        </captcha>
    </default>
</config>

2) '관리-> 상점-> 구성-> 고객-> 고객 구성-> 보안 문자'로 이동하여 구성하십시오. 새 양식 값 '뉴스 레터 양식'을 볼 수 있습니다.

3) 테마로 레이아웃 파일 복사 (default.xml)

<block class="Magento\Newsletter\Block\Subscribe" name="subscribe form " template="Magento_Newsletter::subscribe.phtml">
                <container name="form.additional.info" label="Form Additional Info">
                    <block class="Magento\Captcha\Block\Captcha" name="captcha" after="-" cacheable="false">
                        <action method="setFormId">
                            <argument name="formId" xsi:type="string">custom_newsletter</argument>
                        </action>
                        <action method="setImgWidth">
                            <argument name="width" xsi:type="string">230</argument>
                        </action>
                        <action method="setImgHeight">
                            <argument name="width" xsi:type="string">50</argument>
                        </action>
                    </block>
                </container>

4) 관찰자 생성-> app / code / Vendorname / Modulename / etc / frontend에서 event.xml 파일 생성

 <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="controller_action_predispatch_newsletter_subscriber_new">
        <observer name="captcha_newletter_form" instance="Vendorname/Modulename/Observer\CheckCustomFormObserver" />
    </event>
</config>

5) 옵저버 모델 생성 및 보안 문자 앱 / 코드 / 공급 업체 이름 / 모듈 이름 /Observer/CheckCustomFormObserver.php 확인

public function execute(\Magento\Framework\Event\Observer $observer)
        {   $formId = 'custom_newsletter';
            $captcha = $this->_helper->getCaptcha($formId);
            if ($captcha->isRequired()) {
                /** @var \Magento\Framework\App\Action\Action $controller */
                $controller = $observer->getControllerAction();
                $params=$controller->getRequest()->getPost();
                $currentpage = $params['currentpage'];


                if (!$captcha->isCorrect($this->captchaStringResolver->resolve($controller->getRequest(), $formId))) {                
                    $this->messageManager->addError(__('Incorrect CAPTCHA.'));
                    $this->getDataPersistor()->set($formId, $controller->getRequest()->getPostValue());
                    $this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
                    $this->redirect->redirect($controller->getResponse(), $currentpage);
                }
            }
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.