更改分层导航的布局


14

我有一个分层的导航,客户想要<select/>字段而不是一长串链接。

我考虑过,如果过滤器的名称/ ID匹配,则只用观察者更改模板。

有更好的想法或建议吗?更改模板的替代方法,可能是覆盖/重写块,还是仅更改两个过滤器的块类?

什么事件用于更改模板?

然后,我遇到了与此处相同的问题/programming/14524791/magento-enable-or-disable-a-module-in-code/14529629,因为我有一个更改布局内容的观察者。这仅与主题相关。因此,在运行更新之前检查主题可能是一个好主意吗?


“客户希望使用字段而不是一长串链接”我不知道您的意思是什么。
里克·库珀斯

该死,
stackexchange

1
我会说只是覆盖catalog/layer/filter.phtml模板并更改您需要的内容,它也将是特定于主题的。您唯一需要处理的就是选定的过滤器位。我猜想您想显示<select>中可能需要添加一些Block函数的所有筛选器,因为一旦选择了筛选器,其他选项就会消失。
里克·库珀斯

不,客户希望将类别和“子类别”(属性)作为选择框,将所有其他内容与复选框(可完成的工作)并按等级过滤:-)但是,我将在模板中实现所有内容。
Fabian Blechschmidt

1
此评论为我提供了注释。我对此有一个答案,但是我在电话上。喜欢在分层Nav中工作。我将其扩展为支持在以前的项目中选择多个字段(请考虑复选框)
Tim Reynolds

Answers:


6

好的,您需要做的事情: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>

为什么要麻烦做布局重写?为什么不将基本模板复制到站点主题文件夹?我在这里想念什么吗(有点累,和我生病的新生女儿
通宵达旦

@dedmeet对你的女儿表示祝贺,我也有同样的问题。一个简单的主题模板覆盖就可以了。
里克·库珀斯

@Tim:我的手机信息似乎吞没了[at] Tim,因此,Tim收到了通知。
ProxiBlue

@dedmeet当您发表评论时,即使您不提及他,也总是会通知该帖子的原始张贴者:)
mpaepper 2013年

抱歉,是的,模板重写将起作用。我提到我将分层导航移动到菜单下方页面的中央。那与答案无关,所以我应该省略它。
蒂姆·雷诺兹

10

您可以core_block_abstract_prepare_layout_afterMage_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等。因此您不能依赖它。
伊万·谢普尔尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.