Magento2 - Línea de comando - Enviar correo electrónico usando plantillas de bloque - Error: Falta el argumento requerido $ debugHintsPath

11

Al intentar enviar correos electrónicos en Magento 2 desde la línea de comandos, encontré la excepción a continuación. Mientras usaba la misma clase para enviar correos electrónicos desde un controlador front-end o back-end, funcionaba perfectamente. El problema estaba sucediendo estrictamente usando la interfaz de línea de comando.

Excepción:

main.CRITICAL: excepción 'BadMethodCallException' con mensaje 'Falta el argumento requerido $ debugHintsPath de Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints'. en /.../.../magento/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php:45

El problema también solo ocurría al intentar llamar a un bloque a través del diseño desde el interior de la plantilla. Tan pronto como se eliminó la llamada bloqueada, la excepción dejó de mostrarse.

Archivo de plantilla:

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"}}

El correo electrónico todavía se envió con la línea de asunto intacta, pero no se procesó todo el contenido y solo se mostró el error a continuación en la sección de contenido una vez que se recibió el correo electrónico.

Error impreso dentro de correos electrónicos:

Error al filtrar plantilla: falta el argumento requerido $ debugHintsPath de Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints.

ElGatito
fuente

Respuestas:

16

Finalmente encontré la solución a este problema en los foros de la comunidad de Magento, proporcionados por @ dunagan5887 . Decidí compartirlo aquí en magento.stackexchange.com ya que muchos pueden beneficiarse de una solución bien referida a esta excepción.

Hay un enlace a la publicación original del Foro de la comunidad: plantilla de correo electrónico con bloque

Parece que esta solución, según lo citado por @ dunagan5887 ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.

La solución consiste en esta simple línea de código:

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


Busque una clase de línea de comando de versión funcional a continuación:

app / code / NameSpace / Module / 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();
    }

    ...

}

Basta con cambiar el área de frontenda admin, o globalsegún lo requiera su aplicación.


[ACTUALIZAR]

Área que adminhtmlcausa errores de despliegue de contenido estático

Parece que, por algunas razones, establecer el área en adminhtmlestá causando algunos errores al implementar contenido estático.

Estábamos viendo errores como los siguientes:

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

Inicialmente pensé que este error sería causado por una max_allowed_packetconfiguración baja para MYSQL pero como el límite ya era lo suficientemente alto y aumentarlo no estaba resolviendo el problema, decidí profundizar más. Después de pasar por un proceso de eliminación, finalmente descubrí que esta era la principal diferencia entre dos módulos que usaban funciones de comando similares, de los cuales uno de los módulos estaba causando este problema tan pronto como estaba habilitado.

Aunque no he cavado para encontrar la fuente de este problema o conflicto, pensé que sería una buena idea compartir mis hallazgos aquí, ya que otros pueden encontrarlo útil.


[ACTUALIZACIÓN - 2]

El método correcto:

Después de actualizar Magento a 2.2.X nos dimos cuenta de que este es el método correcto para configurar el área:

app / code / NameSpace / Module / 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

        ...

    }

    ...

}

Tenga en cuenta que no utilizamos el Administrador de objetos y que el área debe establecerse dentro de la función que lo requiere y NO en el constructor. Esta es la forma oficial de configurar el área y debería funcionar perfectamente con todas las versiones de Magento 2.


Una lista de las áreas disponibles está disponible en la siguiente clase:

Magento \ Framework \ App \ Area

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
fuente
Muchas gracias @ElGatito. U salva mi día :) Gracias de nuevo un registro
Ankit Shah
He establecido un alcance global y está funcionando bien para mí.
Rakesh Jesadiya
1
ADVERTENCIA: ¡NO use ese código ( $objectManager->configure($configLoader->load('frontend'));) en el constructor de una clase! Si lo hace y carga la configuración desde un área diferente a su área actual, ¡esto puede romper seriamente Magento 2!
Wesley Vestjens
@Wesley Vestjens +1 Gracias por tu comentario. El método correcto es realmente muy diferente y he actualizado mi respuesta para reflejarlo. Consulte [ACTUALIZACIÓN - 2] .
ElGatito
En realidad, simplemente establecer el área no funciona si usa alguna parte de la capa de visualización de Magento 2 (que se requiere para generar archivos PDF en Magento 2). Obtendrá un error con respecto al siguiente objeto: Magento\Developer\Model\TemplateEngine\Plugin\DebugHintsporque la debugHintsPathvariable no está establecida. Usar su código original para cargar el área ADMINHTML de configuración DI funciona, o configurar manualmente la debugHintsPathvariable funciona, pero puede haber otras partes rotas. Esto es en realidad un "error" en Magento, porque no es posible usar elementos de capa de vista en la CLI.
Wesley Vestjens
6

Como CLI en Magento no tiene un área apropiada, descubrí la siguiente solución:

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>
rut4
fuente