Magento2 - Командний рядок - Надсилання електронної пошти за допомогою шаблонів блоків - Помилка: відсутній необхідний аргумент $ debugHintsPath


11

При спробі надсилання електронних листів у Magento 2 з командного рядка я зіткнувся з винятком нижче. Хоча для того самого класу для надсилання електронних листів з фронтального або резервного контролера працював ідеально. Проблема суворо відбувалася за допомогою інтерфейсу командного рядка.

Виняток:

main.CRITICAL: виняток "BadMethodCallException" з повідомленням "Відсутній необхідний аргумент $ debugHintsPath of Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints." в /.../.../magento/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php:45

Проблема також виникала лише при спробі викликати блок через макет зсередини шаблону. Як тільки виклик блоку було видалено, виняток перестав показувати.

Файл шаблону:

app / code / NameSpace / Module / view / frontend / email / email_notification.html

{{template config_path="design/email/header_template"}}

...

<!-- THIS LINE CAUSED THE EXCEPTION TO SHOW UP -->
{{layout handle="sales_email_order_items" order=$order area="frontend"}}

...

{{template config_path="design/email/footer_template"}}

Електронний лист як і раніше надсилався з цілісним рядком недоторканим, але весь вміст не видавались, і лише помилка нижче відображалася в розділі зі змістом після отримання електронного листа.

Помилка надрукована всередині електронних листів:

Помилка фільтрації шаблону: Відсутній необхідний аргумент $ debugHintsPath Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints.

Відповіді:


16

Нарешті я знайшов рішення цієї проблеми на форумах спільноти Magento, які надав @ dunagan5887 . Я вирішив поділитися ним тут на magento.stackexchange.com, оскільки багато хто може отримати користь від добре розглянутого рішення цього винятку.

Є посилання на оригінальний пост форуму спільноти: Шаблон електронної пошти з блоком

Здається, що це рішення, як цитує @ dunagan5887 ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.

Рішення складається з цього простого рядка коду:

$ this -> _ objectManager-> configure ($ this -> _ configLoader-> load ('adminhtml'));


Нижче знайдіть клас командного рядка робочої версії:

app / code / NameSpace / Модуль / Console / Command.php

<?php
namespace NameSpace\Module\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Magento\Framework\Exception\LocalizedException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class CustomCommandClass extends Command
{
    public function __construct(
        \Magento\Framework\App\State $state,
        \Magento\Framework\ObjectManagerInterface $objectManager,
        \Magento\Framework\ObjectManager\ConfigLoaderInterface $configLoader
    ) {
        $state->setAreaCode('frontend'); //SET CURRENT AREA
        $objectManager->configure($configLoader->load('frontend')); //SOLUTION
        parent::__construct();
    }

    ...

}

Просто змініть область з frontendна adminабо globalвідповідно до вимог вашої програми.


[ОНОВЛЕННЯ]

Область, що adminhtmlвикликає помилки розгортання статичного вмісту

Схоже, з певних причин встановлення області adminhtmlвикликає деякі помилки під час розгортання статичного вмісту.

Ми бачили помилки:

Fatal error: Uncaught Exception: Warning: Error while sending QUERY packet. PID=22912 in ../magento/vendor/magento/zendframework1/library/Zend/Db/Statement/Pdo.php on line 228 in ../magento/vendor/magento/framework/App/ErrorHandler.php:61

Спочатку я думав, що ця помилка буде викликана низькою max_allowed_packetнастройкою для MYSQL, але оскільки межа була досить високою, і підвищення її не вирішило проблему, я вирішив копати далі. Пройшовши процес елімінації, я нарешті з’ясував, що це головна відмінність двох модулів, що використовують аналогічні функції команд, від яких один із модулів викликав цю проблему, як тільки це було включено.

Хоча я не копав, щоб знайти джерело цього питання чи конфлікту, я вважав, що було б гарною ідеєю поділитися своїми висновками тут, оскільки інші можуть вважати його корисним.


[ОНОВЛЕННЯ - 2]

Правильний метод:

Після оновлення Magento до 2.2.X ми зрозуміли, що це правильний метод встановлення області:

app / code / NameSpace / Модуль / Console / Command.php

<?php
namespace NameSpace\Module\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Magento\Framework\Exception\LocalizedException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class CustomCommandClass extends Command
{
    public function __construct(
        \Magento\Framework\App\State $state,
    ) {
        $this->_appState = $appState;
        parent::__construct();
    }

    ...

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->_appState->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL); //SET CURRENT AREA

        ...

    }

    ...

}

Зауважте, що ми не використовуємо диспетчер об'єктів і що область повинна бути встановлена ​​в межах функції, яка вимагає цього, а НЕ в конструкторі. Це офіційний спосіб встановлення області, і він повинен бездоганно працювати з усіма версіями Magento 2.


Список доступних областей доступний у наступному класі:

Magento \ Framework \ App \ Область

class Area implements \Magento\Framework\App\AreaInterface
{
    const AREA_GLOBAL = 'global';
    const AREA_FRONTEND = 'frontend';
    const AREA_ADMIN    = 'admin';
    const AREA_ADMINHTML = 'adminhtml';
    const AREA_DOC = 'doc';
    const AREA_CRONTAB = 'crontab';
    const AREA_WEBAPI_REST = 'webapi_rest';
    const AREA_WEBAPI_SOAP = 'webapi_soap';

    ...

Велике спасибі @ ElGatito. Ти врятуєш мій день. :) Дякую ще раз журналу
Анкіт Шах

Я встановив масштаби як глобальні, і це добре для мене.
Ракеш Єсадія

1
УВАГА: НЕ використовуйте цей код ( $objectManager->configure($configLoader->load('frontend'));) у конструкторі класу! Якщо ви зробите та завантажите конфігурацію з іншої області, ніж ваша поточна область, це може серйозно зламати Magento 2!
Веслі Вестженс

@Wesley Vestjens +1 Дякуємо за ваш коментар. Правильний метод насправді дуже різний, і я оновив свою відповідь, щоб відобразити це. Будь ласка, зверніться до [ОНОВЛЕННЯ - 2] .
ElGatito

Власне, просто встановити область не працює, якщо ви використовуєте будь-яку частину шару перегляду Magento 2 (який необхідний для генерації PDF-файлів у Magento 2). Ви отримаєте помилку щодо наступного об'єкта: Magento\Developer\Model\TemplateEngine\Plugin\DebugHintsтому що debugHintsPathзмінна не встановлена. Використання оригінального коду для завантаження роботи DI-конфігурації області ADMINHTML або ручного встановлення debugHintsPathзмінної роботи, але можуть бути й інші зламані частини. Це насправді "помилка" в Magento, тому що використовувати елементи шару перегляду в CLI неможливо.
Веслі Вестєнс

6

Оскільки CLI в Magento не має відповідної області, я з'ясував наступне рішення:

app / code / NameSpace / Module / 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">
    <!-- Add this for sending email via cli -->
    <type name="Magento\Developer\Model\TemplateEngine\Plugin\DebugHints">
        <arguments>
            <argument name="debugHintsPath" xsi:type="string">dev/debug/template_hints_storefront</argument>
        </arguments>
    </type>
</config>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.