ম্যাজেন্টো 2: পুনর্লিখন নিয়ন্ত্রক


17

আমি ম্যাজেন্টো 2 তে কীভাবে একটি নিয়ামক (যা আসলেই একটি ক্রিয়া) পুনরায় লিখতে পারি?
আমি এখানে যেমন নির্দেশিত চেষ্টা করেছি :

আমার নিজস্ব একটি মডিউল Namespace_Moduleএকটি di.xmlফাইলের সাথে ডাকা হয়েছে , এটি বিবেচনায় নেওয়া হয়েছে, কারণ একই সিস্টেমটি মডেল এবং ব্লকগুলিতে কাজ করে
উদাহরণ:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <!-- this one doesn't work for a controller action -->
    <preference for="Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics" 
         type="Namespace\Module\Controller\Adminhtml\Dashboard\RefreshStatistics" />
    <!-- this one works for a model -->
    <preference for="Magento\Customer\Model\Resource\GroupRepository" 
        type="Namespace\Module\Model\Resource\Customer\GroupRepository" />
     <!-- this one works also for a block -->
    <preference for="Magento\Backend\Block\Dashboard" 
        type="Namespace\Module\Block\Backend\Dashboard" />
</config>

আমি আমার নিজের ক্রিয়া দিয়ে ড্যাশবোর্ড রিফ্রেশ পরিসংখ্যান প্রতিস্থাপন করার চেষ্টা করছি। উপরের মতো করে এটি করা, executeমূল ক্লাসের পদ্ধতিটি এখনও আমার নিজের নয় বরং কল হয়।
var/cacheএবং var/generationসাফ করা হয়েছে।



1
@TimHallman। ধন্যবাদ, তবে আমি কেবল এই জন্য একটি রাউটার লিখতে চাই না। আমি নিশ্চিত এটি করার একটি পরিষ্কার উপায় আছে।
মারিয়াস

উত্তর:


16

এটি পেয়েছি।
আসলে আমি প্রশ্নটিতে যা পোস্ট করেছি তা হ'ল একটি নিয়ামককে পুনরায় লেখার সঠিক উপায়।

<preference for="Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics" 
     type="Namespace\Module\Controller\Adminhtml\Dashboard\RefreshStatistics" />

সুন্দরভাবে কাজ করে
আমার জন্য সমস্যা ছিল। আমি উল্লেখ করতে ভুলে গেছি যে আমি কিছু মডিউল Magento2 অপসারণ করেছি এবং এর মধ্যে এটি ছিল Reportsমডিউল। আমি এটিকে প্রশ্নটিতে উল্লেখ করি নি কারণ আমি মনে করি না যে এটি তাৎপর্যপূর্ণ।
কন্ট্রোলারদের পুনরায় লেখার জন্য উপরের পদ্ধতিটি (এবং সম্ভবত অন্যান্য শ্রেণিগুলি) কাজ করে যদি আপনি পরিবর্তিত করার চেষ্টা করছেন এমন সমস্ত শ্রেণীর উপস্থিতি এবং তাদের সমস্ত অভিভাবক শ্রেণি।
সুতরাং আমি মুছে ফেলা হয়েছে যে মূল Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatisticsপ্রসারিত Magento\Reports\Controller\Adminhtml\Report\Statistics
ম্যাজেন্টো 2 এ Controllerসমস্ত সক্ষম মডিউলগুলির জন্য ফোল্ডার ফোল্ডারগুলি স্ক্যান করে রুটগুলি সংগ্রহ করা হয় এবং সেগুলি অ্যারেতে সংগ্রহ করা হয়।
এ পর্যন্ত সব ঠিকই.
আমি অন্যদের মধ্যে এই লাইনটি শেষ করছি:

[magento\backend\controller\adminhtml\dashboard\refreshstatistics] => Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics

তারপরে অনুরোধটি রুটের সাথে মিলে গেছে এবং সেই রুটের সাথে সম্পর্কিত magento\backend\controller\adminhtml\dashboard\refreshstatisticsবর্গটি সাবক্লাস হয় কিনা তা Magento চেক করে Magento\Framework\App\ActionInterface। যেহেতু রুটগুলি আমার শ্রেণীর সনাক্তকরণ এবং তাত্ক্ষণিক হওয়ার আগে সংগ্রহ করা হয়, তাই পুরানো শ্রেণিটি আমার নিজের পরিবর্তে বৈধ হয়ে যায়। এবং ক্লাসের প্যারেন্ট ক্লাসের Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatisticsঅস্তিত্ব নেই।

