【问题标题】:Magento, default layout for the custom moduleMagento,自定义模块的默认布局
【发布时间】:2015-02-23 14:29:47
【问题描述】:

我只想在我的模块的左栏中添加一个块,而不是整个网站。

如果我将它放在<default> 标签中,它将显示在整个网站中,但我想做<mymodule_default> 之类的东西,可以吗?

我知道我可以将我的块放在每个layout_handler 中,例如:

 <mymodule_controllername_actionname>
    <reference name="left">
        <block type="mymodule/block" name="left_navigation" before="-" template="mymodule/left-nav.phtml" />
    </reference>
 </mymodule_controllername_actionname>

但这不是我想要的,我想这样做:

 <mymodule_default>
    <reference name="left">
        <block type="mymodule/block" name="left_navigation" before="-" template="mymodule/left-nav.phtml" />
    </reference>
 </mymodule_default>

还是不推荐?

谢谢

【问题讨论】:

    标签: php magento magento-layout-xml


    【解决方案1】:

    您只能为自定义模块设置布局。例如,您想要一个左侧列,您的布局文件应该是这样的,

    <?xml version="1.0"?>   
    <layout version="0.1.0">   
      <modulename_index_index>   
        <reference name="root">   
          <action method="setTemplate"><template>page/2columns-left.phtml</template></action>   
        </reference>
        <reference name="left">   
          <block type="modulename/left" name="modulename_left" template="modulename/left.phtml"/>   
        </reference>   
    
      </modulename_index_index>   
    </layout>   
    

    page/2columns-left.phtml 包含左侧列的内容。

    将此 xml 文件放在您的 app/design/frontend/default/THEME NAME/template/layout/module.xml 中

    别忘了告诉你的模块配置文件(config.xml)。应该是这样的,

    <config>
    ...
    <frontend>
    <layout>
              <updates>
                <modulename>
                  <file>modulename.xml</file>
                </modulename>
              </updates>
            </layout>
      ...
    </frontend>
    </config>
    

    更新:

    根据magento的布局rules,你可以在你的模块中添加&lt;default&gt;。因此它可以设置该模块对该模块中的所有页面(控制器)都可用。 而已。如果您有任何疑问,请告诉我。

    【讨论】:

    • 是的,但是这样我必须在每个布局处理程序中编写它,如果想用其他模块扩展我的模块并想添加任何链接到第一个模块,这可能是不可能的方式
    • 对不起。我找不到你。
    • 简单来说,我不想在每个布局处理程序中都写块,试图找到更好的方法
    • 请检查我的回答。
    • 你的意思是像&lt;default&gt; &lt;reference name="left"&gt; &lt;block type="modulename/left" name="modulename_left" template="modulename/left.phtml"/&gt; &lt;/reference&gt; &lt;/default&gt; 这样你的左块将在整个网站上可见,而不仅仅是在你的模块页面/控制器中
    【解决方案2】:

    有一种更优雅的方式来做到这一点:

    在您的模块 layout.xml 中,您可以创建一个句柄并在每个其他句柄中更新它,如下所示:

    <lista_default>
    
    <reference name="head">
    
    <action method="setText">        
        <text>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.4/js/tether.min.js"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
        </text>   
    </action>
    
    </reference>
    
    </lista_default>
    
    <lista_index_index>
    
        <update handle="lista_default" />
    
        <reference name="content">
    
        </reference>
    
    </lista_index_index>
    

    【讨论】:

    • 那是宾果游戏!感谢您发布此内容。
    【解决方案3】:

    在另一个网站上得到了答案,在这里复制它:

    您只能在每个控制器中添加布局更新句柄

    public function preDispatch()
    {
      parent::preDispatch();
      $this->getLayout()->getUpdate()
           ->addHandle('mymodule_default');
    }
    

    或在所有 &lt;mymodule_controllername_actionname&gt; 句柄中使用指令 &lt;update handle="mymodule_default"/&gt;

    例子:

    <mymodule_controllername_actionname>
        <update handle="mymodule_default"/>
        ...
    <mymodule_controllername_actionname>
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多