AccountControllerオーバーライドが新しいアクションで機能せず、302リダイレクトを行う


7

アドオンnew actionしてみますAccountController

今:AccountControllerは適切にオーバーライドされます

しかしいつでも hit new Action (ajaxLoginPostAction) is redirect to 302.

preDispatch()関数のオープンアクションとしてajaxLoginPost()を追加しますが、till is not works.

ここに config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!--
@author Amit Bera 
-->
<config>
    <modules>
        <Bluehorse_Ajaxlogin>
            <version>1.0.0</version>
        </Bluehorse_Ajaxlogin>
    </modules>
    <!-- rewrite Accont Controller -->
    <frontend>
        <routers>
            <customer>
                <args>
                    <modules>
                        <ajaxlogin before="Mage_Customer">Bluehorse_Ajaxlogin</ajaxlogin>
                    </modules>
                </args>
            </customer>
        </routers>
            <layout>
            <updates>
                <ajaxlogin>
                    <file>ajaxlogin.xml</file>
                </ajaxlogin>
            </updates>
        </layout>
      </frontend>
      <global>
          <blocks>
              <ajaxlogin>
                  <class>Bluehorse_Ajaxlogin_Block</class>
              </ajaxlogin>
          </blocks>
          <helpers>
              <ajaxlogin>
                  <class>Bluehorse_Ajaxlogin_Helper</class>
              </ajaxlogin>
          </helpers>
      </global>
</config>

AccountController.php

<?php
/* @ Purpose  ajax login
 * @ Author Amit Bera<amit.bera@bluehorse.in>
 * @ Module Bluehorse_Ajaxlogin
*/
require_once Mage::getModuleDir('controllers', 'Mage_Customer').DS.'AccountController.php';
class Bluehorse_Ajaxlogin_AccountController extends Mage_Customer_AccountController{

   /*   Add new Action 
    */
    protected $_cookieCheckActions = array('loginPost', 'createpost','ajaxLoginPost');
   protected $defaultOpenActionList=
        array(
            'create',
            'login',
            'logoutsuccess',
            'forgotpassword',
            'forgotpasswordpost',
            'resetpassword',
            'resetpasswordpost',
            'confirm',
            'confirmation',
           'loginPost', 
           'createpost'
        );

    protected  $newOpenActionList= array(
            'ajaxloginPost'

        );




    /* Check customer authentication for some actions */
    public function preDispatch() {

         $currenAction=$this->getRequest()->getActionName();

        $pattern = '/^(' . implode('|', $this->newOpenActionList) . ')/i';

        if (preg_match($pattern, $currenAction)):

            $TempAction=  $this->getRequest()->setActionName('index');
         endif;

         parent::preDispatch();

         if($currenAction!=$this->getRequest()->getActionName()){
            $this->getRequest()->setActionName($currenAction);
        }

        if(!$this->getRequest()->isDispatched()){
            return;
        }

        if (!preg_match('/^('.$this->_getValidActions().')/i', $currenAction)) {

             if (!$this->_getSession()->authenticate($this)) {
              $this->setFlag('', 'no-dispatch', true);
             }
        } else {

             $this->_getSession()->setNoReferer(true);
        }

     }
     protected function _getValidActions(){
      return implode("|", array_merge($this->defaultOpenActionList, $this->newOpenActionList));
      }
    public function ajaxLoginPostAction(){

        $result = array();

        if (!$this->_validateFormKey()) {
                $result['success'] = 0;
                $result['error'] = $this->_getHelper('customer')->__('Invalid form key.');
             Mage::throwException('Invalid form key');
            return;
        }

        if ($this->_getSession()->isLoggedIn()) {
            $this->_redirect('*/*/');
            return;
        }
        $session = $this->_getSession();

        if ($this->getRequest()->isPost()) {
            $login = $this->getRequest()->getPost('login');
            if (!empty($login['username']) && !empty($login['password'])) {
                try {
                    $session->login($login['username'], $login['password']);
                    if ($session->getCustomer()->getIsJustConfirmed()) {

                        $result=$this->_AjaxwelcomeCustomer($session->getCustomer(), true);
                    }
                } catch (Mage_Core_Exception $e) {
                    switch ($e->getCode()) {
                        case Mage_Customer_Model_Customer::EXCEPTION_EMAIL_NOT_CONFIRMED:
                            $value = $this->_getHelper('customer')->getEmailConfirmationUrl($login['username']);
                            $message = $this->_getHelper('customer')->__('This account is not confirmed. <a href="%s">Click here</a> to resend confirmation email.', $value);
                            break;
                        case Mage_Customer_Model_Customer::EXCEPTION_INVALID_EMAIL_OR_PASSWORD:
                            $message = $e->getMessage();
                            break;
                        default:
                            $message = $e->getMessage();
                    }
                    $session->setUsername($login['username']);
                    $result['success'] = 0;
                    $result['error'] =$message;

                } catch (Exception $e) {
                    // Mage::logException($e); // PA DSS violation: this exception log can disclose customer password
                $result['success'] = 0;
                $result['error'] =$e->getMessage();

                }
            } else {
                $result['success'] = 0;
                $result['error'] =$this->__('Login and password are required.');
            }
        }
        $this->getResponse()->setHeader('Content-type', 'application/json');
        $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));

        }


    protected function _AjaxwelcomeCustomer(Mage_Customer_Model_Customer $customer, $isJustConfirmed = false)
    {
        $result=array();

            $result['success'] = 1;
            $result['message'] = $this->__('Thank you for registering with %s.', Mage::app()->getStore()->getFrontendName());

        if ($this->_isVatValidationEnabled()) {
            // Show corresponding VAT message to customer
            $configAddressType =  $this->_getHelper('customer/address')->getTaxCalculationAddressType();
            $userPrompt = '';
            switch ($configAddressType) {
                case Mage_Customer_Model_Address_Abstract::TYPE_SHIPPING:
                    $userPrompt = $this->__('If you are a registered VAT customer, please click <a href="%s">here</a> to enter you shipping address for proper VAT calculation',
                        $this->_getUrl('customer/address/edit'));
                    break;
                default:
                    $userPrompt = $this->__('If you are a registered VAT customer, please click <a href="%s">here</a> to enter you billing address for proper VAT calculation',
                        $this->_getUrl('customer/address/edit'));
            }

            $result['success'] = 1;
            $result['message'] = $userPrompt;
        }

        $customer->sendNewAccountEmail(
            $isJustConfirmed ? 'confirmed' : 'registered',
            '',
            Mage::app()->getStore()->getId()
        );

        return $result;
    }

}

