我正在尝试在这种布局中更改“表单”块的模板:
<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”中更改它。我怎么能这样做?
答案 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');
}
}