Quiero crear un comando para eliminar la operación para un producto simple por sku. Recibo el siguiente error. ¿Cómo configurar el área de administración?
[Magento \ Framework \ Exception \ LocalizedException] La
operación de eliminación está prohibida para el área actual
<?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>
fuente
https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
ya que es una API pública y, por lo tanto, más estable.Recientemente tuve este problema al escribir un comando de consola para eliminar categorías vacías.
Como se dijo en otra respuesta, debe registrarse
'isSecureArea'
en verdadero.Para hacer esto en un comando de consola, debe pasar la clase Magento \ Framework \ Registry a su constructor.
En mi caso lo hice de esta manera:
y luego en el
execute
método utilicé el repositorio para realizar la eliminación real:$this->_categoryRepository->deleteByIdentifier($category->getId());
fuente
Si usa un script, cree el objeto de registro como se muestra a continuación.
Haga clic aquí para obtener una explicación detallada. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatic/
si es un script de una sola vez, puede usar OM
fuente
Ampliando la respuesta de Chris O'Toole. También necesito eliminar categorías de un comando, en realidad de múltiples comandos. Inicialmente solo teniendo
en un comando funcionó bien, pero cuando lo puse en varios comandos (en el constructor) recibí este error durante la compilación
Primero comprobando la existencia de la clave de registro lo resolvió
No estoy seguro de si es una mala forma poner eso en el constructor, pero supongo que es por eso que se encontró el error. Alternativamente, debería poder ejecutar el primer fragmento de los
execute
métodos de sus comandos . De nuevo, no estoy seguro de qué se considera mejor práctica ...fuente
Para las operaciones con el producto, debe utilizar el repositorio.
fuente
En lugar de establecer isSecureArea, también puede permitir eliminar un solo tipo de objeto anulando los
RemoveAction
argumentos de tipo en sudi.xml
estilo:fuente