12

スタックオーバーフローに関するいくつかの投稿を読みました

そしてmagentoフォーラムのいくつかのスレッド

ただし、これらの投稿はどれも、私がやろうとしていることをしようとはしていません

をオーバーライドしたい

app/design/adminhtml/default/default/template/widget/grid.phtml 

このファイルには、だれでも sales->order ビューからエクスポートできるようにする html の一部が含まれているためです。

注: 権限 -> ロール ビューで、このユーザー ロールのすべてのエクスポート オプションを無効にしました。

「エクスポート先:」 -> 「CSV/Excel XML」機能を表示するコードは、上記のパスに含まれています。その html のチャンクを削除し、Magento に含まれるファイルを上書きしたいと思います。

4

4 に答える 4

25

Adminhtml はフロントエンドと同じテーマ フォールバックを使用するため、モジュール構成 XML でインストール用のカスタム テンプレート テーマを宣言するだけで済みます。

<stores>
    <admin>
        <design>
            <theme>
                <template>custom</template>
            </theme>
        </design>
    </admin>
</stores>

次に、好きなようにカスタマイズしてapp/design/adminhtml/default/custom/template/widget/grid.phtmlを作成できます。このファイルは、 default/default adminhtml テーマのファイルより優先して使用されます。その場合の解決策は、エクスポート コントロールをレンダリングするロジックに ACL チェックを追加することです。

<?php if($this->getExportTypes() && {ACL LOGIC}}): ?>
    <td class="export a-right">
        <img src="<?php echo $this->getSkinUrl('images/icon_export.gif') ?>" alt="" class="v-middle"/>&nbsp; <?php echo $this->__('Export to:') ?>
        <select name="<?php echo $this->getId() ?>_export" id="<?php echo $this->getId() ?>_export" style="width:8em;">
        <?php foreach ($this->getExportTypes() as $_type): ?>
            <option value="<?php echo $_type->getUrl() ?>"><?php echo $_type->getLabel() ?></option>
        <?php endforeach; ?>
        </select>
        <?php echo $this->getExportButtonHtml() ?>
    </td>
<?php endif; ?>

このロジックはブロック クラスでより適切に実装される可能性がありますが、クラスの書き換えシステムは親クラスの書き換えに対応していないため、すべてのサブクラスを書き換える必要があります。この場合、DRY に従うことは、テンプレートにロジックを埋め込みすぎることよりも重要です。さらに、変更は明白で、簡単に維持できます。

理想的には、コア チームがこのチェックをMage_Adminhtml_Block_Widget_Gridクラスに実装するか、少なくとも_exportTypesプロパティのパブリック セッターを提供することで、このロジックを実装するのが少しきれいになります。

于 2013-01-22T13:47:34.440 に答える
5

ブロックを書き換えるのが最も簡単な解決策のように思えるかもしれませんが、それはきれいな解決策というよりも汚いハックです。クラスの書き換えは非常に慎重に使用し、可能であれば常に回避する必要があります。そうしないと、すぐに競合が発生し、Magento の更新も地獄になります。

通常、カスタム レイアウトの更新 (つまり、local.xml 内) によってテンプレートを変更できますが、この場合はウィジェットであり、レイアウト XML によって構成されていません。

したがって、オブザーバーを入力します。次の内容を含むモジュールを作成します。config.xml

<adminhtml>
    <events>
        <adminhtml_block_html_before>
            <observers>
                <yourmodulename_observer>
                    <class>yourmodulename/observer</class>
                    <method>changeWidgetTemplate</method>
                </yourmodulename_observer>
            </observers>
        </adminhtml_block_html_before>
    </events>
</adminhtml>

上記のいずれかを理解していない場合は、Magento イベントとオブザーバーについてお読みください。

テンプレートを実際に変更するには、オブザーバー自体が必要になりますが、このブロック タイプに対してのみです。

class Your_Modulename_Observer
{
    public function changeWidgetTemplate(Varien_Event_Observer $observer)
    {
        $block = $observer->getEvent()->getBlock();
        if ($block instanceof Mage_Adminhtml_Block_Widget_Grid) {
            // consider getting the template name from configuration
            $template = '...';
            $block->setTemplate($template);
        }
    }
}
于 2013-01-22T00:04:17.103 に答える
1

テンプレート定義はここにあります

class Mage_Adminhtml_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget

public function __construct($attributes=array())

そのため、Sales Order Grid からエクスポート csv を削除する場合は、Sales Grid ブロックを書き直す必要があります (方法がわからない場合は、このガイドを使用してください http://www.magentocommerce.com/wiki/groups/174/ching_and_customizing_magento_code ) 。 __construct を次のように変更します

public function __construct($attributes=array())
{
    parent::__construct($attributes);
    $this->setTemplate('...'); //here is your template
}
于 2013-01-21T23:29:28.690 に答える