वर्तमान क्षेत्र के लिए हटाएँ कार्रवाई निषिद्ध है


10

मैं sku द्वारा सरल उत्पाद के लिए डिलीट ऑपरेशन के लिए कमांड बनाना चाहता हूं। मैं निम्नलिखित त्रुटि प्राप्त कर रहा हूँ। कैसे व्यवस्थापक क्षेत्र सेट करें?

[Magento \ Framework \ Exception \ LocalizedException]
हटाएँ कार्रवाई वर्तमान क्षेत्र के लिए निषिद्ध है

<?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वर्ग बस प्रत्यावर्तित करके अनुमति की जांच से बचाता trueमें isAllowedविधि।

Di.xml में उपरोक्त परिवर्तन के बिना Magento\Framework\Model\ActionValidator\RemoveActionवर्ग का उपयोग किया जाएगा, जो आपके हटाए गए अनुरोध को विफल करने का कारण बनेगा जब तक कि $this->registry->registry('isSecureArea')यह सही नहीं हो।

ऐसा लगता है कि आप कुछ कंसोल कमांड बनाने की कोशिश कर रहे हैं और मैं अभी तक उनसे बहुत परिचित नहीं हूं, इसलिए अब के लिए आपका सबसे अच्छा शर्त यह हो सकता है कि रजिस्ट्री को डिलीट ऑपरेशन और रिफ्लेक्टर को अनुमति देने के लिए बाद में सेट किया जा सकता है यदि एक क्लीनर समाधान पाया जाता है।

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

इसका काम ठीक है। मुझे आशा है कि मुझे कुछ स्पष्टता मिलेगी कि मुझे ProductRepository.meanward का उपयोग क्यों करना चाहिए मैं devdocs में इस वर्ग के उपयोग की खोज करने का प्रयास करूंगा।
शिवकुमार

आदर्श रूप से उपयोग के https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.phpबाद से यह एक सार्वजनिक एपीआई है और इसलिए अधिक स्थिर है।
क्रिस ओ'टोल

6

मुझे हाल ही में खाली श्रेणियों को हटाने के लिए कंसोल कमांड लिखते समय यह समस्या थी।

जैसा कि एक अन्य उत्तर में कहा गया है कि आपको 'isSecureArea'सही पंजीकरण करने की आवश्यकता है।

कंसोल कमांड में ऐसा करने के लिए आपको मैगेंटो \ फ्रेमवर्क \ रजिस्ट्री क्लास को अपने कंस्ट्रक्टर में पास करना होगा।

मेरे मामले में मैंने इस तरह किया:

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/

यदि यह एक समय की स्क्रिप्ट है, तो आप OM का उपयोग कर सकते हैं


धन्यवाद भाई, अच्छा काम!
डेविड डुओंग

2

क्रिस ओ'टोल के जवाब पर विस्तार। मुझे भी वास्तव में कई कमांड से श्रेणियों को हटाने की जरूरत है। शुरू में सिर्फ होने

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

एक कमांड में ठीक काम किया है, लेकिन जब मैंने इसे कई कमांड्स में (कंस्ट्रक्टर में) डाला तो मुझे यह त्रुटि संकलन के दौरान मिली

रजिस्ट्री कुंजी "SecureArea "पहले से मौजूद है

पहले रजिस्ट्री कुंजी के अस्तित्व के लिए जाँच ने इसे हल किया

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

मुझे यकीन नहीं है कि अगर यह बुरा है कि निर्माणकर्ता में डाल दिया जाए, लेकिन मान लें कि त्रुटि का सामना करना पड़ा था। वैकल्पिक रूप से, आपको अपने कमांड के executeतरीकों से पहला स्निपेट चलाने में सक्षम होना चाहिए । फिर, मुझे यकीन नहीं है कि सबसे अच्छा अभ्यास क्या माना जाता है ...


1

उत्पाद के साथ संचालन के लिए आपको रिपॉजिटरी का उपयोग करना चाहिए।

Magento\Catalog\Model\ProductRepository

2
आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे निम्नलिखित त्रुटि हो रही है। [Magento \ Framework \ Exception \ StateException] उत्पाद सैमसंग को निकालने में असमर्थ
शिवकुमार

@ शिवकुमार वही त्रुटि। क्या आपने इसे ठीक किया है? यह लंबे समय से पहले था, लेकिन वैसे भी: डी
गीगा टॉडज़े

1

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