Magento2 - Command-Line - การส่งอีเมลโดยใช้เทมเพลตบล็อก - ข้อผิดพลาด: ไม่มีอาร์กิวเมนต์ที่จำเป็น $ 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 / รหัส / NameSpace / โมดูล / view / ส่วนหน้า / อีเมล์ / 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 of Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints

คำตอบ:


16

ในที่สุดผมก็พบว่าวิธีการแก้ปัญหานี้ในฟอรั่มวีโอไอพีของชุมชนซึ่งถูกจัดให้โดย@ 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-> กำหนดค่า ($ นี้ -> _ configLoader-> โหลด ( 'adminhtml'));


โปรดหาคลาสบรรทัดคำสั่งที่ใช้งานได้ด้านล่าง:

app / รหัส / NameSpace / โมดูล / คอนโซล / 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 / รหัส / NameSpace / โมดูล / คอนโซล / 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

        ...

    }

    ...

}

โปรดทราบว่าเราไม่ได้ใช้ประโยชน์จาก Object Manager และต้องตั้งค่าพื้นที่ภายในฟังก์ชั่นที่ต้องการไม่ใช่ในตัวสร้าง นี่เป็นวิธีที่เป็นทางการของการตั้งค่าพื้นที่และควรทำงานได้อย่างไม่มีที่ติกับ Magento 2 ทุกรุ่น


รายการของพื้นที่ที่มีอยู่มีอยู่ในคลาสต่อไปนี้:

วีโอไอพี \ 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 คุณบันทึกวันของฉัน :) ขอบคุณบันทึกอีกครั้ง
Ankit Shah

ฉันตั้งค่าขอบเขตเป็นส่วนกลางและทำงานได้ดีสำหรับฉัน
Rakesh Jesadiya

1
คำเตือน: อย่าใช้รหัสนั้น ( $objectManager->configure($configLoader->load('frontend'));) ใน Constructor ของคลาส! หากคุณทำและโหลดการกำหนดค่าจากพื้นที่อื่นนอกเหนือจากพื้นที่ปัจจุบันของคุณสิ่งนี้สามารถทำลาย Magento 2 ได้อย่างจริงจัง!
Wesley Vestjens

@Wesley Vestjens +1 ขอบคุณสำหรับความคิดเห็นของคุณ วิธีการที่ถูกต้องนั้นแตกต่างกันมากและฉันได้อัปเดตคำตอบเพื่อสะท้อน โปรดดู[Update - 2]
ElGatito

ที่จริงแล้วการตั้งค่าพื้นที่ไม่ทำงานหากคุณใช้ส่วนใดส่วนหนึ่งของเลเยอร์มุมมองของ Magento 2 (ซึ่งจำเป็นสำหรับการสร้างไฟล์ PDF ใน Magento 2) คุณจะได้รับข้อผิดพลาดเกี่ยวกับวัตถุต่อไปนี้: Magento\Developer\Model\TemplateEngine\Plugin\DebugHintsเนื่องจากdebugHintsPathไม่ได้ตั้งค่าตัวแปร การใช้รหัสต้นฉบับของคุณเพื่อโหลดการกำหนดค่าพื้นที่ ADMINHTML DI หรือการตั้งค่าdebugHintsPathตัวแปรทำงานด้วยตนเองแต่อาจมีส่วนที่แตกหักอื่น ๆ นี่เป็นข้อผิดพลาด "" ใน Magento เพราะไม่สามารถใช้องค์ประกอบเลเยอร์การดูใน CLI ได้
Wesley Vestjens

6

เนื่องจาก CLI ใน Magento ไม่มีพื้นที่ที่เหมาะสมฉันจึงหาวิธีแก้ปัญหาต่อไปนี้:

app / รหัส / NameSpace / โมดูล / 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.