ম্যাজেন্টো 2-তে একটি হিসাবে মডিউলগুলিতে আমি কীভাবে কাস্টম এক্সএমএল ফাইল রাখতে পারি? (ম্যাজস্ট্যাকডে রহস্য প্রশ্ন 2)


22

ম্যাজস্ট্যাকডে বোনাস প্রশ্ন 500 পিসি অনুগ্রহের জন্য এবং এক বছরের জন্য বিনামূল্যে জেড-রে লাইসেন্স জয়ের সম্ভাবনা। আরও তথ্য পাওয়া যাবে >> এখানে <<

প্রশ্নগুলি Magento 2 কোর বিকাশকারী আন্তন ক্রিল দ্বারা প্রদত্ত / অনুপ্রেরণা সরবরাহ করে।

প্রশ্ন:

আমি একটি এক্সটেনশন তৈরি করছি যা কনফিগারেশনের একটি পৃথক সেট রয়েছে।
এই অর্থ আমি ব্যবহার করতে পারবেন না config.xmlবা routes.xmlবা fieldset.xmlবা অন্য কোন কনফিগ XML ফাইলের নামে আছে Magento।
উদাহরণ।

ধরা যাক যে আমি একটি 'টেবিল' কনফিগারটি সংজ্ঞায়িত করছি যাতে কলামগুলিতে সারি রয়েছে। আমি নীচে এই এক্সএমএল ব্যবহার করতে পারে। (এটি কল table.xml)

<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="path/to/table.xsd">
    <row id="row1">
        <column id="col1" sort="10" attr1="val1">
            <label>Col 1</label>
        </column>
    </row>
    <row id="row2">
        <column id="col1" sort="10" attr1="val1">
            <label>Col 1</label>
        </column>
        <column id="col2" sort="20" disabled="true" attr1="val2" >
            <label>Col 2</label>
        </column>
        <column id="col3" sort="15" attr1="val1">
            <label>Col 3</label>
        </column>
    </row>
</table>

তবে যদি অন্য কোনও এক্সটেনশান থাকে তবে table.xmlআমি এটি কনফিগার পাঠক দ্বারা তুলে নেওয়া উচিত এবং 2 বা আরও বেশি এক্সএমএল ফাইলগুলি একত্রিত করা উচিত। আমি বলতে চাইছি যদি দ্বিতীয় ফাইলটি এর মতো দেখায়

<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="path/to/table.xsd">
    <row id="row1">
        <column id="col2" sort="10" attr1="val2">
            <label>Col 2</label>
        </column>
    </row>
    <row id="row2">
        <column id="col1" sort="10" attr1="val5" />
    </row>
</table>

ফলাফলটি হবে যে দ্বিতীয় কলামটি প্রথম সারিতে যুক্ত হবে এবং এর জন্য মানটি attr1দ্বিতীয় এক্সএমএল দ্বারা ওভাররাইট করা হবে:

<table ....>
    <row id="row1">
        <column id="col1" sort="10" attr1="val1"> <!-- from first xml -->
            <label>Col 1</label>
        </column>
        <column id="col2" sort="10" attr1="val2"><!-- from second xml-->
            <label>Col 2</label>
        </column>
    </row>
    <row id="row2">
        <column id="col1" sort="10" attr1="val5"><!--they apear in both xmls with the same path and id and second one overrides the value for `attr1`-->
            <label>Col 1</label>
        </column>
        <column id="col2" sort="20" disabled="true" attr1="val2"><!-- from first xml -->
            <label>Col 2</label>
        </column>
        <column id="col3" sort="15" attr1="val1"><!-- from first xml -->
            <label>Col 3</label>
        </column>
    </row>
</table>

ম্যাজেন্টো 1 এ আমি কেবল কল করে এটি করতে পারতাম

 $merged = Mage::getConfig()->loadModulesConfiguration('table.xml')
            ->applyExtends();

আমি ম্যাজেন্টো 2-তেও কীভাবে একই কাজ করতে পারি?

উত্তর:


15

Magento 2 এ এটি \Magento\Framework\Config\Reader\Filesystemক্লাস দ্বারা পরিচালিত হয় । এই শ্রেণিটি আপনাকে মার্জ করতে চায় এমন xML ফাইল নির্দিষ্ট করতে দেয়।

নিম্নলিখিত অংশটি উপলব্ধ মডিউলগুলিতে পাওয়া সমস্ত ফাইলগুলিকে একত্রিত করবে এবং আউটপুটকে মার্জ করবে (এর থেকে স্নিপেট \Magento\Framework\Config\Reader\Filesystem)

/**
 * Load configuration scope
 *
 * @param string|null $scope
 * @return array
 */
