Magento2 - Komut Satırı - Blok Şablonlarını Kullanarak E-posta Gönderme - Hata: Gerekli $ argugHintsPath argümanı eksik


11

Magento 2'de komut satırından e-posta göndermeye çalışırken, aşağıdaki istisna ile karşılaştım. Bir ön uç veya arka uç denetleyicisinden e-posta göndermek için aynı sınıfı kullanırken mükemmel çalışıyor. Sorun, komut satırı arabirimi kullanılarak ciddi bir şekilde oluyordu.

İstisna:

main.CRITICAL: 'BadMethodCallException' iletisi ile 'İstenen bağımsız değişken eksik $ debugHintsPath of Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints.' /.../.../magento/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php:45 içinde

Sorun, yalnızca bir bloğu şablonun içinden mizanpaj yoluyla çağırmaya çalışırken de oluyordu. Engelleme çağrısı kaldırılır kaldırılmaz istisna gösterilmeyi bıraktı.

Şablon Dosyası:

Uygulamanın / kod / NameSpace / Modül / görünüm / kullanıcı arayüzü / e-posta / 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"}}

E-posta yine de konu satırı bozulmamış olarak gönderildi, ancak tüm içerik oluşturulmadı ve e-posta alındıktan sonra içerik bölümünde yalnızca aşağıdaki hata gösteriliyordu.

E-postaların içine yazdırılan hata:

Şablon filtreleme hatası: Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints argümanı $ debugHintsPath eksik.

Yanıtlar:


16

Sonunda bu sorunun çözümünü @ dunagan5887 tarafından sağlanan Magento Topluluğu Forumlarında buldum . Birçoğu bu istisna için iyi yönlendirilmiş bir çözümden faydalanabileceği için burada magento.stackexchange.com'da paylaşmaya karar verdim .

Orijinal Topluluk Forumu gönderisine bir bağlantı var: Bloklu e-posta şablonu

@ Dunagan5887 tarafından alıntılandığı gibi bu çözüm ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.

Çözüm, bu Basit Kod Satırından oluşur:

$ this -> _ objectManager-> configure ($ this -> _ configLoader-> yük ( 'adminhtml'));


Lütfen aşağıda çalışan bir sürüm komut satırı sınıfı bulun:

Uygulamanın / kod / NameSpace / Modül / Konsol / 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();
    }

    ...

}

Basitçe bölgeyi değiştirmek frontendiçin adminveya globaluygulamanın gerektirdiği şekilde.


[GÜNCELLEME]

Alan adminhtmlneden statik içerik dağıtma hataları

Bazı nedenlerden ötürü, alanın ayarlanması adminhtmlstatik içerikleri dağıtırken bazı hatalara neden oluyor gibi görünüyor .

Aşağıdaki gibi hatalar görüyorduk:

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

Başlangıçta bu hatanın max_allowed_packetMYSQL için düşük bir ayardan kaynaklanacağını düşündüm, ancak limit zaten yeterince yüksek olduğu ve sorunu çözmediği için daha fazla kazmaya karar verdim. Bir eleme sürecinden geçtikten sonra nihayet bunun benzer komut işlevlerini kullanan iki modül arasındaki ana fark olduğunu öğrendim, modüllerden biri en kısa sürede bu soruna neden oldu.

Bu sorunun veya çatışmanın kaynağını bulamamış olmama rağmen, bulgularımı burada paylaşmanın iyi bir fikir olacağını düşündüm, çünkü diğerleri yararlı bulabilir.


[GÜNCELLEME - 2]

Doğru yöntem:

Magento'yu 2.2.X'e yükselttikten sonra, bunun alanı ayarlamak için doğru yöntem olduğunu fark ettik:

Uygulamanın / kod / NameSpace / Modül / Konsol / 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

        ...

    }

    ...

}

Nesne Yöneticisi'ni kullanmadığımızı ve alanın yapıcı içinde DEĞİL gerektiren işlev içinde ayarlanması gerektiğini unutmayın. Bu, bölgeyi kurmanın resmi yoludur ve tüm Magento 2 sürümleriyle kusursuz bir şekilde çalışmalıdır.


Mevcut sınıfların bir listesi aşağıdaki sınıfta mevcuttur:

Magento \ Framework \ App \ Alanı

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';

    ...

Çok teşekkürler @ElGatito. Günümü kurtar. :) Bir günlük tekrar teşekkürler
Ankit Shah

Kapsamı küresel olarak belirledim ve benim için iyi çalışıyor.
Rakesh Jesadiya

1
UYARI: Bu kodu ( $objectManager->configure($configLoader->load('frontend'));) bir sınıfın yapıcısında KULLANMAYIN ! Yapılandırmayı geçerli alanınızdan farklı bir alandan yapar ve yüklerseniz, bu Magento 2'yi ciddi şekilde bozabilir!
Wesley Vestjens

@Wesley Vestjens +1 Yorumunuz için teşekkür ederiz. Doğru yöntem aslında çok farklı ve cevabımı yansıtmak için güncelledim. Lütfen [GÜNCELLEME - 2] bölümüne bakın .
ElGatito

Aslında, Magento 2'nin görünüm katmanının (Magento 2'de PDF dosyaları oluşturmak için gerekli) herhangi bir bölümünü kullanırsanız, yalnızca alanın ayarlanması işe yaramaz. Aşağıdaki nesne ile ilgili bir hata alırsınız: Magento\Developer\Model\TemplateEngine\Plugin\DebugHintsçünkü debugHintsPathdeğişken ayarlanmadı. ADMINHTML alanını yüklemek için orijinal kodunuzu kullanma DI yapılandırması çalışır veya debugHintsPathdeğişkenin manuel olarak ayarlanması çalışır, ancak başka kırık parçalar da olabilir. Bu aslında Magento'da bir "hata" dır, çünkü CLI'de görünüm katmanı öğelerini kullanmak mümkün değildir.
Wesley Vestjens

6

Magento'daki CLI'nin uygun bir alanı olmadığından, aşağıdaki geçici çözümü buldum:

Uygulamanın / kod / NameSpace / Modül / 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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.