প্রতিবেদনের মডিউলটি অক্ষম রাখার তবে এটি কার্যকর করার একটি সমাধান হ'ল সমস্ত রুট পড়ার পদ্ধতির জন্য একটি ইন্টারসেপ্টর তৈরি করা এবং উপরে উল্লিখিত রুটটি প্রতিস্থাপন করা।

সুতরাং আমি এটি যোগ di.xml

<type name="Magento\Framework\App\Router\ActionList\Reader">
    <plugin name="namespace-module-route" type="Namespace\Module\Model\Plugin\ActionListReader" sortOrder="100" />
</type>

এবং আমার প্লাগইনটি এর মতো দেখাচ্ছে:

<?php
namespace Namespace\Module\Model\Plugin;

class ActionListReader
{
    public function afterRead(\Magento\Framework\App\Router\ActionList\Reader\Interceptor $subject, $actions)
    {
        $actions['magento\backend\controller\adminhtml\dashboard\refreshstatistics'] = 'Namespace\Module\Controller\Adminhtml\Dashboard\RefreshStatistics';
        return $actions;
    }
}

: - প্রসারিত করতে কিভাবে বিক্রেতা \ Magento \ মডিউল-ডিরেক্টরি \ মডেল \ PriceCurrency.php convertAndRound (), এখানে আমি পরিবর্তন স্পষ্টতা কিভাবে প্লাগিন এটা আমার এই ক্ষেত্রে অগ্রাধিকার ব্যবহার করতে বাধ্য ব্যবহার করতে হবে, এই ক্ষেত্রে
প্রদীপ কুমার

6

ডি.এক্সএমএলে থাকা কোনও মূল মডিউল প্রসারিত করতে অগ্রাধিকার ব্যবহার প্লাগইন ব্যবহার করবেন না

<type name="Magento\Catalog\Controller\Product\View">
    <plugin name="product-cont-test-module" type="Sugarcode\Test\Model\Plugin\Product" sortOrder="10"/>
</type>

এবং Product.php এ

public function aroundExecute(\Magento\Catalog\Controller\Product\View $subject, \Closure $proceed)
{
    echo 'I Am in Local Controller Before <br>';
    $returnValue = $proceed(); // it get you old function return value
    //$name='#'.$returnValue->getName().'#';
    //$returnValue->setName($name);
    echo 'I Am in Local Controller  After <br>';
    return $returnValue;// if its object make sure it return same object which you addition data
}

কোর ব্লক, মডেল এবং নিয়ন্ত্রণকারীকে ওভাররাইড কীভাবে করবেন age


2
হ্যাঁ, এটি সেরা অনুশীলন। তবে আমার ক্ষেত্রে আমি মডিউলটি সরিয়ে দিয়েছি যেটিতে আমি ওভাররাইড করার চেষ্টা করছি এমন নিয়ামক দ্বারা বর্ধিত একটি ক্লাস রয়েছে। সুতরাং aroundআমার জন্য কাজ করবে না। আমি মূল কন্ট্রোলারের আচরণ পুরোপুরি পরিবর্তন করতে চেয়েছিলাম।
মারিয়াস

আপনি যদি পুরো আচরণটি পরিবর্তন করতে চান তবে আরও একটি নতুন ক্রিয়া তৈরি করুন এবং তারপরে আপনার যেখানে প্রয়োজন হবে কেবল url পরিবর্তন করুন, আমি আশা করি এটি ভাল ধারণা হবে
প্রদীপ কুমার

2

পর্যালোচনা মডেলের জন্য আমার কাছে পুনর্লিখনের নিয়ামক রয়েছে। রচনা ফাইল:

{
        "name": "apple/module-review",
        "description": "N/A",
        "require": {
            "php": "~5.5.0|~5.6.0|~7.0.0",
            "magento/framework": "100.0.*"
        },
        "type": "magento2-module",
        "version": "100.0.2",
        "license": [
            "OSL-3.0",
            "AFL-3.0"
        ],
        "autoload": {
            "files": [
                "registration.php"
            ],
            "psr-4": {
                "Apple\\Review\\": ""
            }
        }
    }

রেজিস্ট্রেশন.এফপি ফাইল

    \Magento\Framework\Component\ComponentRegistrar::register(
        \Magento\Framework\Component\ComponentRegistrar::MODULE,
        'Apple_Review',
        __DIR__
    );

