1

レイアウトファイルから別のテーマのテンプレートファイルを読み込むことはできますか?だからのようなものの代わりに

<reference name="head">
    <block type="page/template_links" name="customvars" as="customVars" template="page/html/customvars.phtml"/>
</reference>

次のいずれかがあります。

 <reference name="head">
    <block type="page/template_links" name="customvars" as="customVars" template="page/html/customvars.phtml" template="otherTheme" />
</reference>

また:

<reference name="head">
    <block type="page/template_links" name="customvars" as="customVars" template="/app/design/frontend/default/otherTheme/page/html/customvars.phtml"/>
</reference>
4

3 に答える 3

1

ご覧のとおり、Mage_Core_Block_Template::getTemplateFile()これは標準の Magento では不可能です。

public function getTemplateFile()
{
    $params = array('_relative'=>true);
    $area = $this->getArea();
    if ($area) {
        $params['_area'] = $area;
    }
    $templateName = Mage::getDesign()->getTemplateFilename($this->getTemplate(), $params);
    return $templateName;
}

必要なのは、コードに$params['_package']とを設定することです。$params['_theme']開始点として、この情報をブロック パラメーターに格納し、それを$params配列にコピーできます。

ただし、製品およびカテゴリ パッケージのカスタム テーマを指定することはできます。

于 2012-11-21T09:51:18.960 に答える
0

これを達成したい人のために、この回答を追加しています。

別のテーマからテンプレートをロードするには、local.xml を同じ (通常の構成) に保ち、コントローラー内で、テンプレート ファイルを見つけるために使用するパッケージとテーマを指定する次のコードを追加する必要があります。

Mage::getSingleton('core/design_package')
->setPackageName('package')
->setTheme('theme');

このコードは、「カスタム デザイン」を使用しているときに、Magento がカテゴリ ページに異なるテーマを適用する方法から取られました。私のライブサイトの1つでテストされ、機能しています。

于 2016-04-25T09:02:25.267 に答える
0

イベント オブザーバーを使用すると、レンダリング命令のコンパイルの前にカスタム レンダリング構成を挿入できます。たまたま、これはコントローラー アクションの実行に接して発生します。これは、要求オブジェクトの関与を考えると適切なようです。観察するイベントはcontroller_action_layout_load_beforeで、これはオブザーバー ロジックです。

class Some_Observer
{
    /**
     * Observer to inject update handles via query string.
     *
     *
     * @param Varien_Event_Observer $o
     * @return void
     */
    public function addQueryStringHandle(Varien_Event_Observer $o)
    {
        $update  = $o->getLayout()->getUpdate();
        /* @var $update Mage_Core_Model_Layout_Update */

        $query = $o->getAction()->getRequest()->getQuery();

        if (is_array($query) && count($query)) {
            foreach ($query as $name => $param) {
                if($this->_isValidXmlName($name)) {
                    $update->addHandle('QS_'.$name); // QS_ prefix should prevent collisions
                }
            }
        }
    }

    /**
     * Check validity of arbitrary external string as XML safe
     *
     * @link http://stackoverflow.com/a/2519943/833795
     * @param string $name
     * @return bool
     */
    protected function _isValidXmlName($name)
    {
        try {
            new DOMElement($name);
            return true;
        } catch(DOMException $e) {
            return false;
        }
    }
}

./index.phpの末尾に以下を追加することで、効果を確認できます。

Zend_Debug::dump(Mage::app()->getLayout()->getUpdate()->getHandles());

このソリューションは、特にレイアウト キャッシュを有効にしてテストする必要があります。特定のパラメーターをホワイトリストに登録することも賢明かもしれません。

于 2012-11-23T19:58:26.197 に答える