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

2023-12-01

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

我遇到的问题是,负责渲染仪表板的模板调用要渲染的特定块,并且这些块嵌套在 html 内。换句话说,通常存在一个区域,子块将被渲染成一个漂亮合理的 HTML 元素,在这种情况下,似乎渲染了特定的块。这是内容/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 相对轻松地实现此目的,添加我需要进行块渲染的内容,例如:

<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)我可能(也许?)能够将我的自定义块添加到该区域的其他块之一(“topSearches”、“sales”等)中,并渲染我的块。这看起来不太“干净”

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

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

非常感谢您的阅读!


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

首先,添加一个观察者core_block_abstract_prepare_layout_after and core_block_abstract_to_html_after event.

<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。根据我的经验,在 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> from inside兄弟姐妹,但除此之外你应该没问题。

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

就这样吧,因为父模板将关闭<fieldset><div>为了你(丑陋至极,我知道)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Magento 后端添加自定义仪表板“框”而不编辑默认模板的正确方法是什么? 的相关文章

随机推荐

  • CGContext.init() -- 不再允许 NULL 颜色空间

    TL DR 在旧版 Obj C 代码中 颜色空间参数值为NULL 这在 Swift 等价物中是不允许的 使用什么价值 我继承的代码如下 unsigned char pixel 1 0 CGContextRef context CGBitma
  • 如何让 PHP 类构造函数调用其父类的父类构造函数?

    我需要 PHP 中的类构造函数调用其父类的构造函数parent s 祖父母 构造函数而不调用父构造函数 main class that everything inherits class Grandpa public function co
  • 将焦点设置在 WPF 中 ControlTemplate 内的控件上

    在我正在开发的应用程序中 我们有一堆自定义控件 其 ControlTemplates 在 Generic xaml 中定义 例如 我们的自定义文本框看起来类似于
  • Selenium 为什么将 firefox 驱动程序的acceptuntrustedcertificates 设置为 true 不起作用?

    我正在开发一些硒测试 我面临一个重要问题 因为当我使用安全连接测试我的网站时 我没有找到 真正的 解决方案 HTTPS 我在 stackoverflow 上找到的所有解决方案都已过时或不起作用 我正在 Firefox 中编写 Seleniu
  • 成功登录后 django admin 重定向

    我正在使用 Django 1 6 1 目前在我的项目中 成功管理登录后 管理系统将我带到管理仪表板 即 localhost 8000 admin 从这里我可以访问我的大部分应用程序 如用户 类别 组等 90 的时间我想访问用户管理页面 即
  • 针对 strcpy 但不针对 memcpy 的 C4996(函数不安全)警告

    我正在 VS2010 中编写代码 我碰巧在编译后看到编译器对 strcpy 和 sprintf 调用发出 C4996 警告 此函数或变量可能不安全 但是 我无法获得 memcpy 的类似警告 并且代码中可能还有一些类似的 不安全 函数调用
  • EC2微实例上的ubuntu在内存不足时自动重启Mysql

    当系统内存不足时 ubuntu 12 04会杀死mysql进程 Out of memory Kill process 17074 mysqld score 146 or sacrifice child 所以该进程最终被杀死 这种情况发生在服
  • 将路由组织到单独的文件中,在 Slim 中无法正常工作

    这是我的索引 php file use Psr Http Message ServerRequestInterface as Request use Psr Http Message ResponseInterface as Respons
  • 用ggplot中的函数定义的两条线之间的阴影区域[重复]

    这个问题在这里已经有答案了 我试图找到如何对 ggplot 中由函数定义的两条线之间的区域进行着色的可能性 我找到了一些使用 geom area 或 geom ribbon 的解决方案 但在这两种情况下 您都需要一个定义 ymin 和 ym
  • Google 地图动画相机位置 iOS 7 问题

    我正在尝试将 Google Maps API 安装到 iOS7 的应用程序中 在遵循 Google 的指南和视频后 我最终遇到了以下错误 GMSMapView animateToCameraPosition unrecognized sel
  • 如何在 Eclipse 中将控制台参数传递给应用程序?

    我在批处理文件中有以下行 java Client 127 0 0 1 9876 它包含我的 java 类的名称和两个参数 我的应用程序需要这些参数才能正常运行 在 Eclipse 中运行应用程序时有什么方法可以传递这些参数吗 这将使调试变得
  • 如何最好地控制迭代方向?

    我有一个装有大型对象的容器 复制这些对象的成本很高 我有时必须正常迭代整个容器 有时则必须反向迭代 一旦确定了迭代方向 我就不需要在飞行中更改 即不需要随机访问 我希望做这样的事情 include
  • Application_Start 未在 IIS 中触发

    在我的网络应用程序中 我在Global asax 中的 APPLICATION START 文件 当我在开发服务器上运行它时它一直在工作 然而 当我在 IIS 中托管它时 Application Start 事件未触发 任何人都可以帮我摆脱
  • 如何确定矩形何时重叠或相交?

    我找到了如何绘制矩形和一些代码来查找两个矩形何时重叠 但我无法连接这些过程 我有我想要的两个矩形 但无法确定它们是否相交 然后将此信息添加到列表框 这是我的代码 public partial class Form1 Form Graphic
  • 交替行颜色ListView xamarin表单

    我在 ListView 上绑定了一个 ObersvableCollection 我想改变我的 ListView 的行颜色 我找到了很多代码 但对我不起作用 如果你可以分享一个示例 样本 像这样 但我不知道我该怎么做 我使用 Visual S
  • R 中的历史方差误差分解图

    我在下面的链接中找到了如何估计 R 中 VAR 模型的历史方差分解 历史方差误差分解 Daniel Ryback Daniel Ryback 在 Excel 绘图中显示了结果 但我想用 ggplot 来准备它 所以我创建了一些行来获取它 尽
  • 打印给定元素排列的程序[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我最近参加了 ACM 认证的编程竞赛 这是我当时做不到的问题 给定一个包含 n 个元素的整数数组 编写一个程序来打印所有排列 请告诉我这道题该怎么做 有什么算法可以做这类题吗 假
  • 如何追踪 SIGABRT 的原因

    我出于示例目的展示了该问题的代码 但实际上我的问题是 我应该如何追踪和理解 SIGABRT 错误 我读过这个问题 sigabrt 没有错误消息 但是我认为这与我的问题无关 我下面将展示的示例显然不是 xib 问题 之前获得 SIGABRT
  • 如何在 Hyperledger Composer 中处理资产的表单、图像、视频

    在 Hyperledger Composer 模型文件中定义资产时 我们如何处理表单 图像 视频 有哪些可用的数据类型 例如 如果我的资产是房屋 并且我想存储房屋的图像 如何在资产中定义它 我已经参考过文档 它说可用的原始数据类型是字符串
  • 在 Magento 后端添加自定义仪表板“框”而不编辑默认模板的正确方法是什么?

    我正在努力创建一个我希望有一天能成为公开可用的 Magento 扩展的东西 我提到这一部分是因为我在这里做 正确的事 对我来说很重要 我想做的一件事是在默认的 Magento 仪表板中添加一个框 基本上是一个新的 框 与 前 5 个搜索词