Geçerli alan için silme işlemi yasaktır


10

Ben sku tarafından basit ürün için silme işlemi için komut oluşturmak istiyorum. Aşağıdaki error.get nasıl yönetici alanı ayarlamak için alıyorum?

[Magento \ Framework \ Exception \ LocalizedException]
Geçerli alan için silme işlemi yasaklandı

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

Yanıtlar:


12

Max'i kullanmanız gerektiğini kabul edin ProductRepositoryInterface::deleteById($sku), ancak silme izinleri almak için ek bir değişiklik yapmanız gerekir.

Yönetici alanının bunu aşağıdaki yapılandırmayı oluşturarak ele aldığını unutmayın. app/code/Magento/Backend/etc/adminhtml/di.xml

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

Magento\Framework\Model\ActionValidator\RemoveAction\AllowedSınıf basitçe döndürerek bir izin onay engeller trueiçinde isAllowedyöntemle.

Yukarıdaki di.xml değişikliği yapılmazsa Magento\Framework\Model\ActionValidator\RemoveActionsınıf kullanılır ve bu, true değerine $this->registry->registry('isSecureArea')ayarlanmadığı sürece silme isteğinizin başarısız olmasına neden olur .

Bazı konsol komutları oluşturmaya çalıştığınıza benziyor ve henüz bunlara çok aşina değilim, bu yüzden şimdilik en iyi bahis, daha temiz bir çözüm bulunduğunda silme işlemine ve daha sonra yeniden etkinleştirmeye izin vermek için kayıt defterini ayarlamak olabilir.

$this->registry->register('isSecureArea', true)

onun iyi çalışıyor. umarım neden ProductRepository.mean'ı kullanmalıyım, bu sınıfın devdocs'ta bu sınıfın kullanımını aramaya çalışacağım.
sivakumar

İdeal kullanmak https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.phpbir genel API ve dolayısıyla daha dayanıklı olduğu için.
Chris O'Toole

6

Son zamanlarda boş kategorileri silmek için bir konsol komutu yazarken bu sorunu yaşadım.

Başka bir cevapta da belirtildiği gibi 'isSecureArea'doğru kayıt olmanız gerekir .

Bunu bir konsol komutunda yapmak için, Magento \ Framework \ Registry sınıfının yapıcısına aktarılmış olması gerekir.

Benim durumumda şu şekilde yaptım:

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


    parent::__construct();
}

ve sonra executeyöntemde gerçek silme işlemini gerçekleştirmek için havuzu kullandım:

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


4

komut dosyası kullanıyorsanız, lütfen kayıt nesnesini aşağıda gösterildiği gibi oluşturun.

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

Ayrıntılı açıklama için lütfen tıklayınız. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/

tek seferlik bir komut dosyasıysa, OM'yi kullanabilirsiniz.


Teşekkürler Bro, İyi iş çıkardın!
David Duong

2

Chris O'Toole'un cevabına genişleyen. Ben de kategorileri bir komut, aslında birden çok komut silmek gerekir. Başlangıçta sadece

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

bir komutta iyi çalıştı, ancak bunu birden fazla komutta (yapıcıda) koyduğumda derleme sırasında bu hatayı aldım

"İsSecureArea" kayıt defteri anahtarı zaten var

İlk olarak kayıt defteri anahtarının varlığını kontrol etmek sorunu çözdü

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

Bunu yapıcıya koymanın kötü bir form olup olmadığından emin değilim, ancak hatanın bu yüzden karşılaşıldığını varsayalım. Alternatif olarak, ilk snippet'i komutlarınızın executeyöntemlerinden çalıştırmaktan kurtulabilmeniz gerekir . Yine, en iyi uygulama olarak kabul edilen şeyden emin değilim ...


1

Ürünle yapılan işlemler için Havuz'u kullanmanız gerekir.

Magento\Catalog\Model\ProductRepository

2
Yanıtınız için teşekkür ederim. şu hatayı alıyorum. [Magento \ Framework \ Exception \ StateException] samsung
sivakumar

@sivakumar aynı hata. tamir ettin mi Uzun zaman önceydi ama yine de: D
Giga Todadze

1

İsSecureArea öğesini ayarlamak yerine, aşağıdaki gibi tür RemoveActionbağımsız değişkenlerini geçersiz kılarak tek bir nesne türünün kaldırılmasına izin verebilirsiniz di.xml:

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.