Как добавить пользовательский помощник в мой модуль?

9

Как создать новый Помощник или переопределить / переписать Core Helper в модуле Magento 2?

Я попытался добавить зависимость в свой module.xmlпользовательский модуль, но он совсем не загружает класс Helper.

Ниже мой module.xml;

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
  <module name="Company1_Module1" schema_version="1.0.0" setup_version="1.0.0">
        <sequence>Magento_Directory</sequence>
  </module>
</config>
Вики Дев
источник

Ответы:

20

Создайте: app/code/Company1/Module1/composer.json

{
    "имя": "компания1 / модуль-модуль1",
    "описание": "",
    "Требовать": {
        "php": "~ 5.5.0 | ~ 5.6.0 | ~ 7.0.0",
        "magento / framework": "100.0. *",
        "magento / module-ui": "100.0. *",
        "magento / module-config": "100.0. *",
        "magento / module-directory": "100.0. *"
    },
    "type": "magento2-module",
    "версия": "100.0.0",
    "лицензия": [
        "ОСЛ-3.0",
        "AFL-3.0"
    ],
    "автозагрузка": {
        "files": ["registration.php"],
        "PSR-4": {
            "Company1 \\ Module1 \\": ""
        }
    }
}

Создайте: app/code/Company1/Module1/registration.php

\ Magento \ Framework \ Component \ ComponentRegistrar :: регистр (
    \ Magento \ Framework \ Component \ ComponentRegistrar :: МОДУЛЬ,
    'Company1_Module1',
    __DIR__
);

Создайте: app/code/Company1/Module1/etc/module.xml

<? xml version = "1.0"?>
<config xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: framework: Модуль / etc / module.xsd">
    <module name = "Company1_Module1" setup_version = "2.0.0">
        <Последовательность>
            <module name = "Magento_Directory" />
        </ Последовательность>
    </ Модуль>
</ Config>

Создание модуля завершено. Теперь создайте вспомогательный класс внутри папки Helper .

app/code/Company1/Module1/Helper/Data.php:

Пространство имен Company1 \ Module1 \ Helper;

Класс Data extends \ Magento \ Framework \ App \ Helper \ AbstractHelper
{
    публичная функция someMethod ()
    {
        возврат 1;
    }
}

Как использовать вспомогательный класс внутри контроллера

$this->_objectManager->create('Company1\Module1\Helper\Data')->someMethod();

Как использовать вспомогательный класс внутри блока

публичная функция __construct (
        \ Magento \ Framework \ View \ Element \ Template \ Context $ context,
        \ Company1 \ Module1 \ Helper \ Data $ helper,
        массив $ data = []
    ) {
        $ this-> helper = $ helper;
        конструкция parent :: __ ($ context, $ data);
    }

Так $this->helperчто теперь экземпляр данных.

Для перезаписи любого класса вы можете использовать предпочтения .

app/code/Company1/Module1/etc/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">
    <preference for = "Magento \ Directory \ Helper \ Data" type = "Company1 \ Module1 \ Helper \ Data" />
</ Config>

Вы также можете использовать плагин. Плагин - лучший способ преодолеть конфликт переписывания. для получения дополнительной информации пример плагина

Сохель Рана
источник