Magento - 类别页面上的面包屑

Jin*_*bhi 4 breadcrumbs magento

我在catalog/category/view.phtml页面上定义了这样的面包屑.

echo $this->getChildHtml('breadcrumbs')
Run Code Online (Sandbox Code Playgroud)

我想仅在类别页面上显示面包屑.我需要在代码上面添加其他任何内容吗?

我是否还需要在xml文件中定义它?

Raj*_*omy 10

Breadcumbs是Magento的一个结构块.这意味着它是Magento结构的一部分.因此,如果您需要重新定位breadcumb的位置,您确实需要更改magento布局结构定义.面包屑的定义是page.xml

地点: app/design/frontend/base/default/layout/page.xml

<default>
    ....
    <!-- bradcumb block definition -->
     <block type="page/html_breadcrumbs" name="breadcrumbs" as="breadcrumbs"/>

    ....
</default>
Run Code Online (Sandbox Code Playgroud)

显然getchildHtml(),在页面布局模板中使用方法调用此块.这些模板存在于该位置app/design/frontend/base/default/tempate/page/.看看那些文件.在这里,我将代码包含在1column.phtml模板中

 <div class="main">
     <?php echo $this->getChildHtml('breadcrumbs') ?>
    <div class="col-main">
        <?php echo $this->getChildHtml('global_messages') ?>
        <?php echo $this->getChildHtml('content') ?>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

你做错了什么

你的代码不会起作用.因为您使用了getChildHtml()方法来包含breadcumb块.如果您希望该代码有效,那么breadcumb块应该是定义的块的子块categor/view.phtml.定义此模板的块是Mage_Catalog_Block_Category_View.在布局文件中,此块以名称引用category.products.你可以看到这个块catalog.xml

你该怎么办

删除第breadcrumps一个

您不需要在每个页面中使用面包屑,并且您想要更改它现在看起来的位置.为此,您必须从默认布局中删除breadcrumb块.这将从每个页面中删除breadcrumb块.最好的方法如下所示

创建一个布局文件app/design/<package>/<theme>/layout/local.xml并将此代码放入其中

<layout>
    <default>
        <reference name="content">
            <remove name="breadcrumbs" />
        </reference>
    </default>
</layout>   
Run Code Online (Sandbox Code Playgroud)

Local.xml在处理完每个其他布局文件之后,文件最后是进程.所以这是去除breadcrumps块的理想场所.现在清除缓存并加载页面.你会看到breadcrump从每一页都消失了.

breadcrumps仅重新定义目录页面

现在,您只需将breadcrumb块放在类别页面中.正如我已经提到的,你需要做的是,让bredcrumbs阻止子进行catalog/category_view阻止.但这是另一个问题.通常,有两种类型的页面.具有分层导航的类别页面和没有分层导航的类别页面.Magento为这两种类型分别布局结构.因此,您需要为这两种类别类型指定面包屑块.

地点: app/design/<package>/<theme>/layout/catalog.xml

<catalog_category_default>
    ....
    <reference name="content">
            <block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml">
                <block type="page/html_breadcrumbs" name="breadcrumbss" as="breadcrumbss"/>

                ...
            </block>
            ...
    </reference>
    ....
</catalog_category_default>
<catalog_category_layered>
    ....
    <reference name="content">
            <block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml">
                <block type="page/html_breadcrumbs" name="breadcrumbss" as="breadcrumbss"/>

                ...
            </block>
            ...
    </reference>
    ....
</catalog_category_layered>
Run Code Online (Sandbox Code Playgroud)

工作还没有结束.现在你需要在模板文件中调用这个breadcrumbs块

档案: app/design/<package>/<theme>/template/catalog/category/view.phtml

<?php echo $this->getChildHtml('breadcrumbss'); ?>
Run Code Online (Sandbox Code Playgroud)

无论你需要在哪里打电话都可以view.phtml.你完成了.现在清除缓存并再次加载页面.

