Magento2: chuyển hướng từ Người quan sát


9

Chúng ta đã biết rằng Làm thế nào để chuyển hướng từ một Người quan sát cho phiên bản magento 1.x.

nhưng đối với magento 2 , chúng ta không biết Làm thế nào để chuyển hướng mạnh mẽ từ một người quan sát .

Tôi đã thực hiện google, nhưng không nhận được câu trả lời nào.


Bạn đã tìm thấy giải pháp cho việc này?
BartZalas

Câu trả lời:


20

Phải, tôi đã tự mình tìm ra giải pháp bằng cách nghiên cứu

Nếu bạn muốn làm điều đó sau đó về __construct()chức năng của your class observer, bạn phải tiêm hai lớp .

  • Thứ nhất, \Magento\Framework\App\ResponseFactorytrong đó có trách nhiệm chuyển hướng ,
  • Một lớp khác \Magento\Framework\UrlInterfacesẽ tạo url cho chuyển hướng đó.
  • Sau đó, tạo đối tượng ResponseFactory và sử dụng setRedirect($YourUrl)->sendResponse();chuyển hướng đến url mong muốn của bạn.

Người quan sát

<?php
namespace [Vendor]\[modulename]\Observer;

use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;

class [YourClass] implements ObserverInterface
{
    /**
     * @var \Magento\Framework\App\ResponseFactory
     */
    private $responseFactory;

    /**
     * @var \Magento\Framework\UrlInterface
     */
    private $url;

    public function __construct(
        ......
        \Magento\Framework\App\ResponseFactory $responseFactory,
        \Magento\Framework\UrlInterface $url,
        ......
    ) {
        $this->responseFactory = $responseFactory;
        $this->url = $url;
    }

    public function execute(Observer $observer)
    {
        $redirectionUrl = $this->url->getUrl('[ModuleName]/[ModuleName]/[[Action]');
        $this->responseFactory->create()->setRedirect($redirectionUrl)->sendResponse();

        return $this;
    }
}

Thí dụ:

Ở đây tôi viết một ví dụ về sự chuyển hướng đó.

Về cơ bản sales_quote_collect_totals_aftersự kiện, tôi đã cố gắng chuyển hướng mạnh mẽ để liên hệ với chúng tôi.

Đây là mã quan sát viên:

<?php
namespace Devamit\Mgoto\Observer;
use \Magento\Framework\Event\Observer;
use \Magento\Framework\Event\ObserverInterface;

class Challo implements ObserverInterface {
    protected $_responseFactory;
    protected $_url;

    public function __construct(

        \Magento\Framework\App\ResponseFactory $responseFactory,
        \Magento\Framework\UrlInterface $url
    ) {
        $this->_responseFactory = $responseFactory;
        $this->_url = $url;
    }

    public function execute(Observer $observer) {
        $event = $observer->getEvent();

            $myfile = fopen("var/log/debug.log", "a+") or die("Unable to open file!");
          fwrite($myfile, 'Amitber',true);
          fclose($myfile);
      // $this->_responseFactory->create()->setRedirect('www.google.com')->sendResponse();
           $customerBeforeAuthUrl = $this->_url->getUrl('contact/index/index');
          $this->_responseFactory->create()->setRedirect($customerBeforeAuthUrl)->sendResponse();
      return $this;
    }
}

3
bạn có làm việc lúc sáng sớm 4 giờ không? thật không thể tin được Có rất nhiều điều để học hỏi từ bạn.
Em bé ở Magento

Xin chào @amit, tôi đang sử dụng sự kiện và đơn hàng 'sales_order_place_b Before' được đặt bằng ajax. Khi tôi sử dụng đoạn mã trên, nó không chuyển hướng nhưng nó trả lại phản hồi. Tôi không muốn điều đó. bạn có thể vui lòng đề xuất một cách để chuyển hướng đến một trang khi biểu mẫu được lưu bằng ajax. Cảm ơn
anujeet 20/03/2017

2
Đừng sử dụng exit (); bởi vì tiêu chuẩn mã hóa Magento EcgM2 hiển thị lỗi "Sử dụng cấu trúc ngôn ngữ thoát không được khuyến khích."
Hoàng tử Patel

2
@AmitBera Nếu bạn không gọi exit, bạn nên sử dụng \Magento\Framework\App\Response\Httplàm đối số hàm tạo thay thế. Nó sẽ không hoạt động khi sử dụng lớp nhà máy.
Milan Simek

3
Nếu bạn đang sử dụng một sự kiện preispatch thì bạn cần phải tiêm \ Magento \ Framework \ App \ ActionFlag vào hàm tạo của bạn và bên trong hàm quan sát của bạn sử dụng $ this -> _ actionFlag-> set ('', \ Magento \ Framework \ App \ Action \ Hành động :: FLAG_NO_DISPATCH, đúng); để yêu cầu magento ngừng xử lý các sự kiện tiếp theo và sau đó bạn có thể sử dụng redirectInterface để chuyển hướng người dùng bất cứ nơi nào bạn muốn.
Zeeshan Khuwaja

11

tiêm \Magento\Framework\App\ActionFlag $actionFlag$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);là cách buộc Magento ngừng xử lý các sự kiện tiếp theo và chuyển hướng từ một người quan sát đặc biệt trong trường hợp sử dụng sự kiện có sẵn.

