Quero criar um comando para operação de exclusão de um produto simples por sku. Estou recebendo o seguinte error.how para definir a área de administração?
[Magento \ Framework \ Exception \ LocalizedException] A
operação de exclusão é proibida para a área atual
<?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>
fonte
https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
pois é uma API pública e, portanto, mais estável.Recentemente, tive esse problema ao escrever um comando do console para excluir categorias vazias.
Como dito em outra resposta, você precisa se registrar
'isSecureArea'
como true.Para fazer isso em um comando do console, você precisa que a classe Magento \ Framework \ Registry seja passada ao seu construtor.
No meu caso, fiz desta maneira:
e, em seguida, no
execute
método, usei o repositório para executar a exclusão real:$this->_categoryRepository->deleteByIdentifier($category->getId());
fonte
se você estiver usando script, crie o objeto de registro como mostrado abaixo.
Clique aqui para obter uma explicação detalhada. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/
se for um script único, você pode usar o OM
fonte
Expandindo a resposta de Chris O'Toole. Eu também preciso excluir categorias de um comando, na verdade, de vários comandos. Inicialmente apenas tendo
em um comando funcionou bem, mas quando coloquei isso em vários comandos (no construtor), recebi esse erro durante a compilação
A primeira verificação da existência da chave do registro resolveu
Não tenho certeza se é uma má forma colocar isso no construtor, mas suponha que é por isso que o erro foi encontrado. Como alternativa, você deve conseguir executar o primeiro trecho dos
execute
métodos dos seus comandos . Novamente, não tenho certeza do que é considerado uma boa prática ...fonte
Para operações com o produto, você deve usar o Repositório.
fonte
Em vez de definir isSecureArea, você também pode permitir remover um único tipo de objeto substituindo
RemoveAction
argumentos de tipodi.xml
como este:fonte