Я хочу создать команду для операции удаления для простого продукта по sku. Я получаю следующую ошибку. Как установить админку?
[Magento \ Framework \ Exception \ LocalizedException]
Операция удаления запрещена для текущей области
<?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>
источник
https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
так как это публичный API и, следовательно, более стабильный.У меня недавно была эта проблема при написании консольной команды для удаления пустых категорий.
Как сказано в другом ответе, вам необходимо зарегистрироваться
'isSecureArea'
на true.Для этого в консольной команде вам нужно передать класс Magento \ Framework \ Registry в ваш конструктор.
В моем случае я сделал так:
а затем в
execute
методе я использовал хранилище для фактического удаления:$this->_categoryRepository->deleteByIdentifier($category->getId());
источник
Если вы используете скрипт, пожалуйста, создайте объект реестра, как показано ниже.
Пожалуйста, нажмите здесь для подробного объяснения. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/
если это одноразовый скрипт, вы можете использовать OM
источник
Расширяя ответ Криса О'Тула. Мне тоже нужно удалить категории из команды, на самом деле из нескольких команд. Первоначально просто имея
в одной команде работал нормально, но когда я положил это в несколько команд (в конструкторе), я получил эту ошибку во время компиляции
Сначала проверка на наличие ключа реестра решена
Я не уверен, что это плохо - помещать это в конструктор, но предположим, что именно поэтому возникла ошибка. Кроме того, вы должны иметь возможность запустить первый фрагмент из
execute
методов ваших команд . Опять же, я не уверен, что считается лучшей практикой ...источник
Для работы с продуктом вы должны использовать репозиторий.
источник
Вместо установки isSecureArea вы также можете разрешить удаление объекта одного типа, переопределив
RemoveAction
аргументы типа в вашемdi.xml
виде:источник