Xóa hoạt động bị cấm cho khu vực hiện tại


10

Tôi muốn tạo lệnh cho thao tác xóa cho sản phẩm đơn giản bằng sku. Tôi đang gặp lỗi sau đây. Làm thế nào để thiết lập khu vực quản trị?

[Magento \ Framework \ Exception \ LocalizedException]
Thao tác xóa bị cấm đối với khu vực hiện tại

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

Câu trả lời:


12

Đồng ý với Max rằng bạn nên sử dụng ProductRepositoryInterface::deleteById($sku), nhưng bạn cũng cần thực hiện một thay đổi bổ sung để có quyền xóa.

Lưu ý rằng khu vực Quản trị xử lý việc này bằng cách tạo cấu hình sau trong app/code/Magento/Backend/etc/adminhtml/di.xml

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

Các Magento\Framework\Model\ActionValidator\RemoveAction\Allowedlớp ngăn chặn một tấm séc cho phép bằng cách đơn giản trở về truetrong isAllowedphương pháp.

Nếu không có thay đổi ở trên đối với di.xml, Magento\Framework\Model\ActionValidator\RemoveActionlớp sẽ được sử dụng, điều này sẽ khiến yêu cầu xóa của bạn không thành công trừ khi $this->registry->registry('isSecureArea')được đặt thành đúng.

Có vẻ như bạn đang cố gắng tạo một số lệnh console và tôi chưa quen với chúng, vì vậy cách tốt nhất của bạn bây giờ có thể là đặt registry để cho phép thao tác xóa và tái cấu trúc sau nếu tìm thấy giải pháp sạch hơn.

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

nó hoạt động tốt. Tôi hy vọng tôi sẽ hiểu rõ hơn lý do tại sao tôi nên sử dụng ProductRep repository.mean trong khi tôi sẽ cố gắng tìm kiếm việc sử dụng lớp này trong devdocs.
sivakumar

Sử dụng lý tưởng https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.phpvì nó là API công khai và do đó ổn định hơn.
Chris O'Toole

6

Gần đây tôi đã gặp vấn đề này trong khi viết lệnh console để xóa các danh mục trống.

Như đã nói trong một câu trả lời khác, bạn cần phải đăng ký 'isSecureArea'để đúng.

Để thực hiện điều này trong lệnh console, bạn cần phải có lớp Magento \ Framework \ Registry được truyền vào hàm tạo của bạn.

Trong trường hợp của tôi, tôi đã làm theo cách này:

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


    parent::__construct();
}

và sau đó trong executephương thức tôi đã sử dụng kho lưu trữ để thực hiện xóa thực tế:

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


3

Nếu bạn sử dụng tập lệnh, vui lòng tạo đối tượng đăng ký như dưới đây.

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

Xin bấm vào đây để được giải thích chi tiết. http://www.pearlbells.co.uk/mass-delete-magento-2-c chuyên mục-programmatically /

nếu là tập lệnh một lần, bạn có thể sử dụng OM


Cảm ơn Bro, làm tốt lắm!
David Dương

2

Mở rộng câu trả lời của Chris O'Toole. Tôi cũng cần phải xóa các danh mục từ một lệnh, thực sự từ nhiều lệnh. Ban đầu chỉ có

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

trong một lệnh hoạt động tốt, nhưng khi tôi đặt nó trong nhiều lệnh (trong hàm tạo) tôi đã gặp lỗi này trong quá trình biên dịch

Khóa sổ đăng ký "isSecureArea" đã tồn tại

Đầu tiên kiểm tra sự tồn tại của khóa đăng ký đã giải quyết nó

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

Tôi không chắc chắn nếu nó là hình thức xấu để đưa nó vào hàm tạo, nhưng giả sử đó là lý do tại sao gặp phải lỗi. Ngoài ra, bạn sẽ có thể thoát khỏi việc chạy đoạn mã đầu tiên từ các executephương thức của lệnh . Một lần nữa, tôi không chắc những gì được coi là thực hành tốt nhất ...


1

Đối với các hoạt động với sản phẩm, bạn phải sử dụng Kho lưu trữ.

Magento\Catalog\Model\ProductRepository

2
cảm ơn bạn đã response.now của bạn tôi nhận được lỗi sau [Magento \ Framework \ Exception \ StateException] Không thể gỡ bỏ sản phẩm samsung.
sivakumar

@sivakumar cùng lỗi. bạn đã sửa nó chưa? Cách đây đã lâu nhưng dù sao: D
Giga Todadze

1

Thay vì thiết lập isSecureArea, bạn cũng có thể cho phép xóa một loại đối tượng bằng cách ghi đè các RemoveActionđối số loại di.xmlnhư thế này:

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.