Chcę utworzyć polecenie operacji usuwania dla prostego produktu przez sku. Otrzymuję następujący komunikat o błędzie. Jak ustawić obszar administratora?
[Magento \ Framework \ Exception \ LocalizedException]
Operacja usuwania jest zabroniona dla bieżącego obszaru
<?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>
źródło
https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
nadaje się, ponieważ jest to publiczny interfejs API, a zatem jest bardziej stabilny.Ostatnio miałem ten problem podczas pisania polecenia konsoli, aby usunąć puste kategorie.
Jak powiedziano w innej odpowiedzi, musisz się zarejestrować,
'isSecureArea'
aby uzyskać wartość true.Aby to zrobić w poleceniu konsoli, musisz mieć klasę Magento \ Framework \ Registry przekazaną do twojego konstruktora.
W moim przypadku zrobiłem w ten sposób:
a następnie w
execute
metodzie użyłem repozytorium do faktycznego usunięcia:$this->_categoryRepository->deleteByIdentifier($category->getId());
źródło
jeśli używasz skryptu, utwórz obiekt rejestru, jak pokazano poniżej.
Kliknij tutaj, aby uzyskać szczegółowe wyjaśnienia. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/
jeśli jest to skrypt jednorazowy, możesz użyć OM
źródło
Rozwijając odpowiedź Chrisa O'Toole'a. Ja też muszę usunąć kategorie z polecenia, a właściwie z wielu poleceń. Początkowo tylko
w jednym poleceniu działało dobrze, ale kiedy wstawiłem to do wielu poleceń (w konstruktorze), dostałem ten błąd podczas kompilacji
Pierwsze sprawdzenie istnienia klucza rejestru rozwiązało go
Nie jestem pewien, czy umieszczenie tego w konstruktorze jest złe, ale załóżmy, że właśnie dlatego napotkano błąd. Alternatywnie powinieneś być w stanie uciec od uruchomienia pierwszego fragmentu kodu z
execute
metod poleceń . Ponownie nie jestem pewien, co uważa się za najlepszą praktykę ...źródło
Do operacji z produktem należy użyć repozytorium.
źródło
Zamiast ustawienia isSecureArea możesz także zezwolić na usunięcie jednego typu obiektu, zastępując
RemoveAction
argumenty typu wdi.xml
podobny sposób:źródło