現在のエリアでは削除操作は禁止されています


10

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>

回答:


12

を使用する必要があることについてMaxに同意しますがProductRepositoryInterface::deleteById($sku)、削除する権限を取得するには、追加の変更を加える必要もあります。

管理領域は、次の構成を作成することによってこれを処理することに注意してください 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\Allowedクラスtrueは、isAllowedメソッドに戻るだけで権限チェックを防止します。

上記のdi.xmlへの変更Magento\Framework\Model\ActionValidator\RemoveActionがない場合、クラスが使用$this->registry->registry('isSecureArea')されます。これは、がtrueに設定されていない限り、削除要求が失敗する原因になります。

あなたはいくつかのコンソールコマンドを作成しようとしているようですが、私はそれらにまだあまり慣れていないので、現時点で最善の策は、レジストリを設定して削除操作を許可し、よりクリーンな解決策が見つかった場合に後でリファクタリングすることです。

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

その動作は問題ありません。なぜProductRepository.meanを使用する必要があるのか​​、いくつかの明確さが得られることを願っていますが、devdocsでこのクラスの使用法を検索しようとします。
sivakumar

https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.phpパブリックAPIであり、より安定しているため、理想的に使用します。
Chris O'Toole

6

空のカテゴリを削除するコンソールコマンドを記述しているときに、この問題が発生しました。

別の答えで述べたように、あなたは'isSecureArea'true に登録する必要があります。

コンソールコマンドでこれを行うには、Magento \ Framework \ Registryクラスをコンストラクターに渡す必要があります。

私の場合、私はこのようにしました:

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


    parent::__construct();
}

次に、executeメソッドでリポジトリを使用して実際の削除を実行しました。

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


4

スクリプトを使用する場合は、以下に示すようにレジストリオブジェクトを作成してください。

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

詳しくはこちらをご覧ください。 http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatically/

ワンタイムスクリプトの場合は、OMを使用できます


ブロさん、ありがとうございます。
David Duong

2

クリス・オトゥールの答えを拡張します。私も、実際には複数のコマンドから、コマンドからカテゴリを削除する必要があります。最初はただ持っている

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

1つのコマンドでうまくいきましたが、それを複数のコマンド(コンストラクター)に入れると、コンパイル中にこのエラーが発生しました

レジストリキー「isSecureArea」はすでに存在します

まず、レジストリキーの存在を確認して解決しました

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

それをコンストラクタに入れるのが悪いかどうかはわかりませんが、それがエラーが発生した理由だと思います。または、コマンドのexecuteメソッドから最初のスニペットを実行する必要はありません。繰り返しますが、何がベストプラクティスと見なされているのかわかりません...


1

製品の操作には、リポジトリを使用する必要があります。

Magento\Catalog\Model\ProductRepository

2
[Magento \ Framework \ Exception \ StateException]製品samsungを削除できません
sivakumar

@sivakumar同じエラー。修正しましたか?それはずっと前のことですが、とにかく:D
Giga Todadze

1

isSecureAreaを設定する代わりRemoveActionに、次の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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.