階層化ナビゲーションのレイアウトを変更する


14

階層化されたナビゲーションがあり、顧客<select/>はリンクの長いリストの代わりにフィールドを持つことを望んでいます。

フィルターの名前/ IDが一致する場合、オブザーバーでテンプレートを変更することを考えました。

より良いアイデアや推奨事項はありますか?テンプレートを変更する代わりに、ブロックを上書き/書き換えするか、2つのフィルターのブロッククラスのみを変更しますか?

テンプレートの変更に使用するイベントは何ですか?

私はレイアウトのものを変更するオブザーバーを持っているため、ここで/programming/14524791/magento-enable-or-disable-a-module-in-code/14529629と同じ問題を抱えています。これはテーマにのみ関連します。更新を実行する前にテーマをチェックするのは良いアイデアかもしれませんか?


「顧客はリンクの長いリストの代わりにフィールドを持ちたい」これが何を意味するのか私には分かりません。
リックカイパーズ

くそー、stackexchangeは私の<select>を食べました
ファビアンBlechschmidt

1
catalog/layer/filter.phtmlテンプレートを上書きして必要なものを変更するだけで、テーマ固有のものにもなります。対処する必要があるのは、選択したフィルタービットだけです。<select>フィルターが選択されると、他のオプションが消えるため、いくつかのブロック機能を追加する必要がある可能性のある、選択されたすべてのフィルターを表示したいと思います。
リック

いいえ、顧客は選択ボックスとしてカテゴリと「サブカテゴリ」(属性)、チェックボックス付きのその他すべて(実行する作業)、さらに評価によるフィルタリングを希望します:-)その後、テンプレートにすべてを実装します。
ファビアンBlechschmidt

1
このコメントは私へのメモとして役立ちます。私はこれに対する答えを持っていますが、私の電話にいます。階層化されたナビゲーションでの作業が大好きです。以前のプロジェクトで複数のフィールドを選択できるように拡張しました(チェックボックスを考えてください)
ティムレイノルズ

回答:


6

OK、あなたがする必要があること:1. 'catalog / layer_view'ブロックをオーバーライドして、独自のテンプレートを設定します。1列のレイアウトの一部として、ヘッダー領域にレイヤードナビゲーションを配置します

<layout>
    <catalog_category_layered>        
        <reference name="header">
            <block type="catalog/layer_view" name="mylayered"  template="mymodule/catalog/layer/view.phtml"/>
        </reference>    
    </catalog_category_layered>
</layout>

そのテンプレートファイルでは、個々の要素に対してオーバーライドされたテンプレートを指定する必要があります。

<?php if($this->canShowBlock()): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Shop By') ?></span></strong>
    </div>
    <div class="block-content">
        <?php echo $this->getStateHtml() ?>
        <?php if ($this->getLayer()->getState()->getFilters()): ?>
            <div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
        <?php endif; ?>
        <?php if($this->canShowOptions()): ?>
            <p class="block-subtitle"><?php echo $this->__('Shopping Options') ?></p>
            <dl id="narrow-by-list">
                <?php $_filters = $this->getFilters() ?>
                <?php foreach ($_filters as $_filter): ?>
                <?php /* !!! HERE !!! */ ?>
                <?php if(some_condition == true){ $_filter->setTemplate('path/to/your/new/filter.phtml'); } ?>
                <?php if($_filter->getItemsCount()): ?>
                    <dt><?php echo $this->__($_filter->getName()) ?></dt>
                    <dd><?php echo $_filter->getHtml() ?></dd>
                <?php endif; ?>
                <?php endforeach; ?>
            </dl>
            <script type="text/javascript">decorateDataList('narrow-by-list')</script>
        <?php endif; ?>
    </div>
</div>
<?php endif; ?>

最後に、ドロップダウンfilter.phtmlを作成する必要があります。それは簡単です。このエディタで問題が発生しているため、フォーマットが不十分ですが、一般的な考え方はここにあります。いくつかのJavascriptも必要になります。

<ol>

    <li><select>
    <?php foreach ($this->getItems() as $_item): ?>
        <option value="<?php echo $this->urlEscape($_item->getUrl()); ?>">
        <?php if ($_item->getCount() > 0): ?>
        <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>"><?php echo $_item->getLabel() ?></a>
        <?php else: echo $_item->getLabel() ?>
        <?php endif; ?>
        <?php if ($this->shouldDisplayProductCount()): ?>
        (<?php echo $_item->getCount() ?>)
        <?php endif; ?>
    </option>
<?php endforeach ?>
</select></li>
</ol>

なぜレイアウトの書き換えを行うのですか?基本テンプレートをサイトテーマフォルダーにコピーするだけではどうですか?ここで何かが足りませんか(少し疲れて、生まれたばかりの病気の娘と一緒に一晩中起きていました)
-ProxiBlue

@dedmeet、おめでとうございます。同じ質問があります。単純なテーマテンプレートのオーバーライドで可能です。
リックカイパーズ

@Tim:私のモバイル投稿が[at] Timを飲み込んでしまったようです。
ProxiBlue

@dedmeetあなたがコメントすると、あなたが彼に言及しなくても、投稿の元のポスターは常に通知されます:)
mpaepper

申し訳ありませんが、はい、テンプレートの書き換えは機能します。レイヤードナビゲーションをメニューの下のページの中央に移動したと言いました。それは答えとは無関係だったので、私はそれを除外すべきだった。
ティムレイノルズ

10

core_block_abstract_prepare_layout_afterイベントを使用できますMage_Catalog_Block_Layer_Viewブロックの、特定の属性フィルターのテンプレートを変更。

次のようになります。

public function yourObserver($observer) 
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Layer_View) {
        $block->getChild($yourAttributeCodeGoesHere . '_filter')
           ->setTemplate('your/template.phtml');
    }
}

概要:

すべての子フィルターブロックには、階層化されたナビゲーションブロックにとしてエイリアスが[attribute_code]_filterあり、それらはすべて_prepareLayout()メソッドで作成されているため、テンプレートを簡単に変更できますcore_block_abstract_prepare_layout_afterイベント時に。

また、以下を呼び出すことで、現在のテーマが予想されたテーマと同じであることをオブザーバー内で確認できます。

$design = Mage::getSingleton('core/design_package')
$design->getPackageName(); // Returns current design package
$design->getTheme('layout'); // Returns current design layout

心から、イヴァン


子フィルターブロックにattribute_code_filterエイリアスが割り当てられている場合、なぜレイアウトxmlでテンプレートを単純に設定できないのですか?
pspahn

1
@pspahnレイアウトを介してエイリアスでアクセスできないため。出力を確認するとgetNameInLayout()、これらの各ブロックにはANNONYMOUS_30、ANNONYMOUS_23などの一意の名前が付いていることがわかります。したがって、これに依存することはできません。
イワンチェプルニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.