templates - 在不编辑默认模板的情况下在 Magento 后端添加自定义仪表板 "box"的正确方法是什么?

标签 templates magento dashboard block adminhtml

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

我遇到的问题是负责呈现仪表板的模板调出要呈现的特定 block ,并且这些 block 嵌套在 html 中。换句话说,在通常有一个区域,子 block 将被呈现为一个漂亮合理的 HTML 元素,在这种情况下,似乎呈现了特定的 block 。这是/app/design/adminhtml/default/default/template/dashboard/index.phtml

的内容
  <div class="dashboard-container">
            <?php echo $this->getChildHtml('store_switcher') ?>
            <table cellspacing="25" width="100%">
                <tr>
                    <td><?php echo $this->getChildHtml('sales') ?>
                        <div class="entry-edit">
                            <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Orders') ?></h4></div>
                            <fieldset class="np"><?php echo $this->getChildHtml('lastOrders'); ?></fieldset>
                        </div>
                        <div class="entry-edit">
                            <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Search Terms') ?></h4></div>
                            <fieldset class="np"><?php echo $this->getChildHtml('lastSearches'); ?></fieldset>
                        </div>
                        <div class="entry-edit">
                            <div class="entry-edit-head"><h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div>
                            <fieldset class="np"><?php echo $this->getChildHtml('topSearches'); ?></fieldset>
                        </div>
                    </td>
                    <td>
                        <div class="entry-edit" style="border:1px solid #ccc;">
                            <?php echo $this->getChildHtml('diagrams') ?>
                            <?php if (is_array($this->getChild('diagrams')->getTabsIds())) : ?>
                                <div id="diagram_tab_content"></div>
                            <?php endif; ?>
                            <div style="margin:20px;">
                                <?php echo $this->getChildHtml('totals') ?>
                            </div>
                            <div style="margin:20px;">
                                <?php echo $this->getChildHtml('grids') ?>
                                <div id="grid_tab_content"></div>
                            </div>
                        </div>
                    </td>
                </tr>
            </table>
        </div>

如果我在自己的商店中执行此操作,我相信我可以通过编辑上面的基本 Magento 仪表板模板 index.phtml 来相对轻松地实现此目的,添加我需要的内容以进行 block 渲染,例如:

<div class="entry-edit">
     <div class="entry-edit-head">
         <h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div>
         <fieldset class="np"><?php echo $this->getChildHtml('myDashboardBox'); ?></fieldset>
     </div>
</div>

但是,这不是我自己的商店,所以这似乎不是一个真正的选择。

现在,经过一番思考后,我的选择似乎如下(请注意,其中大多数看起来“不好”,而不是我会非常自豪地在公众面前看到的东西):

0) 我没有看到你会告诉我的一些显而易见的事情是完美/正确的解决方案

1) 我可能(也许?)能够将我的自定义 block 添加到该区域中的这些其他 block 之一(“topSearches”、“sales”等)中,并呈现我的 block 。这看起来不是很“干净”

2) 我也许可以在仪表板页面的其他地方呈现该 block ,然后使用 javascript 将其移动到正确的位置。我猜这会相当容易,但由于显而易见的原因,感觉非常“hacky”。

是否有人对执行此操作的方式有任何反馈,或者是否有办法?请记住,我想再次公开发布此模块,因此我的目标是做好工作并尽可能少地进行“黑客攻击”。

非常感谢您的阅读!

最佳答案

没有真正干净的选项,正如您所说,模板是以不可扩展的方式编码的,因此总会有一定程度的 hackiness。这是我个人首选的使用事件观察器的方式。这样至少不会和其他模块冲突。

首先,为 core_block_abstract_prepare_layout_after 添加一个观察者和 core_block_abstract_to_html_after事件。

<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>

这两个事件是为在 Mage_Core_Block_Abstract 中实例化和呈现的每个 block 调度的.根据我的经验,在 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);
            }
        }
    }
}

您的模板需要适应您要插入同级 <div> 的事实从 sibling 的内部,但除此之外你应该没问题。

</fieldset></div>
<div class="entry-edit">
    <div class="entry-edit-head"><h4>Your Module</h4></div>
    <fieldset class="np">Your Content

就此打住,因为父模板将关闭 <fieldset><div>为你(丑陋,我知道)。

关于templates - 在不编辑默认模板的情况下在 Magento 后端添加自定义仪表板 "box"的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9218970/

相关文章:

html - div位置问题

c++ - 使用 SFINAE 检查类型是否可以绑定(bind)到模板模板参数

javascript - 增量按钮在 magento 中无法正常工作

mysql - Magento,我需要将第一个产品图像定义为缩略图

ruby-on-rails - Rails 仪表板设计 : one controller action per div

Azure IOT Suite如何创建仪表板来显示传感器数据

javascript - 解析时收集 Jinja2 标签调用

c++ - 当我创建一个模板时,我尝试使用它但是得到一个错误(C2668)和 IntelliSense 错误

c++ - 模板参数推导失败,使用函数指针作为参数

javascript - 产品页面上的数量发生变化时自动更新价格 Magento