L'operazione di eliminazione è vietata per l'area corrente


10

Voglio creare il comando per l'operazione di eliminazione per un prodotto semplice da sku. Ricevo il seguente errore. Come impostare l'area di amministrazione?

[Magento \ Framework \ Exception \ LocalizedException] L'
operazione di eliminazione è vietata per l'area corrente

<?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>

Risposte:


12

Concorda con Max che dovresti utilizzare il ProductRepositoryInterface::deleteById($sku), ma dovrai anche apportare una modifica aggiuntiva per ottenere le autorizzazioni da eliminare.

Si noti che l'area di amministrazione gestisce ciò creando la seguente configurazione app/code/Magento/Backend/etc/adminhtml/di.xml

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

La Magento\Framework\Model\ActionValidator\RemoveAction\Allowedclasse impedisce un controllo delle autorizzazioni semplicemente ritornando truenel isAllowedmetodo.

Senza la precedente modifica a di.xml Magento\Framework\Model\ActionValidator\RemoveActionverrà utilizzata la classe, che causerà il fallimento della richiesta di eliminazione a meno che non $this->registry->registry('isSecureArea')sia impostata su true.

Sembra che tu stia provando a creare alcuni comandi della console e non li conosco ancora bene, quindi la soluzione migliore per ora potrebbe essere quella di impostare il registro in modo da consentire l'operazione di eliminazione e il refactor in seguito se viene trovata una soluzione più pulita.

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

sta funzionando benissimo. Spero di ottenere un po 'di chiarezza perché dovrei usare ProductRepository.meanwhile proverò a cercare l'uso di questa classe in devdocs.
sivakumar,

Utilizzare idealmente https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.phppoiché è un'API pubblica e quindi più stabile.
Chris O'Toole,

6

Di recente ho avuto questo problema durante la scrittura di un comando della console per eliminare le categorie vuote.

Come detto in un'altra risposta, è necessario registrarsi 'isSecureArea'su true.

Per fare ciò in un comando console è necessario che la classe Magento \ Framework \ Registry sia passata al costruttore.

Nel mio caso ho fatto in questo modo:

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


    parent::__construct();
}

e quindi nel executemetodo ho usato il repository per eseguire la cancellazione effettiva:

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



2

Espandendo la risposta di Chris O'Toole. Anch'io ho bisogno di eliminare le categorie da un comando, in realtà da più comandi. Inizialmente solo avendo

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

in un comando ha funzionato bene, ma quando l'ho messo in più comandi (nel costruttore) ho avuto questo errore durante la compilazione

La chiave di registro "isSecureArea" esiste già

Il primo controllo dell'esistenza della chiave di registro l'ha risolto

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

Non sono sicuro che sia una forma sbagliata metterlo nel costruttore, ma suppongo che sia per questo che si è verificato l'errore. In alternativa, dovresti essere in grado di cavartela eseguendo il primo frammento dai executemetodi dei tuoi comandi . Ancora una volta, non sono sicuro di ciò che è considerato la migliore pratica ...


1

Per le operazioni con il prodotto è necessario utilizzare il repository.

Magento\Catalog\Model\ProductRepository

2
grazie per il tuo response.now sto ricevendo il seguente errore. [Magento \ Framework \ Exception \ StateException] Impossibile rimuovere il prodotto Samsung
sivakumar,

@sivakumar stesso errore. l'hai riparato? È stato tanto tempo fa ma comunque: D
Giga Todadze il

1

Invece di impostare isSecureArea puoi anche consentire di rimuovere un singolo tipo di oggetto sovrascrivendo gli RemoveActionargomenti del tipo in di.xmlquesto modo:

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.