Ich möchte einen Befehl zum Löschen eines einfachen Produkts von sku erstellen. Ich erhalte folgenden Fehler. Wie stelle ich den Admin-Bereich ein?
[Magento \ Framework \ Exception \ LocalizedException] Der
Löschvorgang ist für den aktuellen Bereich verboten
<?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>
quelle
https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
da es sich um eine öffentliche API handelt und daher stabiler ist.Ich hatte kürzlich dieses Problem beim Schreiben eines Konsolenbefehls zum Löschen leerer Kategorien.
Wie in einer anderen Antwort gesagt, müssen Sie sich
'isSecureArea'
auf true registrieren .Dazu muss in einem Konsolenbefehl die Klasse Magento \ Framework \ Registry an Ihren Konstruktor übergeben werden.
In meinem Fall habe ich Folgendes getan:
und dann habe
execute
ich in der Methode das Repository verwendet, um das eigentliche Löschen durchzuführen:$this->_categoryRepository->deleteByIdentifier($category->getId());
quelle
Wenn Sie ein Skript verwenden, erstellen Sie bitte das Registrierungsobjekt wie unten gezeigt.
Bitte klicken Sie hier für eine detaillierte Erklärung. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatic/
Wenn es sich um ein einmaliges Skript handelt, können Sie OM verwenden
quelle
Erweiterung der Antwort von Chris O'Toole. Ich muss auch Kategorien aus einem Befehl löschen, tatsächlich aus mehreren Befehlen. Anfangs nur mit
in einem Befehl hat gut funktioniert, aber als ich das in mehrere Befehle (im Konstruktor) eingefügt habe, habe ich diesen Fehler beim Kompilieren bekommen
Die erste Überprüfung auf das Vorhandensein des Registrierungsschlüssels löste das Problem
Ich bin mir nicht sicher, ob es eine schlechte Form ist, das in den Konstruktor zu schreiben, aber nehme an, dass der Fehler deshalb aufgetreten ist. Alternativ sollten Sie in der Lage sein, das erste Snippet aus den
execute
Methoden Ihrer Befehle auszuführen . Auch hier bin ich mir nicht sicher, was als Best Practice gilt ...quelle
Für Vorgänge mit Produkten müssen Sie das Repository verwenden.
quelle
Stattdessen isSecureArea der Einstellung können Sie auch eine einzige Art von Objekt zu entfernen , lassen nach Art zwingende
RemoveAction
in Ihre Argumentedi.xml
wie folgt aus :quelle