মুছে ফেলা অপারেশন বর্তমান অঞ্চলে নিষিদ্ধ


10

আমি স্কু দ্বারা সাধারণ পণ্যের জন্য মুছুন অপারেশন কমান্ড তৈরি করতে চাই। আমি অ্যাডমিন এরিয়া সেট করতে কীভাবে নিম্নলিখিত ত্রুটি পেয়ে যাচ্ছি?

[ম্যাজেন্টো
me ফ্রেমওয়ার্ক \ ব্যতিক্রম \ লোকালাইজড এক্সেপশন] বর্তমান অঞ্চলটির জন্য মোছা অপারেশন নিষিদ্ধ

<?php
namespace Sivakumar\Sample\Console;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;

class DeleteSimpleProduct extends Command
{
    protected $_product;
    public function __construct(\Magento\Catalog\Model\Product $_product)
    {
        $this->_product =$_product;
        parent::__construct();
    }

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->setName('delete_simple_product')
            ->setDescription('Delete Simple Product')
            ->setDefinition($this->getOptionsList());

        parent::configure();
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $errors = $this->validate($input);
        if ($errors) {
            throw new \InvalidArgumentException(implode("\n", $errors));
        }

    $product_id = $this->_product->getIdBySku($input->getOption('sku'));
    $product=$this->_product->load($product_id);
        $product->delete();
        $output->writeln('<info>product deleted ' . $input->getOption('sku') . '</info>');
    }

    public function getOptionsList()
    {
        return [
            new InputOption('sku', null, InputOption::VALUE_REQUIRED, 'SKU'),
        ];
    }

    public function validate(InputInterface $input)
    {
        $errors = [];
        $required =['sku',]; 

        foreach ($required as $key) {
            if (!$input->getOption($key)) {
                $errors[] = 'Missing option ' . $key;
            }
        }
        return $errors;
    }
}

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">
<type name="Magento\Framework\Console\CommandList">
    <arguments>
        <argument name="commands" xsi:type="array">
            <item name="delete_simple_product" xsi:type="object">Sivakumar\Sample\Console\DeleteSimpleProduct</item>
        </argument>
    </arguments>
</type>
</config>

উত্তর:


12

ম্যাক্সের সাথে সম্মত হন যে আপনার এটি ব্যবহার করা উচিত ProductRepositoryInterface::deleteById($sku)তবে মুছে ফেলার অনুমতি পেতে আপনাকে অতিরিক্ত পরিবর্তনও করতে হবে।

নোট করুন যে প্রশাসনিক অঞ্চলটি নিম্নলিখিত কনফিগারেশনটি তৈরি করে এটি পরিচালনা করে app/code/Magento/Backend/etc/adminhtml/di.xml

    <preference for="Magento\Framework\Model\ActionValidator\RemoveAction" type="Magento\Framework\Model\ActionValidator\RemoveAction\Allowed" />

Magento\Framework\Model\ActionValidator\RemoveAction\Allowedবর্গ কেবল ফিরে একটি অনুমতির চেক করতে বাধা দেয় trueisAllowedপদ্ধতি।

উপরের পরিবর্তনটি ডায়। এক্সএমএল না করে Magento\Framework\Model\ActionValidator\RemoveActionক্লাসটি ব্যবহার করা হবে, যা আপনার মোছার অনুরোধটিকে $this->registry->registry('isSecureArea')সত্য হিসাবে সেট না করে ব্যর্থ করে দেবে ।

দেখে মনে হচ্ছে আপনি কিছু কনসোল কমান্ড তৈরি করার চেষ্টা করছেন এবং আমি এখনও তাদের সাথে খুব বেশি পরিচিত নই, সুতরাং আপাতত আপনার সেরা বেটটি যদি কোনও ক্লিনার সমাধান পাওয়া যায় তবে পরে মুছুন অপারেশন এবং রিফ্যাক্টরটিকে অনুমতি দেওয়ার জন্য রেজিস্ট্রি সেট করা যেতে পারে।

$this->registry->register('isSecureArea', true)

এটির কাজটি ঠিকঠাক i
শিবকুমার

আদর্শভাবে ব্যবহার করুন https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.phpযেহেতু এটি একটি সর্বজনীন API এবং তাই আরও স্থিতিশীল।
ক্রিস ও'টুল

6

খালি বিভাগগুলি মুছতে কনসোল কমান্ড লেখার সময় সম্প্রতি আমার এই সমস্যা হয়েছিল।

