8

なぜこれがとても難しいのかわかりません。これを正しく理解すれば目標を迅速に達成できるはずです...しかし、喜びはありません。

だから-私は私の最初のテーマを構築していて、それでもレイアウトに頭を悩ませています...

私は特にCatalog Product Viewページに取り組んでおり、このページを右の列のレイアウトから左の列のレイアウトに変換しています。ブロックを右から左に移動したいだけです。

デフォルトのcatalog.xmlでは、次のようproduct_list_relatedに定義されています。

     </catalog_product_view> 
     //...

     <reference name="right">
            <block type="catalog/product_list_related" name="catalog.product.related" before="-" template="catalog/product/list/related.phtml"/>
        </reference>
    </catalog_product_view>

私のlocal.xmlでは、単にこのブロックを移動しようとしています。

    <layout>

    // bunch other page directives

   <catalog_product_view>
        <reference name="root">
            <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        </reference>

        <reference name="right">
            <action method="unsetChild"><name>catalog.product.related</name></action>
        </reference>

        <reference name="left">
            <action method="insert"><blockName>catalog.product.related</blockName></action>

            // note that that "catalog.leftnav" gets inserted as expected
            <block type="catalog/layer_view" name="catalog.leftnav" after="-" template="catalog/layer/view.phtml"/>
        </reference>

    </catalog_product_view>

    </layout>

前述のようcatalog.leftnavに、挿入は期待どおりに機能するため、他のすべてが正しく設定されていると想定しています。テンプレートやその他のディレクティブを変更しない場合、ターゲットブロックは期待どおりにレンダリングされます。これにより、ブロックが適切に設定解除されて挿入されたら、ブロックをレンダリングする必要があることがわかります。

これは私を狂わせています...しかし、Magentoで他に何が新しいのか。

乾杯 -

b [] x

UPDATE

オーバーライドを機能させることができないためlocal.xml、変更されたにフォールバックしているだけですcatalog.xml。私はかなり賢い人です...これを機能させることができないのではないかと心配しています(そして、どのような場合でも、magentoは黙って失敗します)-しかし、この愚かな問題をいじくり回すのにもう時間を無駄にすることはできません。

次に進みます。

UPDATE, again. 

しばらく時間をかけて、今はmagentoで作業し、その複雑さに慣れてきました。local.xmlを正しく機能させる必要があるため、今日この問題に戻りました。

何が悪かったのかは本当にわかりませんが、この一連のディレクティブはようやく機能しました。

        <reference name="right">
                <action method="unsetChild">
                    <alias>catalog.product.related</alias>
                </action>
        </reference>

        <reference name="left">
                <action method="insert">
                    <block>catalog.product.related</block>
                </action>
        </reference>

これを扱っている他の人のために私が注意する重要なポイント:

Layout xmlディレクティブは、magentoクラス内で使用可能なメソッドを呼び出します。この場合、Page.xmlsの「Left」ブロックはタイプがで、そこからメソッドとMage_Core_Block_Textを継承します。Mage_Core_Block_AbstractunsetChildinsert

からMage_Core_Block_Abstract

/**
     * Unset child block
     *
     * @param  string $alias
     * @return Mage_Core_Block_Abstract
     */
    public function unsetChild($alias)
    {
        if (isset($this->_children[$alias])) {
            unset($this->_children[$alias]);
        }

        if (!empty($this->_sortedChildren)) {
            $key = array_search($alias, $this->_sortedChildren);
            if ($key !== false) {
                unset($this->_sortedChildren[$key]);
            }
        }

        return $this;
    }

  /**
     * Insert child block
     *
     * @param   Mage_Core_Block_Abstract|string $block
     * @param   string $siblingName
     * @param   boolean $after
     * @param   string $alias
     * @return  object $this
     */
    public function insert($block, $siblingName = '', $after = false, $alias = '')
    {
        if (is_string($block)) {
            $block = $this->getLayout()->getBlock($block);
        }
        if (!$block) {
            /*
             * if we don't have block - don't throw exception because
             * block can simply removed using layout method remove
             */
            //Mage::throwException(Mage::helper('core')->__('Invalid block name to set child %s: %s', $alias, $block));
            return $this;
        }
        if ($block->getIsAnonymous()) {
            $this->setChild('', $block);
            $name = $block->getNameInLayout();
        } elseif ('' != $alias) {
            $this->setChild($alias, $block);
            $name = $block->getNameInLayout();
        } else {
            $name = $block->getNameInLayout();
            $this->setChild($name, $block);
        }

        if ($siblingName === '') {
            if ($after) {
                array_push($this->_sortedChildren, $name);
            } else {
                array_unshift($this->_sortedChildren, $name);
            }
        } else {
            $key = array_search($siblingName, $this->_sortedChildren);
            if (false !== $key) {
                if ($after) {
                    $key++;
                }
                array_splice($this->_sortedChildren, $key, 0, $name);
            } else {
                if ($after) {
                    array_push($this->_sortedChildren, $name);
                } else {
                    array_unshift($this->_sortedChildren, $name);
                }
            }

            $this->_sortInstructions[$name] = array($siblingName, (bool)$after, false !== $key);
        }

        return $this;
    }

ローカルxmlパラメーターは重要です。したがって、名前ではなく(具体的には)、順番に次のようになります。

<reference name="left">
                <action method="insert">
                    <block>catalog.product.related</block>
                    <siblingName>catalog.leftnav</siblingName>
                    <after>1</after>
                    <alias>catalog_product_related</alias>
                </action>
        </reference>

