XML方式
一种简单的方法是在模块文件夹中创建以下文件:view/frontend/layout/catalog_category_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">
<update handle="your_custom_handle"/>
</page>
它并不比PHP方式优雅,但根据您的发现,它更安全。
PHP方式
不幸的是,对于您而言,似乎PHP是实现基于类别所具有的参数动态创建句柄的唯一方法。
通过插件
而不是创建的插件的execute()
Action类的方法,你可以直接在创建插件addPageLayoutHandles()
的方法Magento\Framework\View\Result\Page
主要问题在于,每次调用此方法时都会调用该方法,并且您必须在插件代码中添加一些条件,以确保您位于类别视图页面上。
通过首选项
另一种方法是对类别视图操作类使用首选项:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Catalog\Controller\Category\View"
type="Vendor\Module\Controller\Category\View"/>
</config>
然后,在您的自定义控制器类中,您只需execute()
复制/粘贴原始方法并直接在此方法中添加您的修改即可覆盖该方法。
主要问题是,当您升级Magento安装时,如果将更改添加到原始的本机Magento操作类中,则它不会反映在您的自定义操作类中。
$page->getConfig()->addBodyClass()
加载并生成布局?目前,我仅在CMS页面上有类似的任务。