我正在努力创建我希望有一天能公开使用的 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/