布局xml中的Magento条件块

时间:2013-09-02 10:37:14

标签: php magento magento-1.7

是不可能的或在布局xml文件写入条件,如果isset得到param x那x.phtml else y.phtml?我看到在动作控制器中解决了这个问题。但是我在其他模块中覆盖了动作。我认为xml更好。

Actualy我有一个来自完成模块的联盟计划的注册表格。我想覆盖这个动作并从2个表单中显示1。根据获得参数的价值。

3 个答案:

答案 0 :(得分:4)

有一种方法可以用几乎纯粹的xml来实现这个目的:

<强>背景
你可以从xml调用函数,它将返回值而不是静态值。

因此,在您的情况下,您可以对xml执行类似的操作以存档所需的行为:

    <reference name="your-block-name">
        <action method="setTemplate">
            <template helper="your_module/getTemplate">
                <param>a_default_template_if_wanted</param>
            </template>
        </action>
    </reference>

并在你的Data.php帮助器模块中,函数getTemplate可能如下所示:

public function getTemplate($defaultTemplate){
    //check for your get params

    if(Mage::app()->getRequest()->getParam('x')){
        return 'x.phtml';
    }
    return $defaultTemplate;
}

答案 1 :(得分:3)

实现这一目标的最佳方法是创建自己的模块并在XML中添加块,如下所示:

<block type="mymodule/someblock" name="my_block" as="myBlock" />

因此XML中没有任何模板参数。 在块中,在构造函数中设置模板,如下所示:

public function __construct() {
    parent::__construct();
    if($some_value == 'something') {
        $this->setTemplate('mymodule/first-template.phtml');
    } else {
        $this->setTemplate('mymodule/second-template.phtml');
    }
}

当然,你将用你需要的'if'替换'if'语句。

答案 2 :(得分:1)

我知道如果在configs中使用ifconfig语句,那就是使用$this->getChildHtml('child_name')但这不是你想要的唯一方法。

在您的情况下,我建议使用带有子块的主块,然后将条件语句放在主模板中并使用 <block type="core/template" name="master_block" template="folder/path/master_block.phtml"> <block type="core/template" name="sub_block_form1" template="folder/path/form1.phtml" /> <block type="core/template" name="sub_block_form2" template="folder/path/form2.phtml" /> </block> 。这样你就可以把你的逻辑放在一个模板中而不会污染你的配置(我想可能有办法)。

配置:

folder/path/master_block.phtml

<?php if ($this->someBlockMethod() === 'Something'): ?> <?php echo $this->getChildHtml('sub_block_form1'); ?> <?php else: ?> <?php echo $this->getChildHtml('sub_block_form2'); ?> <?php endif; ?>

{{1}}