如果存在具有相同名称的块,请设置块的模板

时间:2014-02-14 15:31:34

标签: magento

我正在尝试在这种布局中更改“表单”块的模板:

<adminhtml_sales_order_create_index>
...
    <reference name="root">
            <block type="adminhtml/sales_order_create" name="content">
                <block type="adminhtml/sales_order_create_form" template="sales/order/create/form.phtml" name="form">
...
                        <block type="adminhtml/sales_order_create_shipping_method" template="sales/order/create/abstract.phtml" name="shipping_method">
                            <block type="adminhtml/sales_order_create_shipping_method_form" template="sales/order/create/shipping/method/form.phtml" name="form" />
                        </block>
                        <block type="adminhtml/sales_order_create_billing_method" template="sales/order/create/abstract.phtml" name="billing_method">
                            <block type="adminhtml/sales_order_create_billing_method_form" template="sales/order/create/billing/method/form.phtml" name="form" />
                        </block>
                        <block type="adminhtml/sales_order_create_newsletter" template="sales/order/create/abstract.phtml" name="newsletter">
                            <block type="adminhtml/sales_order_create_newsletter_form" template="sales/order/create/newsletter/form.phtml" name="form" />
                        </block>
...

我做

<adminhtml_sales_order_create_index>
    <reference name="form">
        <action method="setTemplate">
            <template>my_module/sales/order/create/form.phtml</template>
        </action>
    </reference>
</adminhtml_sales_order_create_index>

但这不起作用。我认为因为名称形式的块之后存在于多个地方。我只想在块类型=“adminhtml / sales_order_create_form”中更改它。我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

@input

重写阻止不是最好的方法。最好观察'core_block_abstract_to_html_before'事件并在那里更改模板。像:

if ($observer->getBlock() instanceof Mage_Adminhtml_Block_Sales_Order_Create_Form) {
    $observer->getBlock()->setTemplate('my_module/newtemplate.phtml');
}

这有效,并且更好,因为如果其他人将重写此块,您将不会遇到模块冲突。但我认为这在布局层面上可能是可能的。

答案 1 :(得分:2)

虽然不是最漂亮的解决方案,但我也不知道在非唯一表单引用上设置模板的方法。

警告这是非常严重的,我真的不确定副作用,并且由于某种原因在构造函数中调用setTemplate是不够的我猜这是在比父母更早或更晚的阶段调用

class My_Module_Block_Adminhtml_Sales_Order_Create_Form extends Mage_Adminhtml_Block_Sales_Order_Create_Form
{
    public function _toHtml()
    {
        $this->setTemplate('my_module/sales/order/create/form.phtml');

        return parent::_toHtml();
    }
}

将写入添加到模块

    <blocks>
        <adminhtml>
            <rewrite>
                <sales_order_create_form>My_Module_Block_Adminhtml_Sales_Order_Create_Form</sales_order_create_form>
            </rewrite>
        </adminhtml>
    </blocks>

我真的希望有一个更好的解决方案。

答案 2 :(得分:0)

你的权利,这就是它不起作用的原因。 由于这个糟糕的命名,我想不出干净的方式。

然而,有几个选项不干净但可行:

1选项:将整个sales.xml复制到您自己的管理布局文件夹中,然后直接在其中更改模板。

2选项:“重写”“Mage_Adminhtml_Block_Sales_Order_Create_Form”并从代码中设置模板

3选项:订阅“adminhtml_block_html_before”并听取正确的阻止,然后更改模板。

但是如果你写一个社区模块,那么这些选项都不是很好。 如果是你自己的项目,我会去选项1

希望有所帮助

答案 3 :(得分:0)

要覆盖form中的billing_method名称form.phtml文件,您应该执行以下操作:

config.xml

<core_block_abstract_to_html_before>
   <observers>
       <mymodule_core_block_abstract_to_html_before>
              <class>MyModule_Model_MyPath</class>
              <method>setTemplateFile</method>
       </mymodule_core_block_abstract_to_html_before>
   </observers>
</core_block_abstract_to_html_before>

并在你的观察者中:

 public function setTemplateFile(Varien_Event_Observer $observer)
 {
        if ($observer->getBlock() instanceof Mage_Adminhtml_Block_Sales_Order_Create_Billing_Method_Form) {
            $observer->getBlock()->setTemplate('mymodule/sales/order/create/billing/method/form.phtml');
        }
 }