将类别工具栏移出产品/列表


8

我正在尝试将显示排序选项和寻呼机的工具栏移出产品列表,以便将其与面包屑和类别名称捆绑在一起。

发现此网站适用于旧版本的Magento,但不适用于CE 1.7或EE 1.12。

在注释中,有人使用一些代码将其移至根目录,但这也不起作用。这是将其移到类别/视图的代码,这将有所帮助:

$toolbar = $this->getChild('product_list')->getToolbarBlock();
$toolbar->setCollection($this->getChild('product_list')->getLoadedProductCollection());
echo $toolbar->toHtml();

如果还有另一种将面包屑分组的方法,则类别名称和工具栏会让我知道。

Answers:


13

Catalog/product_list并且catalog/product_list_toolbar彼此之间的配线槽如此之深,以至于您无法一起使用它们。但是,如果只想显示工具栏,则需要创建一个(几乎)空的product_list模板。

假设您要在面包屑块中显示工具栏,但这确实可以在任何块中使用。

将以下更新放在您的某个位置layout/local.xml(catalog_category_default也可能需要更新):

<catalog_category_layered>
    <reference name="breadcrumbs">
        <block type="catalog/product_list" name="toolbar_only" template="catalog/product/list/toolbar_only.phtml">
            <block type="catalog/product_list_toolbar" name="product_list_toolbar_only" template="catalog/product/list/toolbar.phtml">
                <block type="page/html_pager" name="product_list_toolbar_pager"/> 
            </block>    
            <action method="setToolbarBlockName"><name>product_list_toolbar_only</name></action>
        </block>            
    </reference>            
</catalog_category_layered>

在中创建一个单行产品列表模板template/catalog/product/list/toolbar_only.phtml

<?php echo $this->getToolbarHtml() ?>

然后,您可以在面包屑模板中的任何位置插入新块:

template/page/html/breadcrumbs.phtml

<?php echo $this->getChildHtml('toolbar_only'); ?>

这也是一种非常好的方法-我完全同意不惜一切代价将产品列表和工具栏保持在一起。我想听听您对我先前发布的javascript方法的看法。
jharrison.au 2013年

@Jan Tomka很好的答案!我一直在努力在工具栏和产品本身之间加一个障碍,而您的解决方案使之成为可能。谢谢!
Ronen Ness 2015年

这个答案的问题是,由于该catalog/product_list块存在两次,并且该catalog_block_product_list_collection方法被调度了两次(观察者正在观察),因此最终触发了可配置的色板观察者再次运行。这大大增加了类别页面的加载时间。
罗比·阿弗里尔

诚然。最初的答案是在可配置的色板出现之前写的(不是我当时检查了多个观察者的执行)。最好使用从catalog / product_list扩展的单独的块类型,并从_beforeToHtml()中删除事件分发。
2016年

4

在尝试通过布局XML和模板破解来移动工具栏时,我认为通过javascript来移动它要容易得多。我认为这种方式可以为您提供更多控制权,而不会破坏功能。

jQuery(document).ready(function($) {
     $(".breadcrumbs").after($(".category-products > .toolbar"));
});

请注意,此方法仅使用特定选择器移动第一个工具栏,而不移动最后一个工具栏 .category-products > .toolbar

有关为什么此方法最佳的更多理由:

  1. 产品列表和工具栏相互交织在一起,在它们的块中相互引用,因此在代码方面将它们保持在一起是很有意义的-它们齐头并进
  2. 更少的代码和更少的块逻辑更改意味着更少的错误弹出窗口
  3. 使用javascript,您可以轻松地将其移动到页面上的任意位置
  4. 使用布局XML,您只能将javascript包含在带有产品列表的页面上
  5. 通过javascript进行移动是可扩展的,并且面向未来-如果在Magento的新版本中产品列表或工具栏块后面的逻辑发生更改,此方法仍然有效。

我会完全采用这种方法,但是即使我知道Magento是javascript依赖的,我仍在尝试使该站点使用尽可能少的javascript。
凯尔

4

LuFFy的代码距离不远

要将块复制到站点的其他部分,可以获取主布局对象,然后仅按名称获取内容块

      $layout = Mage::app()->getLayout();
      $content = $layout->getBlock('content');
      $categoryProducts = $content->getChild('category.products');
      $productList = $categoryProducts->getChild('product_list');
      $toolbar = $productList->getToolbarBlock();
      $toolbar->setCollection($productList->getLoadedProductCollection());
      echo $toolbar->toHtml();

在哪里使用?
Pratik

@PratikCJoshi我将这段代码直接放在我的catalog / layer / view.phtml文件中,它可以正常工作,因此您应该可以将其放在希望工具栏出现的任何模板文件中。
gregdev '16

0

尝试代码:

getParentBlock();
$content = $parent->getChild(‘content’);
$categoryProducts = $content->getChild(‘category.products’);
$productList = $categoryProducts->getChild(‘product_list’);
$toolbar = $productList->getToolbarBlock();
$toolbar->setCollection($productList->getLoadedProductCollection());
echo $toolbar->toHtml();

那是注释中的相同代码,它给了我这个错误:Call to undefined function getParentBlock()
kel

哦...!!我在另一个网站上发现的相同。
Luffy
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.