开发者

Creating child CMS pages in Magento

I would like to create a subordinate set of CMS pages in Magento so that the breadcrumb navigation at the top of the page looks like this:

Home > Parent CMS Page > Child CMS Page

Even though I can specify a hierarchical relationship with the URL key field, 开发者_StackOverflow中文版it seems to be that all CMS pages in Magento are listed in the root directory by default:

Home > Child CMS Page

Any ideas?


You are right, there is no hierarchy of CMS pages in Magento. The best solution would be to create a real hierarchy by adding a parent_id to CMS pages and modifying the CMS module to handle nested URLs and breadcrumbs. But that requires a lot of coding.

A quick-and-dirty hack is to modify the breadcrumbs manually on each subpage by adding something like this to the layout update XML:

<reference name="root">
<action method="unsetChild"><alias>breadcrumbs</alias></action>
<block type="page/html_breadcrumbs" name="breadcrumbs" as="breadcrumbs">
    <action method="addCrumb">
        <crumbName>home</crumbName>
        <crumbInfo><label>Home page</label><title>Home page</title><link>/</link></crumbInfo>
    </action>
    <action method="addCrumb">
        <crumbName>myparentpage</crumbName>
        <crumbInfo><label>My Parent Page</label><title>My Parent Page</title><link>/myparentpage/</link></crumbInfo>
    </action>
    <action method="addCrumb">
        <crumbName>mysubpage</crumbName>
        <crumbInfo><label>My Sub Page</label><title>My Sub Page</title></crumbInfo>
    </action>
</block>
</reference>


I had the same problem with breadcrumbs and cms pages a few days ago check here ->

Similar to Anders Rasmussen post I edited every cms page manually

In breadcrumbs.phtml I added a little condition to define if a Page is a CMS page (thanks to Alan Storm) and remove standard crumb(s) and added new crumbs via xmllayout.

<?php
        if($this->getRequest()->getModuleName() == 'cms'){
            unset($crumbs['cms_page']);
        }
?>

xml:

<reference name="breadcrumbs">

<action method="addCrumb">
     <crumbName>cms_page_1st_child</crumbName>
    <crumbInfo><label>1st child</label><title>1st child</title><link>/1st child/</link></crumbInfo>
</action>

<action method="addCrumb">
     <crumbName>cms_page_2nd_child</crumbName>
    <crumbInfo><label>2nd child</label><title>2nd child</title></crumbInfo>
</action>

</reference> 

hope that helps, Rito


For enterprise (version 1.12) use this code at following file, location is: default->template->page->html->breadcrumb.phtml.

<?php
$cms_id = Mage::getSingleton('cms/page')->getPageId();
if($cms_id):

    if($_SERVER['REQUEST_URI']) {
        $trim_data  =   substr($_SERVER['REQUEST_URI'],1); 
        $data   =   explode('/',$trim_data);        
    }
    $cms_collection =   array();
    $url_full   =   '';
    $cms_enterprise =   '';

    foreach($data as $identifier)   {
        $page_data  =   Mage::getModel('cms/page')->getCollection()
                        ->addFieldToFilter('identifier', $identifier);          
        if($page_data)  {
            foreach($page_data as $single)  {
                if($single->getContentHeading() != null)    {                       
                    if($single->getPageId())    {
                        $cms_enterprise = Mage::getModel('enterprise_cms/hierarchy_node')->getCollection()
                                                ->addFieldToFilter('page_id', $single->getPageId());    
                        foreach($cms_enterprise as $single_enterprise)  {
                            $url_full   =   $single_enterprise->getRequestUrl();
                        }                       
                    }
                    $cms_collection[]   =   array($single->getTitle(), $single->getContentHeading(), $url_full );
                }   else    {                                   
                    if($single->getPageId())    {
                        $cms_enterprise = Mage::getModel('enterprise_cms/hierarchy_node')->getCollection()
                                                ->addFieldToFilter('page_id', $single->getPageId());    
                        foreach($cms_enterprise as $single_enterprise)  {
                            $url_full   =   $single_enterprise->getRequestUrl();
                        }                       
                    }
                    $cms_collection[]   =   array($single->getTitle(), $single->getTitle(), $url_full );
                }                   
            }       
        }
    }
    $count  =   count($cms_collection);
    $i  =   1;  