最終的に、これによりlocal.xmlはシステムを操作するための非常に強力な方法になりますが、local.xmlとmagentoシステムに慣れていない場合は、数週間または数か月の作業に備えて、実際に頭を悩ませてください。

乾杯


さらに別のアップデート

移動したいブロックが削除されたという問題に何度か遭遇しました。レイアウトから削除されたブロックは永久に削除されるため、これは問題です。

ただし、Alan Stormの非常に便利なUnremoveプラグインを使用すると、実行した内容を元に戻すことができます。

<checkout_onepage_index>
    <x-unremove name="left" />
    <reference name="right">
        <action method="unsetChild">
            <alias>checkout.progress.wrapper</alias>
        </action>
    </reference>
    <reference name="left">
        <action method="insert">
            <block>checkout.progress.wrapper</block>
        </action>
    </reference>
</checkout_onepage_index>

レイアウトオブジェクトを監視し、後で参照できる削除されたブロックのリストを作成することで、この偉業を管理します。

良い!

4

7 に答える 7

19

これは今はほこりっぽいスレッドですが、記録のために、これは私が行った最後の答えです。

<reference name="right">
    <action method="unsetChild">
        <alias>checkout.progress.wrapper</alias>
    </action>
</reference>
<reference name="left">
    <action method="insert">
        <block>checkout.progress.wrapper</block>
    </action>
</reference>

Magentoはこれをあなたのに含めることをお勧めしますlocal.xml、そしてそれは効果的なテクニックを証明しました。

于 2012-08-22T16:08:08.813 に答える
2

別のアプローチは、ブロックを右から左に移動するのではなく、「右」ブロックの名前を「左」に変更することです。ただし、他の回答の場合と同じように、最初に「正しい」ブロックが削除されている場合、これは機能しません。

<remove name="left" />
<reference name="right">
  <action method="setNameInLayout"><name>left</name></action>
</reference>
<reference name="root">
  <action method="setChild"><alias>left</alias><name>left</name></action>
  <action method="unsetChild"><alias>right</alias></action>
</reference>
<!-- make sure nothing referencing "right" comes after this! -->
于 2012-03-15T22:43:36.100 に答える
2

出力を2col-rightから2col-leftに変更するだけの場合は、変更する方がはるかに簡単です。

<reference name="right" ...

<reference name="left" ...

子の設定を解除または挿入したり、何かを再宣言したりする必要はありません。あなたは物事を過度に複雑にし、不必要にコードを複製しています。

独自のデザインを作成している場合は、ディレクトリ全体をコピーしてから、ディレクトリから作業してサイトのスキンを変更することをお勧め./app/design/frontend/base./app/design/frontend/mypackageますmypackage/default。そのクリーンで簡単です。(変更しようとしているファイルだけでなく)すべてのファイルをコピーすると、アップグレード可能性の潜在的な問題についてコメントする人もいますが、これははるかに優れた方法であり、エラー、問題、および一般的なメンテナンスの可能性がはるかに低くなります。

編集:これをより詳細にフォローアップするには-https: //magento.stackexchange.com/a/3794/361をご覧ください

于 2012-03-15T20:00:03.653 に答える
1

「右」のブロックは、おそらく<remove name="right" />レイアウトのある時点で削除されています。その場合、これにより「catalog.product.related」ブロックが最初からレイアウトに追加されないため、「left」ブロックに挿入するブロックがなくなります。

これが問題であると確信していますが、確認のために、Mage :: log( "Removed $ blockName");を追加してください。forループ内のMage_Core_Model_Layout->generateXml()で、ページのロード後にログを確認します。

私が正しい場合は、<block..>をlocal.xmlにコピーして、「unsetChild」アクションと「insert」アクションを削除します。

于 2012-03-15T22:23:48.810 に答える
1

私はそれをこのようにします:例えばあなたのlocal.xmlで

<reference name="right"></reference>

ブロックを削除します。例:

<remove name="right.poll">

次に、ブロックを追加します

<reference name="left"></reference>
于 2012-05-03T15:49:14.917 に答える
0

ベース/デフォルトをローカルテーマにコピーするのは恐ろしい考えです。Magentoバージョンのアップグレードでコアテーマファイルを更新するたびに、アプリ/コード/コアファイルを変更するのと同じ脆弱性が発生します。アップグレード時にファイルを比較する必要があります。

適切なアクションは、追加またはオーバーライドを使用して単一のlocal.xmlを変更することです。それでも不十分な場合は、適切な構文を使用して、レイアウト定義とカスタムレイアウトXMLファイルを使用してapp / code/communityにモジュールを作成します。

于 2012-03-15T21:47:17.767 に答える
0

Magentoのレイアウトを変更するための最良の答えはClassyllama.comにあると思います

http://www.classyllama.com/development/magento-development/the-better-way-to-modify-magento-layout

removeタグを使用すると、コンテキストに関係なく、指定された名前のブロックがレイアウト全体から削除されます。したがって、コンテキストでright.newsletterを削除し、その名前がコンテキストで使用されている場合、両方のブロックが削除されます。removeはグローバルコンテキストで動作するため、要素を削除できるのは1回だけです。はcatalogsearch.xmlで呼び出されているため、設定を解除する必要があります。そうしないと、エラーが発生します。

<action method="unsetChild"><name>right.newsletter</name></action>;
于 2012-05-08T20:51:02.703 に答える