Đây là mã mẫu

public function execute(\Magento\Framework\Event\Observer $observer)
{

    /** @var \Magento\Customer\Controller\Account\LoginPost\Interceptor $controller_action */
    $controller_action = $observer->getData( 'controller_action' );
    $parameters = $controller_action->getRequest()->getParams();
    $session = $this->customerSession;

    if({yourcondition}){


        // setting an action flag to stop processing further hierarchy
        $this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);



        /// redirecting back to its referred url
        $observer->getControllerAction()->getResponse()->setRedirect($this->_redirectInterface->getRefererUrl());
        $session->setCustomerFormData($parameters);

    }

    return $this;


}

nó là một giải pháp tốt Sẽ tốt hơn nếu bạn sẽ thêm lớp đầy đủ trong giải pháp của mình.
Abbas

5

Câu trả lời trên không hiệu quả với tôi Tôi đã cập nhật mã người quan sát của mình

public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $params = []; 

        // If you want to redirect with data
        // $url = $this->_urlInterface->getUrl('checkout/cart/index',$params);

        $url = $this->_urlInterface->getUrl('checkout/cart/index');

        $observer->getControllerAction()
                    ->getResponse()
                    ->setRedirect($url);
    }

1

Tôi cũng đang làm việc trên một biểu mẫu sử dụng Ajax để xử lý yêu cầu. Tôi gửi phản hồi dưới dạng json và dựa trên yêu cầu thành công / thất bại của Ajax, tôi sử dụng window.location.href để chuyển hướng trên một trang.

Bạn có thể chuyển URL cần thiết trong json và có thể truy cập URL trong phản hồi bằng toán tử dot (.).

$.ajax({
    url:url,
    data:$("#form-id").serialize(),
    type:'POST',
    dataType:'json',
    showLoader: true,
    success:function(result) {
        if(result.status == true) {
            if (result.product_url) {
                window.location.href = result.product_url;
            }
        }
    },
    error:function(xhr,textStatus,thrownError){
        alert(thrownError);
    }
});

Cái này làm việc tốt cho tôi.


1

Tùy thuộc vào trường hợp sử dụng, hầu hết các giải pháp được đề xuất đều có vấn đề: Chuyển hướng có thể được lưu trong bộ nhớ cache, do các vị trí khác nơi phản hồi được đặt.

Kịch bản: Bạn thực hiện chuyển hướng dựa trên trạng thái đăng nhập -> ngay cả sau khi đăng nhập, trang được bảo vệ mà họ đã cố truy cập trước khi đăng nhập vẫn chuyển hướng, vì phản hồi 302 được lưu trong một ngày.

Tôi đã kết thúc việc này:

    if (!$isCustomerLoggedIn && !in_array($actionFullName, self::ALLOWED_ROUTES)) {
        $response = $observer->getEvent()->getControllerAction()->getResponse();
        $response->clearHeaders();
        $this->redirect->redirect($response, 'customer/account/login');
    }

EDIT không hoạt động -> ClearHeaders giết FPC - làm việc trên một giải pháp thay thế

EDIT2 Giải pháp tốt hơn:

        /**
         * @var $action Action
         */
        $action = $observer->getEvent()->getControllerAction();

        /**
         * @var $response \Magento\Framework\App\Response\Http
         */
        $response = $action->getResponse();
        $response->clearHeaders()->setNoCacheHeaders();
        $this->redirect->redirect($response, 'customer/account/login');

1
namespace Adnan\Redirect\Observer;

use Magento\Framework\Event\ObserverInterface;

/**
 * Class Example
 *
 * phpcs:disable Generic.Files.LineLength
 *
 * @package Adnan\Example\Redirect
 */
class Example implements ObserverInterface
{
    /**
     * @var \Magento\Framework\App\ActionFlag
     */
    private $actionFlag;
    /**
     * @var \Magento\Framework\UrlInterface
     */
    private $url;

    /**
     * Data constructor.
     *
     * @param \Magento\Framework\App\ActionFlag $actionFlag
     * @param \Magento\Framework\UrlInterface   $url
     */
    public function __construct(
        \Magento\Framework\App\ActionFlag $actionFlag,
        \Magento\Framework\UrlInterface $url
    ) {

        $this->actionFlag = $actionFlag;
        $this->url = $url;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        // Stop further processing if your condition is met
        $this->actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
        // then in last redirect
        $observer->getControllerAction()->getResponse()->setRedirect($this->url->getUrl("[FrontName]/[Controller]/[Action]"));

        return $this;
    }
}

Hãy nhớ sử dụng \Magento\Framework\UrlInterfaceđể tạo URL nếu không, bạn sẽ không được chuyển hướng đến cấu trúc cấp cao nhất, ví dụ: nếu bạn không sử dụng UrlInterfacevà muốn chuyển hướng từ "thanh toán" bằng "a / b / c" thì nó sẽ xử lý "thanh toán / a / b / c ".

Bạn có một tùy chọn để sử dụng \Magento\Framework\App\ActionFlag, nó sẽ ngừng xử lý thêm các quan sát viên.

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.