0

私の目標は、ストアの任意のページに入るときに、URL リファラーとキーワードをデータベースに保存することです。私はこの質問とその答えをチェックして、私の問題に光を当てようとしました。

私がフォローしているアプローチは次のとおりです。

  1. 各ページに読み込まれるように、デフォルトのレイアウトにブロックを固定する (テスト済み、動作中)。このブロックは、次のコードを使用してリファラーを読み取ります。

    $request['url'] = $this->getRequest()->getServer('HTTP_REFERER');

  2. 次に、$request をコントローラーに渡す関数を呼び出します。それとも、dispatchEvent を呼び出して、postAction関数を持つコントローラーで行うのでしょうか。

    //on the phtml file
    <div>
         <?php
              $request['url'] = getRequest()->getServer(‘HTTP_REFERER’);
              Mage::dispatchEvent("allpagescontroller", $request);
         ?>
    </div>
    
  3. コントローラーはモデルをインスタンス化し、セッターを呼び出して必要な値を更新/挿入します

    //on the controller
    function postAction ($params)
    {
        $referer = $this->getRequest()->getPost();
    }
    
  4. モデルには、CRUD 操作を実行するための適切なコードがすべて含まれています。

これは正しいです?次の手順に従って、Magento MVC アプローチに従おうとしています。今のところ、phtml ファイルにすべてのコードがあります。リファラーを取得して分割し、モデルをインスタンス化してすべてを保存しています。しかし、私はこれが正しくないことを知っています。

今のところ config.xml には次のものがあります。

<?xml version="1.0"?>
<config>
    <modules>
        <Dts_Allpages>
            <version>0.1.0</version>
        </Dts_Allpages>
    </modules>
    <global>
      <models>
          <allpages>
              <class>Dts_Allpages_Model</class>
              <resourceModel>allpages_mysql4</resourceModel>
          </allpages>
          <allpages_mysql4>
                  <class>Dts_Allpages_Model_mysql4</class>
                <entities>
                  <keywords>
                      <table>keywords</table>
                  </keywords>
                  <referencedpages>
                      <table>referencedpages</table>
                  </referencedpages>
              </entities>
          </allpages_mysql4>
        </models>
        <blocks>
            <allpages>
                <class>Dts_Allpages_Block</class>
            </allpages>
        </blocks>
        <helpers>
            <allpages>
                <class>Dts_Allpages_Helper</class>
            </allpages>
        </helpers>
        <resources>
            <allpages_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </allpages_write>
            <allpages_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </allpages_read>
        </resources>
    </global>>
    <frontend>
      <routers>
          <allpages>
              <use>standard</use>
              <args>
                  <module>Dts_Allpages</module>
                  <frontName>allpages</frontName>
              </args>
          </allpages>
      </routers>
        <layout>
            <updates>
                <allpages>
                    <file>allpages.xml</file>
                </allpages>
            </updates>
        </layout>
    </frontend>  
</config>
4

2 に答える 2

0

あなたのロジックは、Magento MVC フローに関して正しくありません。テンプレートはプログラム フローの最後のストップです。システムが不安定な混乱に陥るため、テンプレートにロジックを挿入しないでください。

達成しようとしているロジックには、ビューはまったく必要ありません。Controllerすら必要ありません。ご存知のように、Magento は Event-Observer パターンを利用しており、あなたのタスクはそれを要求しているだけです。

オブザーバーを作成し、最初のリクエスト フローからいくつかのイベントをリッスンする必要があります。すべてのページ要求でトリガーされるイベントをリッスンできますが、システム自体がまだ初期化されていないときに早すぎてはならず、他のシステム ロジックの一部がリダイレクトできるときに遅すぎてはなりません。 、転送するか、リファラーにいくつかの変更を加えます。controller_action_predispatchあなたのニーズに合うと思います。

オブザーバーHTTP_REFERERでは、モデルレイヤーを使用して取得し、DB に保存できます。

于 2012-09-26T11:33:15.350 に答える
0

このコードをobserver

$url = Mage::helper('core/http')->getHttpReferer() ? Mage::helper('core/http')->getHttpReferer()  : Mage::getUrl();
Mage::app()->getFrontController()->getResponse()->setRedirect($url);
Mage::app()->getResponse()->sendResponse();
exit;
于 2015-04-14T09:56:47.597 に答える