2

core/Mage/Adminhtml/controllers/Catalog/ProductController.php から saveAction メソッドをオーバーロードしたいのですが、うまくいきません。

背景:商品を保存する前に、カスタム属性の値を変更したいと考えています。_initProductSave が属性を設定することがわかりました。init_ProductSave の後に属性を変更することは良い点だと思います (誰かがより良い場所を知っている場合は、私に知らせてください) ...

誰でも私を助けてください... :)

Magento バージョン: Community Edition バージョン 1.7.0.1 拡張機能なし、テーマがインストールされていません。このバージョンを完全に空白でインストールしました ...

バージョン 1: ローカル/Mage フォルダーにコピーしてコントローラーを上書きする

まず最初に、正しい構造内の app/code/local フォルダーにファイルをコピーしようとしましたが、うまくいきません (ローカル テストシステム用の Varient.php と修正用の store.php でこれを行いました)。価格のバグ - 両方で機能しています...)

バージョン 2: コントローラーを拡張機能で上書きする

私の拡張機能は次のようになります。

ファイル構造:

code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php 
code/local/MyOne/MyExtension/etc/config.xml 
etc/modules/MyOne_MyExtension.xml

ファイルは次のようになります: MyOne_MyExtension.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyOne_MyExtension>
            <active>true</active>
            <codePool>local</codePool>
        </MyOne_MyExtension>
    </modules>
</config>

コード/ローカル/MyOne/MyExtension/etc/config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyOne_MyExtension>
            <version>1.0.0</version>
        </MyOne_MyExtension>
    </modules>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

そして最後のもの、code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php:

<?php
require_once 'Mage/Adminhtml/controllers/Catalog/ProductController.php';

class MyOne_MyExtension_Catalog_ProductController extends Mage_Adminhtml_Catalog_ProductController
{
    public function saveAction()
    {
        // do my stuff
        die('reached method');
        // after pressing on save, there should no be a white screen ...
    }
}
?>

私はググって読んだことがありますが、エラーは表示されません...

どんな助けでも本当に素晴らしいでしょう!!!

こんにちは、マティアス

4

2 に答える 2

6

注意:対象となる方法を考えると...

Mage_Adminhtml_Catalog_ProductController->_initProductSave()

...イベントを消費するadminhtmlスコープのオブザーバーの使用を除外することをお勧めしcatalog_product_save_beforeます。


「まず、ファイルを正しい構造内のapp / code/localフォルダーにコピーしようとしました...」

これは珍しい開発者のアプローチではありませんが、機能することはありません。Magentoアクションコントローラークラスはオートローダーによってロードされません。それらは、実際のファイルシステムパスによって明示的にロードされます。したがって、いわゆる「インクルードパスハック」は適用されません。

参照。Mage_Core_Controller_Varien_Router_Standard->getControllerFileName()

2番目のアプローチ(適切なカスタム拡張機能を使用して書き換えを実行する)が正しいアプローチです。必要なのは、Magentoがアクションコントローラーディレクトリを見つけて、アクションコントローラークラスをリクエストURLに一致させる方法を理解することだけです。

モジュールはそのconfig.xmlで、Mage_Adminhtml管理ルーターを構成します。管理ルーターは、管理関連のすべての要求の照合を担当します。

<admin>
    <routers>
        <adminhtml>
            <use>admin</use>
            <args>
                <module>Mage_Adminhtml</module>
                <frontName>admin</frontName>
            </args>
        </adminhtml>
    </routers>
</admin>

上記の構成スニペットは2つのことを行います。<frontName />ノードはモジュールルートを追加し、ノード<module />は登録されたMage_Adminhtml <codePool />値( "core")とともに、アクションコントローラークラス(この場合は)を見つけることができるディレクトリを確立し/[basepath]/app/code/core/Mage/Adminhtml/controllers/ます。

モジュールアクションコントローラーは、既存のモジュールルートに他の候補一致ディレクトリを追加することによって作業を書き換えます。これはすべて構成から解析されます。

<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

admin/routers/adminhtml/args/ご覧のとおり、上記の構成は、構成XMLのコンパイル時にノードに追加または追加するだけです。これがどのように解釈され、リクエストマッチングに使用されるかは、コントローラーマッチングの「通常の」プロセスと非常によく似ています。上記の例では、MyOne_MyExtensionモジュールはAdminhtmlモジュールのディレクトリリストにディレクトリを効果的に追加しています。それがcodePoolにあると仮定するとlocal、上記の例はディレクトリを指しています

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/

これは、アクションコントローラークラスが

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/Catalog/ProductController.php

_initProductSave()これには、という名前のクラスのメソッドが含まれていました

MyOne_MyExtension_Catalog_ProductController_Catalog_ProductController

うまくいけば、この説明は、特定のクラス(ブロック、ヘルパー、およびモデルの書き換えがどのように機能するか)を指定するのではなく、ディレクトリレベルで構成ベースのコントローラの書き換えが機能することを確認するのに十分です。この構成ではディレクトリが追加されるため、特定のモジュールに新しいアクションを追加するために使用できるため、書き換えを行う必要はありません。最終的に、アクションコントローラーの書き換えは、他のコントローラークラスが「元の」コントローラークラスの前に一致する場合にのみ発生します。

于 2012-07-01T14:53:02.657 に答える
4

Magento は、一致するコントローラーへのパスを見つけるためにモジュール名のみを知る必要があるため、

変化する:

<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>

に:

<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension</MyOne_MyExtension>
于 2012-07-01T13:27:12.370 に答える