Templates 添加自定义仪表板的正确方法是什么;方框“;在Magento后端中不编辑默认模板?
我正在努力创建一个我希望有一天能够公开使用的Magento扩展(我提到这一部分是因为我在这里做“正确的事情”对我来说很重要)。我想做的一件事是在默认的Magento仪表板中添加一个框,基本上是一个新的“框”,除了我自己的内容外,它与“前5个搜索词”一模一样。我希望我的新自定义框是最后一个显示的框(理想情况下) 我遇到的问题是,负责呈现仪表板的模板调用了要呈现的特定块,而这些块嵌套在html中。换句话说,通常有一个区域会将子块渲染成一个合理的HTML元素,在这种情况下,似乎会渲染特定的块。以下是/app/design/adminhtml/default/default/template/dashboard/index.phtml的内容Templates 添加自定义仪表板的正确方法是什么;方框“;在Magento后端中不编辑默认模板?,templates,magento,dashboard,block,adminhtml,Templates,Magento,Dashboard,Block,Adminhtml,我正在努力创建一个我希望有一天能够公开使用的Magento扩展(我提到这一部分是因为我在这里做“正确的事情”对我来说很重要)。我想做的一件事是在默认的Magento仪表板中添加一个框,基本上是一个新的“框”,除了我自己的内容外,它与“前5个搜索词”一模一样。我希望我的新自定义框是最后一个显示的框(理想情况下) 我遇到的问题是,负责呈现仪表板的模板调用了要呈现的特定块,而这些块嵌套在html中。换句话说,通常有一个区域会将子块渲染成一个合理的HTML元素,在这种情况下,似乎会渲染特定的块。以下是/
如果我在自己的商店中进行此操作,我相信通过编辑基本Magento dashboard template index.phtml可以相对轻松地实现这一点。请添加我需要的块渲染内容,如:
但是,这不是我自己的商店,所以这似乎不是一个真正的选择
现在,经过一番思考,我的选择似乎如下(请注意,其中大多数似乎“不好”,而不是我在公众面前看到的超级自豪的东西):
0)一些我看不到的明显问题,您会告诉我这是完美/正确的解决方案
1) 我可能(也许?)能够将我的自定义块添加到该区域中的其他块(“TopSearchs”、“sales”等)中,并对我的块进行渲染。这看起来不太“干净”
2) 我可能能够在仪表板页面的其他地方呈现该块,然后使用javascript将其移动到正确的位置。我猜这相当容易,但出于明显的原因,感觉非常“黑”
是否有人对此有任何反馈,或者是否有办法?请记住,我想再次公开发布这个模块,所以我的目标是做好工作,尽可能少地进行“黑客攻击”
非常感谢您的阅读 没有真正干净的选项,正如您所说,模板是以不可扩展的方式编码的,因此总会有一定程度的黑客行为。这是我个人喜欢的使用事件观察者的方式。这样,它至少不会与其他模块冲突 首先,在事件之后为
core\u block\u abstract\u prepare\u layout\u和core\u block\u abstract\u添加一个观察者到事件之后的\u html\u。
您的模板需要适应这样一个事实,即您正在从同级中插入同级
,否则您应该可以。
你的模块
你的内容
就这样吧,因为父模板将为您关闭
和
(我知道这很难看)。我一直在寻找一个0)解决方案,但运气不好。到目前为止,我提出的最好的方法是通过观察html呈现,但它涉及到str_replace()
,这看起来从来都不是很干净。如果你感兴趣的话,我可以解释一下我是怎么做的。嘿,谢谢你的回复!我想我可以想象str_replace方法是如何工作的,但我可能会将其与我的其他解决方案一起,因为(显然)有点“黑客”。目前(我只花了几个小时试图弄清楚这一点)我个人最好的解决方案可能是JS解决方案,因为大多数人都会有JS,我可能会在其他地方渲染这个盒子,让它看起来很好,以防JS因任何原因无法工作,但如果它是移动到它需要的地方。我还是希望有人能睁开我的眼睛;)维奈,一如既往,你很棒。非常感谢您深思熟虑、条理清晰的回答。我当然可以看到这一点的好处,“黑客”这一点让我有点畏缩,但我想也许在这一点上,这可能是两个邪恶中较小的一个!关于为什么Magento会选择创建这些块,有什么见解吗?我想我不是第一个想在后端添加我自己的仪表板框的人。。。我知道选项卡(图位于仪表板上)更容易扩展/修改。再次感谢维奈!我也曾多次问过自己同样的问题。我认为这在当时似乎是一个很好的方法。也许今天它将以不同的方式构建,并考虑到可扩展性。
<adminhtml>
<events>
<core_block_abstract_prepare_layout_after>
<observers>
<your_module>
<class>your_module/observer</class>
<method>coreBlockAbstractPrepareLayoutAfter</method>
</your_module>
</observers>
</core_block_abstract_prepare_layout_after>
<core_block_abstract_to_html_after>
<observers>
<your_module>
<class>your_module/observer</class>
<method>coreBlockAbstractToHtmlAfter</method>
</your_module>
</observers>
</core_block_abstract_to_html_after>
</events>
</adminhtml>
class Your_Module_Model_Observer
{
public function coreBlockAbstractPrepareLayoutAfter(Varien_Event_Observer $observer)
{
if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index')
{
$block = $observer->getBlock();
if ($block->getNameInLayout() === 'dashboard')
{
$block->getChild('topSearches')->setUseAsDashboardHook(true);
}
}
}
public function coreBlockAbstractToHtmlAfter(Varien_Event_Observer $observer)
{
if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index')
{
if ($observer->getBlock()->getUseAsDashboardHook())
{
$html = $observer->getTransport()->getHtml();
$myBlock = $observer->getBlock()->getLayout()
->createBlock('you_module/block')
->setTheValuesAndTemplateYouNeed('HA!');
$html .= $myBlock->toHtml();
$observer->getTransport()->setHtml($html);
}
}
}
}
</fieldset></div>
<div class="entry-edit">
<div class="entry-edit-head"><h4>Your Module</h4></div>
<fieldset class="np">Your Content