2

Magento管理者のメイン注文詳細ページに印刷注文ボタンを追加しようとしています。クライアントの古いMagentoには、注文自体の印刷ボタンがありました(請求書ではなく、有料または未払い)。以前はどのように見えたかを確認してください。

オーダーバー

バックエンドでテンプレートヒントを有効にしましたが、テンプレートファイルにそのボタンが含まれていません。私はいくつかのコアファイルを調べてきました...htmlは次のようになります。これを、現在表示されている注文に適用できるphpボタンに変換するにはどうすればよいですか?

<button  id="id_d808fbd2d533d4e7b8e4a3fcd6274251" title="Back" type="button" class="scalable back" onclick="setLocation('http://test.animalnecessity.com/index.php/admin/sales_order/index/order_id/15852/key/28a65aa166da1664c65971decf3e472c/')" style="">

これを実装できますか? Magento-販売注文ビューページ(オブザーバー/イベント)にボタンを追加します。その場合、このコードをどこに配置しますか? http://alanstorm.com/magento_config

で説明されているように、一般的なモジュール構造でセットアップしました。etcフォルダーのconfig.xmlには次のものがあります

<config>    
    <modules>
        <CaitlinHavener_printOrder>
            <version>0.1.0</version>
        </CaitlinHavener_printOrder>
    </modules>
    <global>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                <CaitlinHavener_printOrder>
                    <class>CaitlinHavener_printOrder_Model_Observer</class>
                    <method>orderPageButton</method>
                    <type>model</type>
                </CaitlinHavener_printOrder>
                </observers>
            </core_block_abstract_to_html_before>
        </events>
    </global>
</config>

私のCaitlinHavener_printOrder.xmlは次のとおりです

<config>    
    <modules>
        <CaitlinHavener_printOrder>
            <active>true</active>
            <codePool>local</codePool>
        </CaitlinHavener_printOrder>
    </modules>
</config>

およびObserver.php

<?php
// Order View Page button    
class CaitlinHavener_printOrder_Model_Observer
{
    public function orderPageButton( Varien_Event_Observer $observer )
    {
        if(get_class($block) =='Mage_Adminhtml_Block_Sales_Order_View'
            && $block->getRequest()->getControllerName() == 'sales_order')
        {
            $block->addButton('test_print', array(
                'label'     => 'Test',
                'onclick'   => 'setLocation(\'' . $block->getUrl('html/sales_order/print') . '\')',
                'class'     => 'go'
            ));
        }
    }
}
?>

これはまだ機能していません。何か案は?

4

2 に答える 2

2

ボタンは、Mage_Adminhtml_Block_Sales_Order_View ::__constructで$this->addButton関数呼び出しを使用して作成されます。

イベントに関しては、そのうちの1つを使用できますが、頭のてっぺんから、どれを呼び出すのが適切かを思い出せません。

トリガーされるすべてのイベントを一覧表示するには、Mage :: log($ name);を使用してMage::dispatchEvent関数にログインを追加します。

その名前を使用して、config.xml(config / global / eventsタグパスの下)でリスナーを宣言できます。

  <name_that_was_printed_by_the_above_function>
    <observers>
      <YourModuleNamespace_YourModuleName>
        <class>moduleName/observer</class>
        <method>functionName</method>
        <type>model</type>
      </YourModuleNamespace_YourModuleName>
    </observers>
  </name_that_was_printed_by_the_above_function>

次に、モジュールクラスObserver.phpを作成します

class Namespace_ModuleName_Model_Observer
{
    public function functionName( Varien_Event_Observer $observer )
    {
        $block = $observer->getEvent()->getData( 'data_object' ); // this line may vary

        $block->addButton( ...stuff here... // take for reference the answer from the question you linked to
        return $this;
    }
}

しかし、私が言ったように、オブザーバーの誰もあなたのニーズに合わない可能性があり、あなたは別のより邪魔な解決策を見つける必要があります...

編集

おそらくcore_block_abstract_to_html_beforeを使用し、それが正しいブロックであるかどうかを確認するためにifステートメントを用意する必要があります...欠点は、すべてのブロックに呼び出しオーバーヘッドとifステートメントオーバーヘッドが与えられるため、それが最適かどうかはわかりません解決策ですが、確かに最も邪魔にならないので、おそらくそれを使用します(このイベントの場合は、「data_object」を「block」に変更する必要があります-イベントはMage_Core_Block_Abstract :: toHtmlのdispatchEvent行でトリガーされます)。

編集

あなたの質問の更新後、私はあなたのモジュールをテストしました、そして私がコメントで警告したように、問題はあなたのモジュールの名前です-小文字。

app / etc / modules / CaitlinHavener_PrintOrder.xml

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

app / code / local / CaitlinHavener / PrintOrder / etc / config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>    
    <modules>
        <CaitlinHavener_PrintOrder>
            <version>0.1.0</version>
        </CaitlinHavener_PrintOrder>
    </modules>
    <global>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                <CaitlinHavener_PrintOrder>
                    <class>CaitlinHavener_PrintOrder_Model_Observer</class>
                    <method>orderPageButton</method>
                    <type>model</type>
                </CaitlinHavener_PrintOrder>
                </observers>
            </core_block_abstract_to_html_before>
        </events>
    </global>
</config>

local / CaitlinHavener / PrintOrder / Model / Observer.php

<?php
// Order View Page button    
class CaitlinHavener_PrintOrder_Model_Observer
{
    public function orderPageButton( Varien_Event_Observer $observer )
    {
      $block = $observer->getEvent()->getData( 'block' );

        if(get_class($block) =='Mage_Adminhtml_Block_Sales_Order_View'
            && $block->getRequest()->getControllerName() == 'sales_order')
        {
            $block->addButton('test_print', array(
                'label'     => 'Test',
                'onclick'   => 'setLocation(\'' . $block->getUrl('html/sales_order/print') . '\')',
                'class'     => 'go'
            ));
        }
    }
}
?>

ファイルに正しく名前を付け(大文字に注意してください)、コードをコピーするように注意してください。そうすれば機能するはずです。

于 2013-01-25T00:25:52.060 に答える
0

@DomenVrankarのわずかな改善

adminhtml_block_html_before管理エリアでのみディスパッチし、管理core_block_abstract_to_html_before者とフロントエンドの両方でディスパッチします

    <events>
        <adminhtml_block_html_before>
            <observers>
            <CaitlinHavener_PrintOrder>
                <class>CaitlinHavener_PrintOrder_Model_Observer</class>
                <method>orderPageButton</method>
                <type>model</type>
            </CaitlinHavener_PrintOrder>
            </observers>
        </adminhtml_block_html_before>
    </events>

別のモジュールを書き換えるとMage_Adminhtml_Block_Sales_Order_Viewget_class($block)新しいブロッククラスが返されます(例:MagePal_Guest2Customer_Block_Adminhtml_Sales_Order_View)。したがって、ボタンは表示されなくなります。

<?php
// Order View Page button    
class CaitlinHavener_PrintOrder_Model_Observer
{
    public function orderPageButton( Varien_Event_Observer $observer )
    {
      $block = $observer->getEvent()->getData( 'block' );

        if($block->getId() == 'sales_order_view' && $block->getRequest()->getControllerName() == 'sales_order')
        { 
          ....
于 2013-05-20T15:00:14.770 に答える