?>

    <?php   if(count($cms_collection)): ?>
    <div class="breadcrumbs">
        <ul>
            <li>
                <a href="<?php echo $this->getUrl() /*Home*/ ?>" title="<?php echo $this->__('Home'); /*Home Title*/ ?>">
                    <?php   echo $this->__('Home'); /*Home Name*/ ?>
                </a>    
                 <span>> </span>
            </li>   
            <?php foreach($cms_collection as $key=>$value): ?>                      
                <?php   if($i == $count):   ?>
                    <li>
                        <strong>
                                <?php   echo $value[1]; /*Name*/ ?>
                        </strong>   
                    </li>           
                <?php else: ?>  
                    <li>
                        <a href="<?php echo $this->getUrl().$value[2] /*Identifier*/ ?>" title="<?php echo $value[0] /*Title*/ ?>">
                            <?php   echo $value[1]; /*Name*/ ?>
                        </a>    
                         <span>> </span>
                    </li>           
                <?php endif; ?>
                <?php   $i++;   ?>
            <?php endforeach; ?>
        </ul>
    </div>
    <?php endif; ?>

<?php else: ?>
    <?php if($crumbs && is_array($crumbs)): ?>
    <div class="breadcrumbs">
        <ul>
            <?php foreach($crumbs as $_crumbName=>$_crumbInfo): ?>
                <li class="<?php echo $_crumbName ?>">
                <?php if($_crumbInfo['link']): ?>
                    <a href="<?php echo $_crumbInfo['link'] ?>" title="<?php echo $this->htmlEscape($_crumbInfo['title']) ?>"><?php echo $this->htmlEscape($_crumbInfo['label']) ?></a>
                <?php elseif($_crumbInfo['last']): ?>
                    <strong><?php echo $this->htmlEscape($_crumbInfo['label']) ?></strong>
                <?php else: ?>
                    <?php echo $this->htmlEscape($_crumbInfo['label']) ?>
                <?php endif; ?>
                <?php if(!$_crumbInfo['last']): ?>
                    <span>> </span>
                <?php endif; ?>
                </li>
            <?php endforeach; ?>
        </ul>
    </div>
    <?php endif; ?>

Thanks,

Kashif


This is my solution of the problem. I use custom layout for most of the CMS pages (default/template/page/cmsLayout.phtml) so I heve added following code into the layout file:

<div class="col-main">
    <?php  
        $urlPart=str_replace(Mage::getUrl(),'',Mage::getUrl('', array('_current' => true,'_use_rewrite' => true)));
        $urlPart=explode('/',$urlPart);
        $string='';
        $return='<div class="breadcrumbs"><ul><li class="home"><a href="'.Mage::getBaseUrl().'" title="Go to Home Page">Home</a><span> / </span></li>';
        $count=count($urlPart);
        foreach($urlPart as $value)
        {
          $count--;
          $string.='/'.$value;
          $string=trim($string, '/');
          $pageTitle = Mage::getModel('cms/page')->load($string, 'identifier')->getTitle();
          if($count==0)
              $return.='<li><strong>'.$pageTitle.'</strong></li>';
          else
              $return.='<li><a href="'.Mage::getBaseUrl().$string.'" title="'.$pageTitle.'">'.$pageTitle.'</a><span> / </span></li>';
        }  
    echo $return.'</li></ul></div>';
    ?>
    <?php echo $this->getChildHtml('global_messages') ?>
    <?php echo $this->getChildHtml('content') ?>
</div>


update -oops- this might be an enterprise feature only


There is a built-in CMS page hierarchy option in Magento.

To turn it on:

System > Configuration > General > Content Management > CMS Page Hierarchy - see here

To organise the hierarchy tree:

CMS > Pages > Manage Hierarchy

To manage the position of a page in the tree, after saving a page, go to its "hierarchy tab" - see the screenshot:

Creating child CMS pages in Magento

In the example the page "Our culture" is a child of "jobs" and not of the root directory