問題が見つかりません。

誰にでも解決策がありますか

更新:

$ this-> getResponse()-> setBody(Mage :: helper( 'core')-> jsonEncode($ result))

302を使用して顧客/アカウント/ログインにリダイレクトする

回答:


2

parent::preDispatch()コードを呼び出すため、リダイレクトされます。
これにより初期メソッドが呼び出され、許可されたアクションのリストにアクションが含まれていないため、検証に合格しません

    $openActions = array(
        'create',
        'login',
        'logoutsuccess',
        'forgotpassword',
        'forgotpasswordpost',
        'resetpassword',
        'resetpasswordpost',
        'confirm',
        'confirmation'
    );

しかし、なぜ既定のアカウントコントローラーを書き換える必要があるのでしょうか。デフォルトのコントローラの機能に依存しない独自のコントローラはありませんか?コントローラーには、必要なことだけajaxloginPostAction()を行うものを含める必要があります。私はそれがそうであるはずだと思いloginPostActionますが、jsonとして応答を返します。
理論的には機能するはずです。


ajaxloginPostActionは()をpreDispatchがでているときはいつでも、私は変更現在のアクション名派遣を持って.Butアドバイスをありがとうif (preg_match($pattern, $currenAction)): $TempAction= $this->getRequest()->setActionName('login'); endif;
アミットベラ

親をスキップして parent::preDispatch(); いただきありがとうございます
Amit Bera

2

ヘッダーをリセット

ヘッダーレスポンスのコンテンツタイプを変更することで、これを解決しました。

  • 最初に現在のヘッダーをクリア $this->getResponse()->clearHeaders()
  • 次にcontent type->でヘッダー応答を設定します application/json

だからから変更する:

$this->getResponse()->setHeader('Content-type', 'application/json');

$this->getResponse()->clearHeaders()->setHeader('Content-type','application/json',true);

そして、必要な結果jsonデータで302リダイレクトを与えます。

フォロー:

アランストームの回答:https : //stackoverflow.com/a/4442879/2940291

&@philwinkle https://magento.stackexchange.com/a/16238

彼らからアイデアを得た

Still Show 302リダイレクト:

これを追加すると、302リダイレクトが表示されますが、jsonデータが必要に応じて指定されます。

それでも302ヘッダーのリダイレクトは正常に戻ります。

解決:

今、私が設定indexAction as temp actionしたことを覚えていますajaxloginPostAction()。問題を作成する可能性があります。

 $TempAction=  $this->getRequest()->setActionName('index');

そしてそれは正しいです。私はそれloginActionを変更しopen actionました

Mage_Customer_AccountControllerと私のオーバーライドコントローラー Bluehorse_Ajaxlogin_AccountController

次に変更

 $TempAction=  $this->getRequest()->setActionName('index');

 $TempAction=  $this->getRequest()->setActionName('login');


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