অন্য উত্তরে যেমন বলা হয়েছে 'isSecureArea'আপনাকে সত্যে নিবন্ধন করতে হবে।

কনসোল কমান্ডে এটি করার জন্য আপনাকে Magento \ ফ্রেমওয়ার্ক \ রেজিস্ট্রি ক্লাসটি আপনার কনস্ট্রাক্টরে পাস করতে হবে।

আমার ক্ষেত্রে আমি এইভাবে করেছি:

public function __construct(CategoryManagementInterface $categoryManagementInterface, CategoryRepositoryInterface $categoryRepositoryInterface, Registry $registry)
{
    $this->_categoryRepository = $categoryRepositoryInterface;
    $this->_categoryManagement = $categoryManagementInterface;
    $registry->register('isSecureArea', true);


    parent::__construct();
}

এবং তারপরে executeপদ্ধতিটিতে আমি রিপোজিটরিটি ব্যবহার করে প্রকৃত মোছাটি সম্পাদন করেছি:

$this->_categoryRepository->deleteByIdentifier($category->getId());


4

আপনি যদি স্ক্রিপ্টটি ব্যবহার করে থাকেন তবে দয়া করে নীচের চিত্রের মতো রেজিস্ট্রি অবজেক্ট তৈরি করুন।

  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
  $objectManager->get('Magento\Framework\Registry')->register('isSecureArea', true);

বিস্তারিত ব্যাখ্যার জন্য এখানে ক্লিক করুন। http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/

যদি এটি ওয়ান টাইম স্ক্রিপ্ট হয় তবে আপনি ওএম ব্যবহার করতে পারেন


ধন্যবাদ ভাই, ভাল কাজ!
ডেভিড ডুং

2

ক্রিস ও'টুলের উত্তরটি প্রসারিত করা হচ্ছে। আমারও কমান্ড থেকে বিভাগগুলি মুছে ফেলতে হবে, বাস্তবে একাধিক আদেশ থেকে। প্রাথমিকভাবে সবে

$oRegistry->register('isSecureArea', true);

একটি কমান্ডে ভাল কাজ করেছে, কিন্তু যখন আমি একাধিক কমান্ড (কনস্ট্রাক্টারে) রেখেছিলাম তখন সংকলনের সময় আমি এই ত্রুটিটি পেয়েছি

রেজিস্ট্রি কী "isSecureArea" ইতিমধ্যে বিদ্যমান

প্রথমে রেজিস্ট্রি কীটির অস্তিত্বের জন্য পরীক্ষা করে এটি সমাধান করে

if($oRegistry->registry('isSecureArea') === null) {
    $oRegistry->register('isSecureArea', true);
}

কনস্ট্রাক্টরে এটি রাখা খারাপ ফর্ম কিনা তা আমি নিশ্চিত নই, তবে ধরে নিই ত্রুটিটি কেন ঘটেছে। বিকল্পভাবে, আপনার কমান্ডের executeপদ্ধতিগুলি থেকে প্রথম স্নিপেট চালিয়ে আপনি পালাতে সক্ষম হবেন । আবার, আমি নিশ্চিত নই যে কোনটি সেরা অনুশীলন হিসাবে বিবেচিত ...


1

পণ্য সহ অপারেশনগুলির জন্য আপনাকে অবশ্যই সংগ্রহস্থল ব্যবহার করতে হবে।

Magento\Catalog\Model\ProductRepository

2
আপনার response.now আমি ভুল নিম্নলিখিত পেয়ে করছি জন্য আপনাকে ধন্যবাদ [Magento \ ফ্রেমওয়ার্ক \ ব্যতিক্রম \ StateException] কে সরাবে পণ্য স্যামসাং অক্ষম।
sivakumar

@ সিভাকুমার একই ত্রুটি আপনি এটি স্থির করেছেন? এটি অনেক আগে ছিল তবে যাইহোক: ডি
গিগা টোডজে

1

আইসিকিউরিএরিয়া সেট করার পরিবর্তে RemoveActionআপনি নিজের di.xmlমতো প্রকারের আর্গুমেন্টগুলিকে ওভাররাইড করে একক ধরণের অবজেক্টকে সরাতে পারবেন :

<type name="Magento\Framework\Model\ActionValidator\RemoveAction">
    <arguments>
        <argument name="protectedModels" xsi:type="array">
            <item name="salesOrder" xsi:type="null" /> <!--allow orders to be removed from front area-->
        </argument>
    </arguments>
</type>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.