public function read($scope = null)
{
    $scope = $scope ?: $this->_defaultScope;
    $fileList = $this->_fileResolver->get($this->_fileName, $scope);
    if (!count($fileList)) {
        return [];
    }
    $output = $this->_readFiles($fileList);

    return $output;
}

/**
 * Read configuration files
 *
 * @param array $fileList
 * @return array
 * @throws \Magento\Framework\Exception
 */
protected function _readFiles($fileList)
{
    /** @var \Magento\Framework\Config\Dom $configMerger */
    $configMerger = null;
    foreach ($fileList as $key => $content) {
        try {
            if (!$configMerger) {
                $configMerger = $this->_createConfigMerger($this->_domDocumentClass, $content);
            } else {
                $configMerger->merge($content);
            }
        } catch (\Magento\Framework\Config\Dom\ValidationException $e) {
            throw new \Magento\Framework\Exception("Invalid XML in file " . $key . ":\n" . $e->getMessage());
        }
    }
    if ($this->_isValidated) {
        $errors = [];
        if ($configMerger && !$configMerger->validate($this->_schemaFile, $errors)) {
            $message = "Invalid Document \n";
            throw new \Magento\Framework\Exception($message . implode("\n", $errors));
        }
    }

    $output = [];
    if ($configMerger) {
        $output = $this->_converter->convert($configMerger->getDom());
    }
    return $output;
}

সমাধানে আমি তৈরি করা ক্লাসটি প্রয়োজনীয় এক্সএমএল ফাইল সরবরাহ করার জন্য প্রসারিত করা হয়েছে এবং যাচাইকরণের জন্য এক্সএসডি ফাইলটি কোথায় পাওয়া যাবে তা নির্দিষ্ট করে ( সম্পূর্ণ উদাহরণের জন্য https://github.com/Genmato/MageStackTable দেখুন ):

namespace Genmato\TableXml\Model\Table;

class Reader extends \Magento\Framework\Config\Reader\Filesystem
{
    protected $_idAttributes = [
        '/table/row' => 'id',
        '/table/row/column' => 'id',
    ];

    /**
     * @param \Magento\Framework\Config\FileResolverInterface $fileResolver
     * @param \Magento\Framework\Config\ConverterInterface $converter
     * @param \Genmato\TableXml\Model\Table\SchemaLocator $schemaLocator
     * @param \Magento\Framework\Config\ValidationStateInterface $validationState
     * @param string $fileName
     * @param array $idAttributes
     * @param string $domDocumentClass
     * @param string $defaultScope
     */
    public function __construct(
        \Magento\Framework\Config\FileResolverInterface $fileResolver,
        \Magento\Framework\Config\ConverterInterface $converter,
        \Genmato\TableXml\Model\Table\SchemaLocator $schemaLocator,
        \Magento\Framework\Config\ValidationStateInterface $validationState,
        $fileName = 'table.xml',
        $idAttributes = [],
        $domDocumentClass = 'Magento\Framework\Config\Dom',
        $defaultScope = 'global'
    ) {
        parent::__construct(
            $fileResolver,
            $converter,
            $schemaLocator,
            $validationState,
            $fileName,
            $idAttributes,
            $domDocumentClass,
            $defaultScope
        );
    }

মার্জ হওয়া ডেটা পেতে আপনি কল করতে পারেন:

$output = $this->_objectManager->get('Genmato\TableXml\Model\Table\Reader')->read();

আউটপুটটি তখন মার্জড এক্সএমএলের একটি অ্যারে উপস্থাপনা।

সম্পাদনা করুন:

ফাইলগুলি যেভাবে পড়া হয় তা পরীক্ষা করার জন্য আমি একটি কার্যকারী উদাহরণ তৈরি করেছি ( https://github.com/Genmat/MageStackTable দেখুন )। সমাধান বিল্ড সহ উত্তর আপডেট করুন।


ভ্লাদিমির, এর আগে আজ আমি Domশ্রেণীর উদাহরণ সহ আপনার পূর্ববর্তী উত্তর সংস্করণটি দেখেছি । আমি উত্তর ব্যবহার Readerক্লাসে কাজ শুরু । ইতিমধ্যে আমি প্রশ্ন পৃষ্ঠাটি রিফ্রেশ করেছি এবং বুঝতে পেরেছি যে আপনি এটি করেছেন :-) +1
ওয়াজটেক নারুনিক

সম্পূর্ণ বিস্তারিত উত্তরের জন্য এবং গিথুব থেকে পোকি মডিউলটির জন্য ধন্যবাদ। ভবিষ্যতের রেফারেন্সের জন্য দয়া করে এটি সেখানে রেখে দিন। এখানে ... কিছু অনুগ্রহ আছে।
মারিয়াস

মারিয়াস, ধন্যবাদ! গিটহাবের মডিউলটি উপলব্ধ রাখবে।
ভ্লাদিমির কেরখফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.