Hapus operasi dilarang untuk area saat ini

10

Saya ingin membuat perintah untuk menghapus operasi untuk produk sederhana oleh sku. Saya mendapatkan error.how untuk mengatur area admin?

[Magento \ Framework \ Exception \ LocalizedException]
Operasi penghapusan dilarang untuk area saat ini

<?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>
sivakumar
sumber

Jawaban:

12

Setuju dengan Max bahwa Anda harus menggunakan ProductRepositoryInterface::deleteById($sku), tetapi Anda juga harus membuat perubahan tambahan untuk mendapatkan izin untuk menghapus.

Perhatikan bahwa area Admin menangani ini dengan membuat konfigurasi berikut app/code/Magento/Backend/etc/adminhtml/di.xml

    <preference for="Magento\Framework\Model\ActionValidator\RemoveAction" type="Magento\Framework\Model\ActionValidator\RemoveAction\Allowed" />

The Magento\Framework\Model\ActionValidator\RemoveAction\Allowedkelas mencegah cek izin dengan hanya kembali truedi isAllowedmetode.

Tanpa perubahan di atas menjadi di.xml, Magento\Framework\Model\ActionValidator\RemoveActionkelas akan digunakan, yang akan menyebabkan permintaan penghapusan Anda gagal kecuali $this->registry->registry('isSecureArea')disetel ke true.

Sepertinya Anda sedang mencoba membuat beberapa perintah konsol dan saya belum terlalu mengenalnya, jadi taruhan terbaik Anda untuk saat ini adalah mengatur registri untuk memungkinkan operasi penghapusan dan refactor nanti jika ditemukan solusi yang lebih bersih.

$this->registry->register('isSecureArea', true)
Chris O'Toole
sumber
berfungsi dengan baik.saya harap saya akan mendapatkan kejelasan mengapa saya harus menggunakan ProductRepository.mean Sementara saya akan mencoba mencari penggunaan kelas ini di devdocs.
sivakumar
Idealnya digunakan https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.phpkarena ini adalah API publik dan karenanya lebih stabil.
Chris O'Toole
6

Baru-baru ini saya mengalami masalah ini saat menulis perintah konsol untuk menghapus kategori kosong.

Seperti yang dikatakan dalam jawaban lain Anda harus mendaftar 'isSecureArea'ke true.

Untuk melakukan ini dalam perintah konsol Anda harus memiliki kelas Magento \ Framework \ Registry masuk ke konstruktor Anda.

Dalam kasus saya, saya melakukannya dengan cara ini:

public function __construct(CategoryManagementInterface $categoryManagementInterface, CategoryRepositoryInterface $categoryRepositoryInterface, Registry $registry)
{
    $this->_categoryRepository = $categoryRepositoryInterface;
    $this->_categoryManagement = $categoryManagementInterface;
    $registry->register('isSecureArea', true);


    parent::__construct();
}

dan kemudian dalam executemetode saya menggunakan repositori untuk melakukan penghapusan yang sebenarnya:

$this->_categoryRepository->deleteByIdentifier($category->getId());

Mir
sumber
4

jika Anda menggunakan skrip, buat objek registri seperti yang ditunjukkan di bawah ini.

  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
  $objectManager->get('Magento\Framework\Registry')->register('isSecureArea', true);

Silakan klik di sini untuk penjelasan terperinci. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/

jika ini adalah skrip satu kali, Anda dapat menggunakan OM

Liz Eipe C
sumber
Terima kasih Bro, kerja bagus!
David Duong
2

Memperluas jawaban Chris O'Toole. Saya juga perlu menghapus kategori dari suatu perintah, sebenarnya dari banyak perintah. Awalnya hanya memiliki

$oRegistry->register('isSecureArea', true);

dalam satu perintah bekerja dengan baik, tetapi ketika saya meletakkannya di beberapa perintah (dalam konstruktor) saya mendapatkan kesalahan ini selama kompilasi

Kunci registri "isSecureArea" sudah ada

Pertama memeriksa keberadaan kunci registri menyelesaikannya

if($oRegistry->registry('isSecureArea') === null) {
    $oRegistry->register('isSecureArea', true);
}

Saya tidak yakin apakah itu bentuk yang buruk untuk meletakkannya di konstruktor, tetapi anggap itu sebabnya kesalahan itu ditemukan. Sebagai alternatif, Anda harus dapat melarikan diri dengan menjalankan cuplikan pertama dari executemetode perintah Anda . Sekali lagi, saya tidak yakin apa yang dianggap praktik terbaik ...

quickshiftin
sumber
1

Untuk operasi dengan produk, Anda harus menggunakan Repositori.

Magento\Catalog\Model\ProductRepository
Max Yekaterynenko
sumber
2
terima kasih atas tanggapan Anda. sekarang saya mendapatkan kesalahan berikut. [Magento \ Framework \ Exception \ StateException] Tidak dapat menghapus produk samsung
sivakumar
@sivakumar kesalahan yang sama. sudahkah anda memperbaikinya? Itu sudah lama sekali tetapi bagaimanapun: D
Giga Todadze
1

Alih-alih mengatur isSecureArea Anda juga dapat mengizinkan untuk menghapus satu jenis objek dengan menimpa RemoveActionargumen jenis di Anda di.xmlseperti ini:

<type name="Magento\Framework\Model\ActionValidator\RemoveAction">
    <arguments>
        <argument name="protectedModels" xsi:type="array">
            <item name="salesOrder" xsi:type="null" /> <!--allow orders to be removed from front area-->
        </argument>
    </arguments>
</type>
burung gereja
sumber