Templates 添加自定义仪表板的正确方法是什么;方框“;在Magento后端中不编辑默认模板?

Templates 添加自定义仪表板的正确方法是什么;方框“;在Magento后端中不编辑默认模板?,templates,magento,dashboard,block,adminhtml,Templates,Magento,Dashboard,Block,Adminhtml,我正在努力创建一个我希望有一天能够公开使用的Magento扩展(我提到这一部分是因为我在这里做“正确的事情”对我来说很重要)。我想做的一件事是在默认的Magento仪表板中添加一个框,基本上是一个新的“框”,除了我自己的内容外,它与“前5个搜索词”一模一样。我希望我的新自定义框是最后一个显示的框(理想情况下) 我遇到的问题是,负责呈现仪表板的模板调用了要呈现的特定块,而这些块嵌套在html中。换句话说,通常有一个区域会将子块渲染成一个合理的HTML元素,在这种情况下,似乎会渲染特定的块。以下是/

我正在努力创建一个我希望有一天能够公开使用的Magento扩展(我提到这一部分是因为我在这里做“正确的事情”对我来说很重要)。我想做的一件事是在默认的Magento仪表板中添加一个框,基本上是一个新的“框”,除了我自己的内容外,它与“前5个搜索词”一模一样。我希望我的新自定义框是最后一个显示的框(理想情况下)

我遇到的问题是,负责呈现仪表板的模板调用了要呈现的特定块,而这些块嵌套在html中。换句话说,通常有一个区域会将子块渲染成一个合理的HTML元素,在这种情况下,似乎会渲染特定的块。以下是/app/design/adminhtml/default/default/template/dashboard/index.phtml的内容


如果我在自己的商店中进行此操作,我相信通过编辑基本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