Ghi đè AccountContoder không hoạt động trên Action mới và thực hiện chuyển hướng 302


7

Tôi đang thử thêm new actionvàoAccountController

Bây giờ: AccountControll được ghi đè đúng

Nhưng đó là bất cứ khi nào hit new Action (ajaxLoginPostAction) is redirect to 302.

Tôi thêm ajaxLoginPost () dưới dạng hành động mở trong hàm preDispatch () nhưngtill is not works.

Tại đây 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>

AccountControll.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;
    }

}

Tôi không thể tìm thấy nó vấn đề.

Có ai có thể có giải pháp

Cập nhật:

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

chuyển hướng đến khách hàng / tài khoản / đăng nhập bằng 302

Câu trả lời:


2

Bạn được chuyển hướng bởi vì bạn gọi parent::preDispatch()mã của bạn.
Điều này gọi phương thức ban đầu và nó không vượt qua xác thực vì hành động của bạn không nằm trong danh sách các hành động được phép

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

Nhưng tại sao bạn cần phải viết lại bộ điều khiển tài khoản mặc định? Bạn có thể có bộ điều khiển riêng không phụ thuộc vào chức năng của bộ điều khiển mặc định không? Bộ điều khiển của bạn chỉ nên chứa ajaxloginPostAction()những gì bạn cần. Tôi giả sử nó phải giống như thế loginPostActionnhưng trả về phản hồi là json.
Nó nên hoạt động trong lý thuyết.


Cảm ơn vì lời khuyên. Nhưng tôi đã thay đổi hành động hiện tại Tên Công văn bất cứ khi nào ajaxloginPostAction () được đặt trước bởiif (preg_match($pattern, $currenAction)): $TempAction= $this->getRequest()->setActionName('login'); endif;
Amit Bera

bỏ qua phụ huynh parent::preDispatch(); Cảm ơn một lần nữa
Amit Bera

2

Đặt lại tiêu đề

Tôi đã nhận được giải pháp này bằng cách thay đổi loại nội dung phản hồi tiêu đề.

  • Xóa tiêu đề hiện tại đầu tiên bởi $this->getResponse()->clearHeaders()
  • Sau đó đặt phản hồi tiêu đề với content type-> application/json

Vì vậy, thay đổi làm từ:

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

đến

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

Và đưa ra 302 chuyển hướng với dữ liệu json kết quả cần thiết.

Theo:

Alan Storm trả lời: https://stackoverflow.com/a/4442879/2940291

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

Tôi đã có ý tưởng từ họ

Vẫn hiển thị chuyển hướng 302:

Sau khi thêm nó, nó hiển thị chuyển hướng 302 nhưng nó đã cung cấp dữ liệu json như tôi muốn.

Vẫn chuyển hướng tiêu đề 302 với trả lại thích hợp.

Giải pháp:

Bây giờ nó nhớ rằng tôi đã thiết lập indexAction as temp actioncho ajaxloginPostAction(). mà có thể được tạo ra vấn đề.

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

Và nó được right.I có thay đổi nó loginActionmà là open action

Mage_Customer_AccountCont điều khiển và bộ điều khiển ghi đè của tôi Bluehorse_Ajaxlogin_AccountCont kiểm

Bây giờ đổi thành

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

đến

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


Now  No more 302 redirection.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.