অ্যাপ্লিকেশন / কোড / অ্যাপল / পর্যালোচনা / ইত্যাদি / মডিউল.এক্সএমএল ফাইল:

    app/code/Apple/Review/etc/di.xml file for override review controller.
    <?xml version="1.0"?>
    <!--
    /**
     * Copyright © 2015 Magento. All rights reserved.
     * See COPYING.txt for license details.
     */
    -->
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <preference for="Magento\Review\Controller\Product\Post" type="Apple\Review\Controller\Post" />   
    </config>

পর্যালোচনা মডেলের জন্য নিয়ন্ত্রক ফাইলে,

অ্যাপ্লিকেশন / কোড / আপেল / পর্যালোচনা / কন্ট্রোলার / post.php

    use Magento\Review\Controller\Product as ProductController;
    use Magento\Framework\Controller\ResultFactory;
    use Magento\Review\Model\Review;

    class Post extends \Magento\Review\Controller\Product\Post
    {
        public function execute()
        {
           $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
            if (!$this->formKeyValidator->validate($this->getRequest())) {
                $resultRedirect->setUrl($this->_redirect->getRefererUrl());
                return $resultRedirect;
            }

            $data = $this->reviewSession->getFormData(true);
            if ($data) {
                $rating = [];
                if (isset($data['ratings']) && is_array($data['ratings'])) {
                    $rating = $data['ratings'];
                }
            } else {
                $data = $this->getRequest()->getPostValue();
                $rating = $this->getRequest()->getParam('ratings', []);
            }

            if (($product = $this->initProduct()) && !empty($data)) {
                /** @var \Magento\Review\Model\Review $review */
                $review = $this->reviewFactory->create()->setData($data);

                $validate = $review->validate();
                if ($validate === true) {
                    try {
                        $review->setEntityId($review->getEntityIdByCode(Review::ENTITY_PRODUCT_CODE))
                            ->setEntityPkValue($product->getId())
                            ->setStatusId(Review::STATUS_PENDING)
                            ->setCustomerId($this->customerSession->getCustomerId())
                            ->setStoreId($this->storeManager->getStore()->getId())
                            ->setStores([$this->storeManager->getStore()->getId()])
                            ->save();

                        foreach ($rating as $ratingId => $optionId) {
                            $this->ratingFactory->create()
                                ->setRatingId($ratingId)
                                ->setReviewId($review->getId())
                                ->setCustomerId($this->customerSession->getCustomerId())
                                ->addOptionVote($optionId, $product->getId());
                        }

                        $review->aggregate();
                        $this->messageManager->addSuccess(__('You submitted your review for moderation.Thanks'));
                    } catch (\Exception $e) {
                        $this->reviewSession->setFormData($data);
                        $this->messageManager->addError(__('We can\'t post your review right now.'));
                    }
                } else {
                    $this->reviewSession->setFormData($data);
                    if (is_array($validate)) {
                        foreach ($validate as $errorMessage) {
                            $this->messageManager->addError($errorMessage);
                        }
                    } else {
                        $this->messageManager->addError(__('We can\'t post your review right now.'));
                    }
                }
            }
            $redirectUrl = $this->reviewSession->getRedirectUrl(true);
            $resultRedirect->setUrl($redirectUrl ?: $this->_redirect->getRedirectUrl());
            return $resultRedirect;
        }
    }

এটি magento2 এ পর্যালোচনা নিয়ামক ওভাররাইডের জন্য কোডের কাজ করছে। ধন্যবাদ।


: - অগ্রাধিকার ব্যবহার প্রসারিত করার পক্ষে ভাল উপায় নয়, প্লাগইন ধারণাটি ব্যবহার করুন
প্রদীপ কুমার

@ প্রদীপকুমার আপনি কি ব্যাখ্যা করতে পারবেন যে প্লাগিনগুলি কেন পছন্দ ব্যবহারের চেয়ে পছন্দনীয়?
রবি অ্যাভারিল

@ আরবিবি: - এটি আসল বা মূল কার্যকারিতা রাখে, প্রাক্তন যদি চৌম্বক 2 আপগ্রেড হয় এবং একই ফাংশনে কিছু পরিবর্তন ঘটে থাকে তবে আমরা সেই অংশটি হারাব, সুতরাং প্লাগিনে যেতে হবে এটি মূল লজি ধরে রাখবে
প্রদীপ কুমার

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