5

私は、「楽しみのため」のオープン ソース プロジェクトとしてリリースしたいと考えている「楽しみのための」プロジェクトに取り組んでいます。私は Arduino の Web 接続の注文通知機能を構築し、その Magento adminhtml インターフェイス側を構築しています。これは私がやっていることには複雑すぎるように思えるかもしれませんが、これには私にとって役立つ他のアプリケーションがあり、何か新しいことを学ぼうとしています.

そうは言っても、Magento バックエンドの「Reports」の横に新しい「Arduino」adminhtml メニュー項目を作成しました。Arduino からの特定のフィードバックによってモジュールが自動的に無効になる場合があります。その場合、他のサブメニュー項目がない限り、ページからメニュー項目を削除することが目標です。その場合、モジュール固有のメニュー項目のみを削除します。 . 繰り返しますが、これはこのプロジェクトにとってあまり現実的ではないように見えるかもしれませんが、これをできるだけ「正しく」行うために、これが私の目標であり、他の誰かが「Arduino」メニュー項目を潜在的に追加できる可能性を開いたままにしておくことです。

今、私はこれをうまく機能させています。問題なく、IFキャッシュはオフになっています。これは別の言い方をすれば、「これは機能しません。なぜなら、誰もがキャッシュを有効にしているからです」。そうは言っても、ここに私が始めたコードがあります:

/**
 * Used to disable the Arduino menu option dynamically.
 *
 * @param Varient_Event_Observer $observer
 */
public function controllerActionLayoutGenerateBlocksBefore(Varien_Event_Observer $observer)
{
    //We only want to disable the arduino menu if our module was specifically disabled in backend
    if(Mage::helper('mynamespace_myarduinomodule')->isDisabled())
    {
        /* @var $arduinoItems Varien_Simplexml_Element */
        /* @var $parent Varien_Simplexml_Element */
        $arduinoItems = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu/arduinomenu/children');
        $parent = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu');

        //If there are other menu options in the arduino menu option we only want to hide
        //the menu items related to our specific module, leaving the top level menu item alone
        if($arduinoItems->children()->count() > 1)
        {
            $parent->setNode("arduino/children/myarduinomodule", "", true);
        }
        //But, if not, then we want to hide the entire arduino tab
        else
        {
            $parent->setNode("arduino", "", true);
        }
    }

    return $this;

}

これは明らかにいくらかのオーバーヘッドを追加しますが、それは adminhtml セクションだけです。今、私の目標は「良い」解決策を持つことですが、それがあるかどうかはわかりません。私はこの非常に優れたブログ投稿を読みました。このようなものが私の目的には (逆に) うまくいくと思いますが、心配する必要がないように、クラスの書き換えを利用しないモジュールを作成することをお勧めします。他のモジュールで同じクラスを書き換えます。

この問題にどのようにアプローチするかについて、誰かアドバイスはありますか? カスタム メニュー項目を既存の「親」メニュー項目に追加する場合 (たとえば、「システム」の下に Arduino オプションを追加する場合)、同じキャッシュが問題になりますか?

お時間をいただき、この素晴らしいリソースをありがとうございました!

編集:

  • ログイン/バックアウトすると、既存の問題が「修正」され、メニューが適切に更新されるようです。もちろん、ユーザーに強制的にログアウトさせたくはありませんが、どこかに解決策があるのではないでしょうか?
4

2 に答える 2

1

それを機能させる唯一の方法は、変更を加えるたびにメニューキャッシュを消去することです. 次のコードを使用してそれを行うことができます:

Mage::app()->getCache()->clean(
    Zend_Cache::CLEANING_MODE_MATCHING_TAG, array(Mage_Adminhtml_Block_Page_Menu::CACHE_TAGS)
);
于 2012-10-18T20:17:34.777 に答える
0

メニューに空のテキストを残さずに項目を削除する方法のコード サンプル:

/**
 * Used to disable the Arduino menu option dynamically.
 *
 * @param Varient_Event_Observer $observer
 */
public function controller_action_layout_render_before(Varien_Event_Observer $observer)
{
    //We only want to disable the arduino menu if our module was specifically disabled in backend
    if(Mage::helper('mynamespace_myarduinomodule')->isDisabled())
    {
    $_config = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode();


    if($_config->menu->arduino->children){
        unset($_config->menu->arduino->children->myarduinomodule);
    }else{
        // hide the tab altogether
        unset($_config->menu->arduino);
    }
    Mage::getSingleton('admin/config')->getAdminhtmlConfig()->setXml($_config);

    return $this;

}
于 2014-04-22T14:17:28.930 に答える