การดำเนินการลบถูกห้ามสำหรับพื้นที่ปัจจุบัน


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')จะถูกตั้งค่าเป็นจริง

ดูเหมือนว่าคุณกำลังพยายามสร้างคำสั่งคอนโซลบางคำและฉันยังไม่คุ้นเคยกับคำสั่งเหล่านั้นดังนั้นทางออกที่ดีที่สุดของคุณในตอนนี้อาจเป็นการตั้งค่ารีจิสตรีเพื่อให้สามารถลบและทำซ้ำได้ในภายหลังหากพบวิธีแก้ไขที่สะอาดกว่า

$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'เป็นจริง

ในการทำเช่นนี้ในคำสั่งคอนโซลคุณต้องให้คลาส 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

สำหรับการทำงานกับผลิตภัณฑ์คุณต้องใช้ Repository

Magento\Catalog\Model\ProductRepository

2
ขอบคุณสำหรับการตอบกลับของคุณตอนนี้ฉันได้รับข้อผิดพลาดดังต่อไปนี้ [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.