如何为无名称的Magento订单商品渲染块扩展并添加参数
嘿,我来帮你解决这个问题!你提到的这个没有name属性、只有as="default"的订单商品默认渲染块,其实完全可以通过几种方式扩展它,实现显示新增的item-comment字段的需求。下面我给你一步步拆解可行的方案:
方案一:替换整个渲染块(最常用的方式)
这个方法适合需要对块逻辑做自定义修改的场景,步骤如下:
1. 创建自定义模块的布局文件
在你的自定义模块目录下,创建view/adminhtml/layout/sales_order_view.xml,内容如下:
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <!-- 找到订单商品列表的父块 --> <referenceBlock name="order_items"> <!-- 引用商品渲染器的容器块 --> <referenceBlock name="sales.order.view.items.renderer"> <!-- 替换原有的default渲染块,使用自定义的Block和模板 --> <block class="Your\CustomModule\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer" as="default" template="Your_CustomModule::order/view/items/renderer/default.phtml"/> </referenceBlock> <!-- 新增表头列(可选,如果你需要单独一列显示评论) --> <arguments> <argument name="columns" xsi:type="array"> <item name="item-comment" xsi:type="string" translate="true">Item Comment</item> </argument> </arguments> </referenceBlock> </body> </page>
2. 创建自定义Block类
在Your/CustomModule/Block/Adminhtml/Order/View/Items/Renderer/目录下创建DefaultRenderer.php,继承原Magento的渲染块,并添加获取自定义字段的方法:
<?php namespace Your\CustomModule\Block\Adminhtml\Order\View\Items\Renderer; class DefaultRenderer extends \Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer { /** * 获取订单商品的评论字段 * @return string */ public function getItemComment() { // 这里直接调用item的自定义字段,前提是你已经在sales_order_item表中添加了item_comment字段 return $this->getItem()->getItemComment(); } }
3. 复制并修改模板文件
复制Magento核心模块的模板文件vendor/magento/module-sales/view/adminhtml/templates/order/view/items/renderer/default.phtml到你的自定义模块目录view/adminhtml/templates/order/view/items/renderer/default.phtml,然后在合适的位置添加显示自定义字段的代码。比如在产品名称列之后添加新列:
<!-- 在原模板的产品名称列之后新增 --> <td class="col-item-comment"> <?= $block->escapeHtml($block->getItemComment()) ?> </td>
方案二:使用插件(Plugin)扩展原块(无需替换整个块)
如果你的需求只是新增字段显示,不需要修改太多块逻辑,可以用插件来扩展原Block的功能:
1. 创建插件类
在Your/CustomModule/Plugin/Adminhtml/Order/View/Items/Renderer/目录下创建DefaultRendererPlugin.php:
<?php namespace Your\CustomModule\Plugin\Adminhtml\Order\View\Items\Renderer; class DefaultRendererPlugin { /** * 为原Block新增获取item-comment的方法 * @param \Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer $subject * @return string */ public function getItemComment(\Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer $subject) { return $subject->getItem()->getItemComment(); } }
2. 配置插件
在你的自定义模块的etc/adminhtml/di.xml中添加插件配置:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer"> <plugin name="custom_module_order_item_renderer_plugin" type="Your\CustomModule\Plugin\Adminhtml\Order\View\Items\Renderer\DefaultRendererPlugin" sortOrder="10"/> </type> </config>
3. 修改模板文件
同样复制原模板到你的自定义模块,然后在模板中直接调用$block->getItemComment()来显示字段,同时在布局中添加表头列(和方案一的步骤一致)。
方案三:仅替换模板(最简单的快速实现)
如果你的item-comment字段不需要额外逻辑处理,直接从订单商品对象中获取即可,那你甚至不需要修改Block,只需要替换模板:
- 复制原模板到自定义模块目录;
- 在模板中直接添加代码:
<td class="col-item-comment"> <?= $block->escapeHtml($block->getItem()->getItemComment()) ?> </td>
- 在布局文件中替换原块的模板:
<referenceBlock name="sales.order.view.items.renderer"> <referenceBlock as="default" template="Your_CustomModule::order/view/items/renderer/default.phtml"/> </referenceBlock>
最后注意事项
- 记得替换
Your\CustomModule为你实际的模块命名空间; - 如果是新增数据库字段,要确保你的订单商品模型(
Magento\Sales\Model\Order\Item)已经能获取到这个字段,你可以通过扩展模型或者使用addAttributeToSelect的方式让模型加载该字段; - 执行
bin/magento setup:upgrade和bin/magento setup:static-content:deploy命令来让修改生效。
内容的提问来源于stack exchange,提问作者Alex Donnelly

