2

私は、いつか公開されるMagento拡張機能になることを望んでいるものの作成に取り組んでいます(ここで「正しいこと」を行うことが重要であるため、この部分について説明します)。私がやりたいことの1つは、デフォルトのMagentoダッシュボードにボックスを追加することです。基本的には、自分のコンテンツを除いて、「上位5つの検索用語」とまったく同じ新しい「ボックス」です。新しいカスタムボックスを(理想的には)最後に表示されるボックスにしたいと思います。

私が遭遇している問題は、ダッシュボードのレンダリングを担当するテンプレートがレンダリングされる特定のブロックを呼び出し、これらのブロックがhtml内にネストされていることです。言い換えると、子ブロックが適切なHTML要素にレンダリングされる領域が頻繁にある場合、この状況では、特定のブロックがレンダリングされているように見えます。/app/design/adminhtml/default/default/template/dashboard/index.phtmlの内容は次のとおりです

  <div class="dashboard-container">
            <?php echo $this->getChildHtml('store_switcher') ?>
            <table cellspacing="25" width="100%">
                <tr>
                    <td><?php echo $this->getChildHtml('sales') ?>
                        <div class="entry-edit">
                            <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Orders') ?></h4></div>
                            <fieldset class="np"><?php echo $this->getChildHtml('lastOrders'); ?></fieldset>
                        </div>
                        <div class="entry-edit">
                            <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Search Terms') ?></h4></div>
                            <fieldset class="np"><?php echo $this->getChildHtml('lastSearches'); ?></fieldset>
                        </div>
                        <div class="entry-edit">
                            <div class="entry-edit-head"><h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div>
                            <fieldset class="np"><?php echo $this->getChildHtml('topSearches'); ?></fieldset>
                        </div>
                    </td>
                    <td>
                        <div class="entry-edit" style="border:1px solid #ccc;">
                            <?php echo $this->getChildHtml('diagrams') ?>
                            <?php if (is_array($this->getChild('diagrams')->getTabsIds())) : ?>
                                <div id="diagram_tab_content"></div>
                            <?php endif; ?>
                            <div style="margin:20px;">
                                <?php echo $this->getChildHtml('totals') ?>
                            </div>
                            <div style="margin:20px;">
                                <?php echo $this->getChildHtml('grids') ?>
                                <div id="grid_tab_content"></div>
                            </div>
                        </div>
                    </td>
                </tr>
            </table>
        </div>

自分のストアでこれを行っていた場合、上記のベースMagentoダッシュボードテンプレートindex.phtmlを編集し、ブロックをレンダリングするために必要なものを追加することで、これを比較的簡単に達成できると思います。

<div class="entry-edit">
     <div class="entry-edit-head">
         <h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div>
         <fieldset class="np"><?php echo $this->getChildHtml('myDashboardBox'); ?></fieldset>
     </div>
</div>

しかし、これは私自身の店ではないので、これは実際には選択肢のようには思えません。

さて、いくつか考えた後、私の選択肢は次のように見えます(これらのほとんどは「悪い」ように見え、公の場で見たことを非常に誇りに思うものではないことに注意してください):

0)あなたが私に言うことを私が見ていないことは明らかな何かが完璧で正しい解決策です

1)この領域(「topSearches」、「sales」など)の他のブロックの1つにカスタムブロックを追加して、ブロックをレンダリングできる可能性があります(多分?)。これはあまり「クリーン」ではないようです

2)ダッシュボードページの別の場所にブロックをレンダリングしてから、JavaScriptを使用して正しい場所に移動できる場合があります。これは私が推測しているようにかなり簡単ですが、明らかな理由で非常に「ハッキー」に感じます。

誰かがこれを行う方法についてフィードバックがありますか、または方法がある場合はありますか?このモジュールを公開したいので、私の目標は良い仕事をし、「ハッキング」をできるだけ少なくすることです。

読んでいただきありがとうございます!

4

1 に答える 1

9

あなたが言ったように、本当にクリーンなオプションはありません。テンプレートは拡張不可能な方法でコーディングされているため、常にある程度のハッキングが発生します。これは、イベントオブザーバーを使用してそれを行う私の個人的な好みの方法です。このようにして、少なくとも他のモジュールと競合することはありません。

まず、core_block_abstract_prepare_layout_afterandcore_block_abstract_to_html_afterイベントのオブザーバーを追加します。

<adminhtml>
    <events>
        <core_block_abstract_prepare_layout_after>
            <observers>
                <your_module>
                    <class>your_module/observer</class>
                    <method>coreBlockAbstractPrepareLayoutAfter</method>
                </your_module>
            </observers>
        </core_block_abstract_prepare_layout_after>
        <core_block_abstract_to_html_after>
            <observers>
                <your_module>
                    <class>your_module/observer</class>
                    <method>coreBlockAbstractToHtmlAfter</method>
                </your_module>
            </observers>
        </core_block_abstract_to_html_after>
    </events>
</adminhtml>

これらの2つのイベントは、でインスタンス化およびレンダリングされるすべてのブロックに対してディスパッチされMage_Core_Block_Abstractます。私の経験では、adminhtmlインターフェースでそれらを使用することはそれほど問題ではありませんが、これらのイベントのフロントエンドオブザーバーではオーバーヘッドが大きくなりすぎます。

手元のタスクに戻り、オブザーバークラスを作成する必要があります。

class Your_Module_Model_Observer
{
    public function coreBlockAbstractPrepareLayoutAfter(Varien_Event_Observer $observer)
    {
        if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index')
        {
            $block = $observer->getBlock();
            if ($block->getNameInLayout() === 'dashboard')
            {
                $block->getChild('topSearches')->setUseAsDashboardHook(true);
            }
        }
    }

    public function coreBlockAbstractToHtmlAfter(Varien_Event_Observer $observer)
    {
        if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index')
        {
            if ($observer->getBlock()->getUseAsDashboardHook())
            {
                $html = $observer->getTransport()->getHtml();
                $myBlock = $observer->getBlock()->getLayout()
                    ->createBlock('you_module/block')
                    ->setTheValuesAndTemplateYouNeed('HA!');
                $html .= $myBlock->toHtml();
                $observer->getTransport()->setHtml($html);
            }
        }
    }
}

テンプレートは、兄弟の内側<div>から兄弟を挿入しているという事実に対応する必要がありますが、それ以外の場合は問題ありません。

</fieldset></div>
<div class="entry-edit">
    <div class="entry-edit-head"><h4>Your Module</h4></div>
    <fieldset class="np">Your Content

<fieldset>親テンプレートがあなたのためにとを閉じるので、そのままにしておき<div>ます(私が知っているように醜いです)。

于 2012-02-10T09:01:06.447 に答える