Magento2 - कमांड-लाइन - ब्लॉक टेम्प्लेट का उपयोग करके ईमेल भेजना - त्रुटि: मिसिंग आवश्यक तर्क $ debugHintsPath


11

जब कमांड-लाइन से Magento 2 में ईमेल भेजने का प्रयास किया गया, तो मुझे नीचे दिए गए अपवाद का सामना करना पड़ा। एक दृश्यपटल या बैकएंड नियंत्रक से ईमेल भेजने के लिए एक ही वर्ग का उपयोग करते समय पूरी तरह से काम कर रहा था। समस्या सख्ती से कमांड लाइन इंटरफ़ेस का उपयोग कर रही थी।

अपवाद:

main.CRITICAL: संदेश के साथ 'BadMethodCallException' अपवाद 'मिसिंग आवश्यक तर्क $ MagugHintsPath का Magento \ Developer \ Model \ Template \ TemplateEngine \ Plugin \ DebugHints।' in/.../.../magento/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php:45

मुद्दा केवल तब भी हो रहा था जब टेम्पलेट के अंदर से लेआउट के माध्यम से एक ब्लॉक को कॉल करने का प्रयास किया गया था। जैसे ही ब्लॉक कॉल को हटाया गया, अपवाद दिखना बंद हो गया।

टेम्पलेट फ़ाइल:

एप्लिकेशन / कोड / namespace / मॉड्यूल / देखें / दृश्यपटल / ई-मेल / 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"}}

ईमेल अभी भी विषय पंक्ति के साथ भेजा गया था, लेकिन संपूर्ण सामग्री का प्रतिपादन नहीं किया गया था और ईमेल प्राप्त होते ही सामग्री अनुभाग में केवल नीचे की त्रुटि दिखाई दे रही थी।

ईमेल के अंदर मुद्रित त्रुटि:

टेम्परिंग टेम्प्लेट को त्रुटि: लापता तर्क $ डिबगहिंट के चिह्न Magento \ Developer \ Model \ Template \ine \ प्लगिन \ 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.

समाधान इस सरल लाइन कोड के होते हैं:

इस $ -> _ objectManager-> कॉन्फ़िगर ($ इस -> _ configLoader-> लोड ( 'adminhtml'));


कृपया नीचे एक वर्जन कमांड लाइन क्लास लगाएं:

एप्लिकेशन / कोड / 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_packetMYSQL के लिए कम सेटिंग के कारण होगी, लेकिन चूंकि सीमा पहले से ही काफी अधिक थी और इस मुद्दे को हल नहीं कर रही थी, मैंने आगे खुदाई करने का फैसला किया। एक उन्मूलन प्रक्रिया के माध्यम से जाने के बाद, मुझे अंततः पता चला कि यह समान आदेश कार्यों का उपयोग करने वाले दो मॉड्यूल के बीच मुख्य अंतर था, जिसमें से एक मॉड्यूल सक्षम होते ही इस समस्या का कारण बन रहा था।

हालांकि मैंने इस मुद्दे या संघर्ष के स्रोत को खोजने के लिए खुदाई नहीं की है, मुझे लगा कि मेरे निष्कर्षों को यहां साझा करना एक अच्छा विचार होगा क्योंकि अन्य इसे उपयोगी पा सकते हैं।


[अद्यतन - २]

सही विधि:

Magento को 2.2.X में अपग्रेड करने के बाद हमने महसूस किया कि यह क्षेत्र सेट करने की सही विधि है:

एप्लिकेशन / कोड / 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

        ...

    }

    ...

}

ध्यान दें कि हम ऑब्जेक्ट मैनेजर का उपयोग नहीं करते हैं और इस क्षेत्र को फ़ंक्शन के भीतर सेट करने की आवश्यकता होती है और निर्माणकर्ता में नहीं। यह क्षेत्र की स्थापना का आधिकारिक तरीका है और इसे सभी Magento 2 संस्करणों के साथ निर्दोष रूप से काम करना चाहिए।


उपलब्ध क्षेत्रों की एक सूची निम्न वर्ग में उपलब्ध है:

Magento \ फ्रेमवर्क \ अनुप्रयोग \ क्षेत्र

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 आपकी टिप्पणी के लिए धन्यवाद। सही विधि वास्तव में बहुत अलग है और मैंने इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट कर दिया है। कृपया [अद्यतन - २] देखें
एलगेटिटो

वास्तव में, यदि आप Magento 2 (जो Magento 2 में पीडीएफ फाइलों को बनाने के लिए आवश्यक है) के दृश्य परत के किसी भी हिस्से का उपयोग करने पर केवल क्षेत्र सेट करने से काम नहीं चलता है। आपको निम्न ऑब्जेक्ट के बारे में एक त्रुटि मिलेगी: Magento\Developer\Model\TemplateEngine\Plugin\DebugHintsक्योंकि debugHintsPathचर सेट नहीं है। ADMINHTML क्षेत्र DI कॉन्फ़िगरेशन कार्यों को लोड करने के लिए या debugHintsPathचर कार्यों को मैन्युअल रूप से सेट करने के लिए अपने मूल कोड का उपयोग करना , लेकिन अन्य टूटे हुए हिस्से भी हो सकते हैं। यह वास्तव में Magento में एक "बग" है, क्योंकि CLI में दृश्य परत तत्वों का उपयोग करना संभव नहीं है।
वेस्ले वेस्टजेन्स

6

मैगेंटो में सीएलआई के पास एक उपयुक्त क्षेत्र नहीं होने के कारण, मैंने निम्नलिखित समाधान निकाला है:

एप्लिकेशन / कोड / 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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.