Je veux créer une commande pour l'opération de suppression d'un produit simple par sku. Je reçois le message d'erreur suivant: 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>
la source
https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
car c'est une API publique et donc plus stable.J'ai récemment rencontré ce problème lors de l'écriture d'une commande de console pour supprimer des catégories vides.
Comme indiqué dans une autre réponse, vous devez vous inscrire
'isSecureArea'
sur true.Pour ce faire dans une commande de console, vous devez avoir la classe Magento \ Framework \ Registry passée dans votre constructeur.
Dans mon cas, j'ai fait de cette façon:
puis dans la
execute
méthode, j'ai utilisé le référentiel pour effectuer la suppression réelle:$this->_categoryRepository->deleteByIdentifier($category->getId());
la source
si vous utilisez un script, veuillez créer l'objet de registre comme indiqué ci-dessous.
Veuillez cliquer ici pour une explication détaillée. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/
s'il s'agit d'un script à usage unique, vous pouvez utiliser OM
la source
Développant la réponse de Chris O'Toole. J'ai aussi besoin de supprimer des catégories d'une commande, en fait de plusieurs commandes. Au départ juste avoir
dans une commande a bien fonctionné, mais quand je l'ai mis dans plusieurs commandes (dans le constructeur) j'ai eu cette erreur lors de la compilation
La première vérification de l'existence de la clé de registre l'a résolu
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 être en mesure d'exécuter le premier extrait à partir des
execute
méthodes de vos commandes . Encore une fois, je ne suis pas sûr de ce qui est considéré comme la meilleure pratique ...la source
Pour les opérations avec le produit, vous devez utiliser le référentiel.
la source
Au lieu de définir isSecureArea, vous pouvez également permettre de supprimer un seul type d'objet en remplaçant les
RemoveAction
arguments de type dans votredi.xml
comme ceci:la source