For Magento Enterprise, I have created an extension to solve this. It uses the built in CMS Hierarchy in the backend. The module is called Demac/BananaBread and shouldn't require any hacks or customization.

Direct download: here

Link to article: http://www.demacmedia.com/magento-commerce/introducing-demac_bananabread-adding-cms-breadcrumbs-from-the-hierarchy-in-magento/


I built a custom block as to generate the crumbs (removing the built-in and replacing with the custom one below in the layout):

namespace Uprated\Theme\Block\Html;

class UpratedBreadcrumbs extends \Magento\Framework\View\Element\Template
{
/**
 * Current template name
 *
 * @var string
 */
public $crumbs;
protected $_template = 'html/breadcrumbs.phtml';
protected $_urlInterface;
protected $_objectManager;
protected $_repo;

public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Framework\UrlInterface $urlInterface,
    \Magento\Framework\ObjectManagerInterface $objectManager,
    array $data = [])
{
    $this->_urlInterface = $urlInterface;
    $this->_objectManager = $objectManager;
    $this->_repo = $this->_objectManager->get('Magento\Cms\Model\PageRepository');
    $this->getCrumbs();

    parent::__construct($context, $data);
}

public function getCrumbs() {
    $baseUrl = $this->_urlInterface->getBaseUrl();
    $fullUrl =  $this->_urlInterface->getCurrentUrl();
    $urlPart = explode('/', str_replace($baseUrl, '', trim($fullUrl, '/')));

    //Add in the homepage
    $this->crumbs = [
        'home' => [
            'link' => $baseUrl,
            'title' => 'Go to Home Page',
            'label' => 'Home',
            'last' => ($baseUrl == $fullUrl)
        ]
    ];

    $path = '';
    $numParts = count($urlPart);
    $partNum = 1;
    foreach($urlPart as $value)
    {
        //Set the relative path
        $path = ($path) ? $path . '/' . $value : $value;

        //Get the page
        $page = $this->getPageByIdentifier($path);

        if($page) {
            $this->crumbs[$value] = [
                'link' => ($partNum == $numParts) ? false : $baseUrl . $path,
                'title' => $page['title'],
                'label' => $page['title'],
                'last' => ($partNum == $numParts)
            ];
        }
        $partNum++;
    }
}

protected function getPageByIdentifier($identifier) {
    //create the filter
    $filter = $this->_objectManager->create('Magento\Framework\Api\Filter');
    $filter->setData('field','identifier');
    $filter->setData('condition_type','eq');
    $filter->setData('value',$identifier);

    //add the filter(s) to a group
    $filter_group = $this->_objectManager->create('Magento\Framework\Api\Search\FilterGroup');
    $filter_group->setData('filters', [$filter]);

    //add the group(s) to the search criteria object
    $search_criteria = $this->_objectManager->create('Magento\Framework\Api\SearchCriteriaInterface');
    $search_criteria->setFilterGroups([$filter_group]);

    $pages = $this->_repo->getList($search_criteria);
    $pages = ($pages) ?  $pages->getItems() : false;

    return ($pages && is_array($pages)) ? $pages[0] : [];
}

Then used a slightly modified .phtml template to display them:

<?php if ($block->crumbs && is_array($block->crumbs)) : ?>
<div class="breadcrumbs">
    <ul class="items">
        <?php foreach ($block->crumbs as $crumbName => $crumbInfo) : ?>
            <li class="item <?php /* @escapeNotVerified */ echo $crumbName ?>">
            <?php if ($crumbInfo['link']) : ?>
                <a href="<?php /* @escapeNotVerified */ echo $crumbInfo['link'] ?>" title="<?php echo $block->escapeHtml($crumbInfo['title']) ?>">
                    <?php echo $block->escapeHtml($crumbInfo['label']) ?>
                </a>
            <?php elseif ($crumbInfo['last']) : ?>
                <strong><?php echo $block->escapeHtml($crumbInfo['label']) ?></strong>
            <?php else: ?>
                <?php echo $block->escapeHtml($crumbInfo['label']) ?>
            <?php endif; ?>
            </li>
        <?php endforeach; ?>
    </ul>
</div>
<?php endif; ?>

Working fine for me in 2.1

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