현재 영역에 대한 삭제 조작이 금지되어 있습니다.


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클래스는 단순히 반환하여 권한을 체크하지 못하도록한다 trueisAllowed방법.

위의 di.xml을 변경하지 않으면 Magento\Framework\Model\ActionValidator\RemoveAction클래스가 사용되므로 $this->registry->registry('isSecureArea')true로 설정 하지 않으면 삭제 요청이 실패 합니다.

일부 콘솔 명령을 작성하려고하는 것 같습니다. 아직 익숙하지는 않으므로 삭제 작업을 허용하고 클리너 솔루션이 발견되면 나중에 리팩터링하도록 레지스트리를 설정하는 것이 가장 좋습니다.

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

그것의 잘 작동합니다. 나는 왜 내가 왜 ProductRepository.me를 사용 해야하는지 명확하게 얻을 수 있기를 바랍니다.
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

Chris O'Toole의 답변을 확장합니다. 또한 명령, 실제로 여러 명령에서 범주를 삭제해야합니다. 처음에는

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

한 명령에서 제대로 작동했지만 여러 명령 (생성자)에 넣을 때 컴파일하는 동안이 오류가 발생했습니다.

레지스트리 키 "isSecureArea"가 이미 존재합니다

레지스트리 키가 있는지 먼저 확인하여 해결

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

생성자에 그것을 넣는 것이 나쁜 형식인지 확실하지 않지만 오류가 발생한 이유라고 가정합니다. 또는 명령 execute방법 에서 첫 번째 스 니펫을 실행하지 않아도됩니다 . 다시 한 번 모범 사례가 무엇인지 잘 모르겠습니다.


1

제품 작업의 경우 리포지토리를 사용해야합니다.

Magento\Catalog\Model\ProductRepository

2
귀하의 response. 감사합니다. 다음 오류가 발생합니다. [Magento \ Framework \ Exception \ StateException] 삼성을 제거 할 수 없습니다
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.