回答:
うん、研究して自分で解決策を見つけた
これを行う場合__construct()
はyour class observer
、の関数で、2つのクラスを注入する必要があります。
\Magento\Framework\App\ResponseFactory
\Magento\Framework\UrlInterface
そのリダイレクトのURLを作成する別のクラス。ResponseFactory
使用
setRedirect($YourUrl)->sendResponse();
します。<?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;
}
}
ここで私はそのリダイレクトの例を書いています。
基本的にsales_quote_collect_totals_after
、私は強制的に私たちに連絡するようリダイレクトすることを試みました。
ここでオブザーバーコード:
<?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; } }
\Magento\Framework\App\Response\Http
代わりにコンストラクタ引数として使用する必要があります。ファクトリクラスを使用する場合は機能しません。
\Magento\Framework\App\ActionFlag $actionFlag
andを注入することは、$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
Magentoが以降のイベントの処理を停止し、特別にpredispatchイベントを使用する場合にオブザーバーからリダイレクトするように強制する方法です。
これがサンプルコードです
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;
}
上記の答えがうまくいかないオブザーバーコードを更新しました
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);
}
リクエスト処理にAjaxを使用するフォームにも取り組んでいます。jsonの形式で応答を送信し、Ajaxリクエストの成功/失敗に基づいて、window.location.hrefを使用してページにリダイレクトします。
jsonで必要なURLを渡し、ドット(。)演算子を使用して応答でアクセスできます。
$.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);
}
});
これは私にとってはうまくいきます。
ユースケースによっては、提案されたソリューションのほとんどに問題があります。応答が設定されている他の場所が原因で、リダイレクトがキャッシュされる可能性があります。
シナリオ:ログインステータスに基づいてリダイレクトを実行します->ログイン後でも、302応答が1日間キャッシュされるため、ログイン前にアクセスしようとした保護されたページがリダイレクトされます。
私はこれを行うことになりました:
if (!$isCustomerLoggedIn && !in_array($actionFullName, self::ALLOWED_ROUTES)) {
$response = $observer->getEvent()->getControllerAction()->getResponse();
$response->clearHeaders();
$this->redirect->redirect($response, 'customer/account/login');
}
EDITが機能しない-> clearHeadersがFPCを終了させる-代替ソリューションの開発
EDIT2より良いソリューション:
/**
* @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');
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;
}
}
\Magento\Framework\UrlInterface
それ以外の場合はを使用してURLを生成することを忘れないでください。トップレベルの構造UrlInterface
にリダイレクトされません。たとえば、使用せずに「チェックアウト」から「a / b / c」でリダイレクトしたい場合は、「チェックアウト/ a」を処理します。 /紀元前"。
を使用するオプションがあり\Magento\Framework\App\ActionFlag
、オブザーバーの以降の処理を停止します。