OOOPSSSS !!!!!

什么都不对?

但我们的区块肯定存在.要确认它,请打开面包屑模板文件并在其中放置任何文本.现在再次加载页面.您肯定会看到内容.那么之前发生的事情.让我们看看.

Breadcrumbs块是特殊块,我们需要在渲染之前设置一些数据.否则它将提供空结果.用于设置breadcrumbs块的方法是addCrumb().看看面包屑块Mage_Page_Block_Html_Breadcrumbs.我们需要看看_toHtml()方法,这就是将这个块转换为html的内容.

protected function _toHtml()
{
    if (is_array($this->_crumbs)) {
        reset($this->_crumbs);
        $this->_crumbs[key($this->_crumbs)]['first'] = true;
        end($this->_crumbs);
        $this->_crumbs[key($this->_crumbs)]['last'] = true;
    }
    $this->assign('crumbs', $this->_crumbs);
    return parent::_toHtml();
}
Run Code Online (Sandbox Code Playgroud)

因此,$this->_crumbs在调用此方法之前设置是至关重要的.否则,它会将一个空数组传递给breadcrumbs模板.这将在前端输出任何内容.这就是现在发生的事情.这意味着magento设置$this->_crumbs变量的方式随着我们现在的变化而变化.所以我们需要找到现在默认流程的破坏位置.

Magento $this->_crumbs使用addCrumb()在breadcrumbs块本身中定义的函数设置变量.我们来看看这个方法.

public function addCrumb($crumbName, $crumbInfo, $after = false)
{
    $this->_prepareArray($crumbInfo, array('label', 'title', 'link', 'first', 'last', 'readonly'));
    if ((!isset($this->_crumbs[$crumbName])) || (!$this->_crumbs[$crumbName]['readonly'])) {
       $this->_crumbs[$crumbName] = $crumbInfo;
    }
    return $this;
} 
Run Code Online (Sandbox Code Playgroud)

如您所见,这是负责使面包屑块处于活动状态的方法.您可以$this->_crumbs在此方法中看到该变量已设置.

对于类别页面,面包屑设置过程在caetgory视图块中开始.我们来看看类别视图块.那是

 `Mage_Catalog_Block_Category_View::_prepareLayout()`

 protected function _prepareLayout()
{
    parent::_prepareLayout();

    $this->getLayout()->createBlock('catalog/breadcrumbs');
    ....
}
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到它Mage_Catalog_Block_Breadcrumbs在布局准备期间创建了新的面包屑块.所以我们需要找到这个块的作用.

#Mage_Catalog_Block_Breadcrumbs::_preapareLayout()

protected function _prepareLayout()
{
    if ($breadcrumbsBlock = $this->getLayout()->getBlock('breadcrumbs')) {
        $breadcrumbsBlock->addCrumb('home', array(
            'label'=>Mage::helper('catalog')->__('Home'),
            'title'=>Mage::helper('catalog')->__('Go to Home Page'),
            'link'=>Mage::getBaseUrl()
        ));

        $title = array();
        $path  = Mage::helper('catalog')->getBreadcrumbPath();

        foreach ($path as $name => $breadcrumb) {
            $breadcrumbsBlock->addCrumb($name, $breadcrumb);
            $title[] = $breadcrumb['label'];
        }

        if ($headBlock = $this->getLayout()->getBlock('head')) {
            $headBlock->setTitle(join($this->getTitleSeparator(), array_reverse($title)));
        }
    }
    return parent::_prepareLayout();
}
Run Code Online (Sandbox Code Playgroud)

是的,它是.类别块的面包屑由此块设置.现在为什么它现在不适合我们.这是我们需要了解的最棘手的领域.

事情是这样的.我们在里面定义了breadcrumbs块catalog categoy view page.正如您可以看到此breadcrumb块在其布局中寻找块.不幸的是,该块现在不可用,因为该块实际上是在类别视图块内定义的.在此阶段,仅在此处可用的类别视图块上定义的块.当breadcrumbs阻止了insdie page.xml文件时,这个块将在这里可用.因此该方法将完美地工作.

