Question

Je souhaite créer une commande pour une opération de suppression pour un produit simple par SKU.Je reçois l'erreur suivante. Comment définir la zone d'administration ?

[Magento\Framework\Exception\LocalizedException]
L'opération de suppression est interdite pour la zone actuelle

<?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>
Était-ce utile?

La solution

D'accord avec Max que vous devez utiliser la ProductRepositoryInterface::deleteById($sku), mais vous aurez également besoin de faire une modification supplémentaire pour obtenir les autorisations pour supprimer.

Notez que la zone d'administration traite de ce par la création, la configuration suivante dans app/code/Magento/Backend/etc/adminhtml/di.xml

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

L' Magento\Framework\Model\ActionValidator\RemoveAction\Allowed classe empêche une vérification d'autorisation en rendant simplement true dans le isAllowed la méthode.

Sans le changement ci-dessus à di.xml l' Magento\Framework\Model\ActionValidator\RemoveAction la classe sera utilisé, ce qui sera la cause de votre demande de suppression à l'échec, à moins que $this->registry->registry('isSecureArea') est définie sur true.

Il semble que vous essayez de créer une console de commandes et je ne suis pas très familier avec eux encore, alors votre meilleur pari pour le moment, peut-être pour régler le registre pour permettre l'opération de suppression et refactoriser plus tard, si une solution de nettoyage est trouvé.

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

Autres conseils

J'ai récemment eu ce problème lors de l'écriture d'une commande de la console pour supprimer vide catégories.

Comme dit dans une autre réponse, vous devez vous inscrire 'isSecureArea' à vrai.

Pour ce faire, dans une console de commande, vous devez avoir la Magento\Framework egistre de la classe passée en votre constructeur.

Dans mon cas, j'ai fait de cette façon:

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


    parent::__construct();
}

et puis, dans la execute méthode que j'ai utilisé le référentiel pour effectuer la suppression:

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

Si vous utilisez un script, veuillez créer l'objet de registre comme indiqué ci-dessous.

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

Veuillez cliquer ici pour une explication détaillée. http://www.pearlbells.co.uk/mass-Delete-Magento-2-Catégories-Programmatiquement /

S'il s'agit d'un script unique, vous pouvez utiliser OM

Développer la réponse de Chris O'Toole.Moi aussi, je dois supprimer des catégories d'une commande, en fait de plusieurs commandes.Au départ, il suffit d'avoir

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

dans une commande a bien fonctionné, mais lorsque j'ai mis cela dans plusieurs commandes (dans le constructeur), j'ai eu cette erreur lors de la compilation

La clé de registre "isSecureArea" existe déjà

La première vérification de l'existence de la clé de registre l'a résolu

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

Je ne sais pas si c'est une mauvaise forme de mettre cela dans le constructeur, mais supposez que c'est la raison pour laquelle l'erreur a été rencontrée.Alternativement, vous devriez pouvoir vous en sortir en exécutant le premier extrait de vos commandes. execute méthodes.Encore une fois, je ne suis pas sûr de ce qui est considéré comme une meilleure pratique...

Pour les opérations avec le produit, vous devez utiliser le référentiel.

Magento\Catalog\Model\ProductRepository

Au lieu de définir isSecureArea vous pouvez également permettre d'enlever un seul type d'objet par substitution de type RemoveAction les arguments invoqués dans votre di.xml comme ceci:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top