Domanda

Voglio creare il comando per Elimina operazione per il prodotto semplice da parte di SKU. Sto ricevendo un errore seguente. Come impostare l'area di amministrazione?

[Magento \ Framework \ Exception \ LocalizedException]

Elimina operazione è vietato 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>
.

È stato utile?

Soluzione

Concorda con max che è necessario utilizzare ProductRepositoryInterface::deleteById($sku), ma dovrai anche effettuare una modifica aggiuntiva per ottenere le autorizzazioni per eliminare.

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

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

La classe Magento\Framework\Model\ActionValidator\RemoveAction\Allowed impedisce un controllo di autorizzazione, semplicemente restituendo true nel metodo isAllowed.

Senza la suddetta modifica a DI.XML verrà utilizzata la classe Magento\Framework\Model\ActionValidator\RemoveAction, che causerà il fallimento della richiesta di cancellazione a meno che $this->registry->registry('isSecureArea') sia impostato su TRUE.

Sembra che tu stia cercando di creare alcuni comandi della console e non ho ancora familiarità con loro, quindi la soluzione migliore per ora potrebbe essere quella di impostare il registro per consentire l'operazione di cancellazione e il refactor successivamente se una soluzione più pulita ètrovato.

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

Altri suggerimenti

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

Come detto in un'altra risposta è necessario registrare 'isSecureArea' a TRUE.

Per fare questo in un comando console è necessario avere la classe di registro Magento \ Framework è passata nel tuo 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 poi nel metodo execute ho utilizzato il repository per eseguire la cancellazione effettiva:

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

Se si utilizza lo script, crea l'oggetto del registro come mostrato di seguito.

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

Per favore clicca qui per una spiegazione dettagliata. http://www.pearlbells.co.uk/mass-Delete-magento-2-categorie: programmaticamente /

Se è uno script one time, è possibile utilizzare OM

Espansione sulla 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 unico comando ha funzionato bene, ma quando lo metto in più comandi (nel costruttore) ho ricevuto questo errore durante la compilazione

.

Key del Registro di sistema "ISSECUREAREA" esiste già

Primo controllo per l'esistenza della chiave di registro risolto IT

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

Non sono sicuro che sia una brutta forma metterlo nel costruttore, ma supponiamo che sia per questo che è stato riscontrato l'errore.In alternativa, dovresti essere in grado di allontanarsi con l'esecuzione del primo snippet dai metodi execute dei tuoi comandi.Di nuovo, non sono sicuro di cosa sia considerata le migliori pratiche ...

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

Magento\Catalog\Model\ProductRepository
.

Invece di impostare ISSECUREAREA è possibile anche consentire di rimuovere un singolo tipo di oggetto eseguendo il tipo di overriding Type RemoveAction Argomens nel di.xml come questo:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top