现在我们怎么能超越这个呢?在我看来,有两种方法可以做到这一点

1. Use observer method

2. Change the definition of breadcrumbs block.
Run Code Online (Sandbox Code Playgroud)

我想用第二种方法.因为它是我们现在可用的最佳方法.这里我们需要做的是,我们需要复制按Mage_Catalog_Block_Breadcrumbs块执行的功能.相应地应用更改后,您的面包屑页面现在看起来像

<?php
/**
* Html page block
*
* @category Mage
* @package Mage_Page
* @author Magento Core Team <core@magentocommerce.com>
*/
class Rkt_CategoryBreadcrumbs_Block_Page_Html_Breadcrumbs extends Mage_Core_Block_Template
{
/**
* Array of breadcrumbs
*
* array(
* [$index] => array(
* ['label']
* ['title']
* ['link']
* ['first']
* ['last']
* )
* )
*
* @var array
*/
protected $_crumbs = null;
/**
* Cache key info
*
* @var null|array
*/
protected $_cacheKeyInfo = null;
protected $_title = null;
public function __construct()
{
    parent::__construct();
    $this->setTemplate('page/html/breadcrumbs.phtml');
    $this->addCrumb('home', array(
    'label'=>Mage::helper('catalog')->__('Home'),
    'title'=>Mage::helper('catalog')->__('Go to Home Page'),
    'link'=>Mage::getBaseUrl()
    ));
    $this->_title = array();
    $path = Mage::helper('catalog')->getBreadcrumbPath();
    foreach ($path as $name => $breadcrumb) {
    $this->addCrumb($name, $breadcrumb);
    $this->_title[] = $breadcrumb['label'];
    }
}
protected function _prepareLayout(){
    if ($headBlock = $this->getLayout()->getBlock('head')) {
    $headBlock->setTitle(join($this->getTitleSeparator(), array_reverse($this->_title)));
    }
    return parent::_prepareLayout();
}
public function addCrumb($crumbName, $crumbInfo, $after = false)
{
$this->_prepareArray($crumbInfo, array('label', 'title', 'link', 'first', 'last', 'readonly'));
if ((!isset($this->_crumbs[$crumbName])) || (!$this->_crumbs[$crumbName]['readonly'])) {
$this->_crumbs[$crumbName] = $crumbInfo;
}
return $this;
}
/**
* Get cache key informative items
*
* @return array
*/
public function getCacheKeyInfo()
{
if (null === $this->_cacheKeyInfo) {
$this->_cacheKeyInfo = parent::getCacheKeyInfo() + array(
'crumbs' => base64_encode(serialize($this->_crumbs)),
'name' => $this->getNameInLayout(),
);
}
return $this->_cacheKeyInfo;
}
protected function _toHtml()
{
if (is_array($this->_crumbs)) {
reset($this->_crumbs);
$this->_crumbs[key($this->_crumbs)]['first'] = true;
end($this->_crumbs);
$this->_crumbs[key($this->_crumbs)]['last'] = true;
}
$this->assign('crumbs', $this->_crumbs);
return parent::_toHtml();
}
public function getTitleSeparator($store = null)
{
$separator = (string)Mage::getStoreConfig('catalog/seo/title_separator', $store);
return ' ' . $separator . ' ';
}
}
Run Code Online (Sandbox Code Playgroud)

请注意,我只是将上面看到的内容应用于此块_construct,_prepareLayout()并且getTitleSeparator().而已 .我们完了

现在再次删除缓存并再次加载页面.它就是.我们的面包屑现在只出现在类别页面上.

注意:不要像我在这里描述的那样编辑核心文件.您需要在不触及核心文件的情况下执行这些操作.您需要根据我在此处提供的详细信息创建模块.

如果你没有时间.我已经为你做了.免费.