1

私は 2 つの Magento オブザーバーを作成しましたが、どちらも間違ったページで終了することを除いて、私が望むことを正確に実行します。つまり、ログ ファイルを書き込み、データベースを変更し、他のサーバーと通信しますが、ページ間のルーティングを変更します。たとえば、ログイン時に使用したオブザーバーは、データベースを変更し、Cookie を書き込み、ログに書き込みますが、ログイン後のページを次のように変更します。

http://www.my-web-site.com/index.php/customer/login/post/

その後、404エラーが発生します。「Ctrl」+「r」を押すと、にログインします

http://www.my-web-site.com/index.php/customer/account/index/

どちらが正しい。app/code/local/my_module/my_model/etc/config.xml を app/code/local/my_module/my_model/etc/config.xml.1 に変更すると (つまり、オブザーバーを取り出します)、Magento がルーティングします正しいページへ、

config.xml にルーター情報が必要だと考えています。私の現在の config.xml は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<!-- The root node for Magento module configuration -->
<config>

  <!-- The module's node contains basic information about each Magento module -->
  <modules>

    <!-- This must exactly match the namespace and module's folder
      names, with directory separators replaced by underscores -->
    <MyCompany_LogIn>

      <!-- The version of our module, starting at 0.0.0 -->
      <version>0.0.0</version>

    </MyCompany_LogIn>
  </modules>

  <!-- Configure our module's behavior in the global scope -->
    <global>

        <!-- Defining models -->
        <models>

        <!-- Unique identifier in the model's node.
             By convention, we put the module's name in lowercase. -->
        <mycompany_login>

            <!-- The path to our models directory, 
             with directory separators replaced by underscores -->
          <class>MyCompany_LogIn_Model</class>

        </mycompany_login>
        </models>
    </global>

  <frontend>

    <!-- Defining an event observer -->
      <events>

        <!-- The code of the event we want to observe -->
        <customer_login>

            <!-- Defining an observer for this event -->
          <observers>

            <!-- Unique identifier within the catalog_product_save_after node.
                 By convention, we write the module's name in lowercase. -->
            <mycompany_login>

                <!-- The model to be instantiated -->
              <class>mycompany_login/observer</class>

              <!-- The method of the class to be called -->
              <method>wrtLogInCookie</method>

              <!-- The type of class to instantiate -->
              <type>singleton</type>

            </mycompany_login>
            </observers>
        </customer_login>
      </events>
  </frontend>
</config>    

Magento 内のログインがオブザーバーを使用していると推測し、それを妨害しています。

以外に、PHP Observer コードでも同様のことを達成できると思います。私のオブザーバーは次のとおりです。

<?php

  /**
  * Our class name should follow the directory structure of
  * our Observer.php model, starting from the namespace,
  * replacing directory separators with underscores.
  * i.e. /www/app/code/local/MyCompany/LogIn/Model/Observer.php
  */

  class MyCompany_LogIn_Model_Observer extends Varien_Event_Observer
    {
    /**
    * Magento passes a Varien_Event_Observer object as
    * the first parameter of dispatched events.
    */
    public function wrtLogInCookie(Varien_Event_Observer $observer)
    {
      // Retrieve the product being updated from the event observer
      $customer = $observer->getEvent()->getCustomer();

      $email = $customer->getEmail();
      Mage::log('The E-mail is: ' . $email);

      $ran_nmbr = rand(); 
      Mage::log('The random number is: ' . $ran_nmbr);

      $crnt_dat = date("m-d-Y::H:i:s");
      Mage::log('The date is: ' . $crnt_dat);

      return $this;
    }
    }
?>

ルーターについて読んだことがありますが、記事では、拡張機能が実行される前にページにランディングするという観点から説明されていました。ご覧のとおり、拡張機能の実行後に正しいページに移動する必要があります。

PHP オブザーバー内で、リダイレクトも試しました。例えば、

Mage::app()->getResponse()->setRedirect(Mage::getUrl('customer/account/login'));

完全な URL アドレスか何かが必要かもしれません。これは簡単に修正できると確信していますが、私の無知が私を追いかけているようです。これについて何か知っていることがあれば助けてください。

4

2 に答える 2

1

あなたは部分的に正しいです。あなたが直面している問題は、Magento のリダイレクト メカニズムが「最後に何かを言った人」が勝つ哲学で機能することです。の標準ログインコードを見ると、

app/code/core/Mage/Customer/controllers/AccountController.php

loginPostActionメソッドが次の呼び出しで終了することがわかります。

$this->_loginPostRedirect();

これは(最終的に)次のようなコードを呼び出すことになります

$this->getResponse()->setRedirect($url);

これは、問題の原因となっているコードである可能性もあれば、別の原因である可能性もあります。一般的な問題は、応答オブジェクトのメソッドへの最後の呼び出しsetRedirectが勝つことです。

Mage::registerこれに対する私の通常の解決策は、リダイレクトを実行したいときにある種のグローバル フラグ (クラスの静的変数、 で設定されたフラグ) を設定してから、 の追加のオブザーバーを作成することですcontroller_action_postdispatch。このオブザーバーで、設定したグローバル フラグを探し、見つかった場合はそこにリダイレクトを設定します。

これはリダイレクト状況の 99% を処理し、あなたの状況を処理する必要があります。これがうまくいかないのは、いくつかの管理者ログインのケースと、URL の書き換えです。

管理者ログインには、 Magento 応答オブジェクトを使用しないリダイレクト コードが含まれています

#File: app/code/core/Mage/Admin/Model/Session.php
...
header('Location: ' . $requestUri);
exit;    
...

このリダイレクトが問題を引き起こしている場合は、admin_session_user_login_successMagento が行う前に、PHP ヘッダー リダイレクトを使用するリスナーを作成してください。

同様に、Magento が書き換えオブジェクトを使用している場合、次のコードが実行される可能性があります。

#File: app/code/core/Mage/Core/Model/Url/Rewrite.php
if ($isPermanent) {
    header('HTTP/1.1 301 Moved Permanently');
}

header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Pragma: no-cache');
header('Location: ' . $url);
exit;

(とは言っても、標準の Magento 操作ではコントローラーのディスパッチ前に実行されるため、コードの書き換えが問題になることはめったにありません)

于 2012-11-29T03:39:16.400 に答える