【问题标题】:Creating child CMS pages in Magento在 Magento 中创建子 CMS 页面
【发布时间】:2011-03-31 18:30:58
【问题描述】:

我想在 Magento 中创建一组从属 CMS 页面,以便页面顶部的面包屑导航如下所示:

Home > Parent CMS Page > Child CMS Page

尽管我可以用URL key 字段指定层次关系,但似乎Magento 中的所有 CMS 页面默认都列在根目录中:

Home > Child CMS Page

有什么想法吗?

【问题讨论】:

    标签: content-management-system magento


    【解决方案1】:

    我构建了一个自定义块来生成面包屑(删除内置并在布局中替换为下面的自定义块):

    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] : [];
    }
    

    然后使用稍微修改的 .phtml 模板来显示它们:

    <?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; ?>
    

    在 2.1 中对我来说工作正常

    【讨论】:

      【解决方案2】:

      更新 -oops- 这可能只是一个企业功能


      Magento 中有一个内置的 CMS 页面层次结构选项。

      打开它:

      系统 > 配置 > 常规 > 内容管理 > CMS 页面层次结构 - see here

      组织层次树:

      CMS > 页面 > 管理层次结构

      要管理页面在树中的位置,保存页面后,转到其“层次结构选项卡” - 请参见屏幕截图:

      在示例中,“我们的文化”页面是“工作”的子页面,而不是根目录的子页面

      【讨论】:

      • 这仅在 Magento EE 中。
      【解决方案3】:

      这是我解决问题的方法。我对大多数 CMS 页面(默认/模板/页面/cmsLayout.phtml)使用自定义布局,所以我在布局文件中添加了以下代码:

      <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>
      

      【讨论】:

        【解决方案4】:

        对于 Magento Enterprise,我创建了一个扩展来解决这个问题。它在后端使用内置的 CMS Hierarchy。该模块称为 Demac/BananaBread,不需要任何修改或自定义。

        直接下载:here

        文章链接:http://www.demacmedia.com/magento-commerce/introducing-demac_bananabread-adding-cms-breadcrumbs-from-the-hierarchy-in-magento/

        【讨论】:

          【解决方案5】:

          对于企业版(1.12 版),请在以下文件中使用此代码,位置为: 默认->模板->页面->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; ?>
          

          谢谢,

          卡西夫

          【讨论】:

            【解决方案6】:

            几天前我在面包屑和cms页面上遇到了同样的问题check here ->

            与 Anders Rasmussen 的帖子类似,我手动编辑了每个 cms 页面

            在 breadcrumbs.phtml 中,我添加了一个小条件来定义页面是否为 CMS 页面(感谢 Alan Storm)并删除标准面包屑并通过 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> 
            

            希望有帮助, 里托

            【讨论】:

            • 您是否必须为此 XML 文件中的每个 CMS 页面添加操作?
            • 是的,我想是的,但是由于这个答案已经很老了,它可能已经过时了。
            【解决方案7】:

            你是对的,Magento 中没有 CMS 页面的层次结构。最好的解决方案是通过向 CMS 页面添加 parent_id 并修改 CMS 模块以处理嵌套 URL 和面包屑来创建真正的层次结构。但这需要大量编码。

            一个快速而简单的技巧是通过在布局更新 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>
            

            【讨论】:

            • 谢谢!这正是我所做的,虽然它仍然只是一个手动覆盖,但它可以完美地工作。
            • 如果您有多个父母和多个孩子,我不确定这将如何工作。这不会在每个页面上输出完全相同的面包屑(不好)吗?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多