就像这个线程所说的那样:在Magento 1中覆盖Magento 2中的抽象类,
我可以创建一个全新的类。在Magento 2中,我们需要使用插件,但是插件仅允许我修改现有方法。如果我想添加新方法该怎么办?
例:
此类vendor/magento/module-ui/Component/AbstractComponent.php
具有一个数组数组:$components
,没有用于取消/删除该数组元素的函数。那么如何创建该功能呢?
就像这个线程所说的那样:在Magento 1中覆盖Magento 2中的抽象类,
我可以创建一个全新的类。在Magento 2中,我们需要使用插件,但是插件仅允许我修改现有方法。如果我想添加新方法该怎么办?
例:
此类vendor/magento/module-ui/Component/AbstractComponent.php
具有一个数组数组:$components
,没有用于取消/删除该数组元素的函数。那么如何创建该功能呢?
Answers:
我看不到如何在不完全重写课程的情况下做到这一点。在您的示例中,可以通过将XML中的“ disabled”项设置为“ data”参数来禁用单个组件。例如:
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="general">
<field name="title">
<argument name="data" xsi:type="array">
<item name="disabled" xsi:type="boolean">true</item>
</argument>
</field>
</fieldset>
</form>
这有效地从$components
数组中删除了“标题” 。
这是由于该类中的createChildComponent
方法Magento\Framework\View\Element\UiComponentFactory
:
protected function createChildComponent(
array $bundleComponents,
ContextInterface $renderContext,
$identifier
) {
list($className, $arguments) = $this->argumentsResolver($identifier, $bundleComponents);
if (isset($arguments['data']['disabled']) && (int)$arguments['data']['disabled']) {
return null;
}
$components = [];
foreach ($bundleComponents['children'] as $childrenIdentifier => $childrenData) {
$children = $this->createChildComponent(
$childrenData,
$renderContext,
$childrenIdentifier
);
$components[$childrenIdentifier] = $children;
}
$components = array_filter($components);
$arguments['components'] = $components;
if (!isset($arguments['context'])) {
$arguments['context'] = $renderContext;
}
return $this->objectManager->create($className, $arguments);
}
您可以在所需的方法之前,前后和之后使用类首选项。请检查文档以获取更多详细信息 http://devdocs.magento.com/guides/v2.1/extension-dev-guide/plugins.html
在M1中通过社区或本地目录重载自动加载器中M1中的类(如您所链接的问题中所建议的),由于非常好的原因,在M1中被认为是不好的做法。
通常,如果原始类在某些地方发生了更改,则您将失去升级Magento实例的能力,而您未在重载的类中考虑。
实际上,我想不出任何用例,您确实需要在抽象类中添加方法,因为您总是可以将自己的逻辑添加到自己的类中并将其集成到插件/观察者/ viewModel / xml配置中
最好的方法是,引入一个新类,为您的特定用例扩展抽象类,然后在需要时使用您的类。
如果您需要从Ui组件中删除元素,则还有一种更好的方法可以通过layout /布局处理器上的插件/更改需要它的js文件来实现。
因此,如果您描述您的特定用例,则可能会有更好的答案。