การเพิ่มวิธีการใหม่ให้กับคลาสนามธรรมใน Magento 2


16

เช่นเดียวกับหัวข้อนี้กล่าวว่าแทนที่ระดับนามธรรมในวีโอไอพี 2ในวีโอไอพี 1 ,

ฉันสามารถสร้างคลาสใหม่ได้อย่างสมบูรณ์ ใน Magento 2 เราจำเป็นต้องใช้ปลั๊กอิน แต่ปลั๊กอินอนุญาตให้ฉันแก้ไขวิธีที่มีอยู่เท่านั้น ฉันต้องทำอย่างไรหากฉันต้องการเพิ่มวิธีการใหม่

ตัวอย่าง:

คลาสนี้vendor/magento/module-ui/Component/AbstractComponent.phpมีอาร์เรย์ของส่วนประกอบ: $componentsไม่มีฟังก์ชั่นในการยกเลิกการตั้งค่า / ลบองค์ประกอบสำหรับอาร์เรย์นั้น ดังนั้นฉันจะสร้างฟังก์ชันนั้นได้อย่างไร

คำตอบ:


0

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

<?xml version="1.0" encoding="UTF-8"?>

<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="general">
        <field name="title">
            <argument name="data" xsi:type="array">
                <item name="disabled" xsi:type="boolean">true</item>
            </argument>
        </field>
    </fieldset>
</form>

สิ่งนี้จะลบ 'title' ออกจาก$componentsอาร์เรย์อย่างมีประสิทธิภาพ

นี่เป็นเพราะcreateChildComponentวิธีการในMagento\Framework\View\Element\UiComponentFactoryชั้นเรียน:

 protected function createChildComponent(
        array $bundleComponents,
        ContextInterface $renderContext,
        $identifier
    ) {
        list($className, $arguments) = $this->argumentsResolver($identifier, $bundleComponents);
        if (isset($arguments['data']['disabled']) && (int)$arguments['data']['disabled']) {
            return null;
        }
        $components = [];
        foreach ($bundleComponents['children'] as $childrenIdentifier => $childrenData) {
            $children = $this->createChildComponent(
                $childrenData,
                $renderContext,
                $childrenIdentifier
            );
            $components[$childrenIdentifier] = $children;
        }
        $components = array_filter($components);
        $arguments['components'] = $components;
        if (!isset($arguments['context'])) {
            $arguments['context'] = $renderContext;
        }

        return $this->objectManager->create($className, $arguments);
    }

นี่ไม่ใช่สิ่งที่ฉันกำลังมองหา ... ฉันต้องการวิธีการเพิ่มวิธีการใหม่ในคลาส Abstract ... นี่เป็นเพียงตัวอย่าง ... ตัวอย่างเช่นถ้าฉันต้องการลบองค์ประกอบแบบไดนามิก? ในความคิดเห็นของคุณคุณพูดถึง "การเอาชนะอย่างสมบูรณ์" ในแบบที่คุณทำ ??
Matias

จากนั้นคุณจะต้องกำหนดวิธีการใหม่ของคุณในคลาสที่ขยายคลาสนามธรรมจากนั้นสร้างคลาสสำหรับคลาสย่อยของคลาสนามธรรมซึ่งสืบทอดมาจากคลาสของคุณและตั้งค่ากำหนดใน di.xml นั่นคือสิ่งที่ฉันหมายถึงโดย 'เอาชนะชั้นเรียนอย่างสมบูรณ์' ฉันพยายามแสดงตัวอย่างของวิธีหลีกเลี่ยงการทำเช่นนั้น
แอรอนอัลเลน

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


0

การโหลดคลาสมากเกินไปใน M1 ในโปรแกรมโหลดอัตโนมัติผ่านชุมชนหรือไดเรกทอรีท้องถิ่น (เช่นคำแนะนำในคำถามที่คุณเชื่อมโยง) นั้นถือว่าเป็นการฝึกฝนที่ไม่ดีใน M1 ด้วยเหตุผลที่ดีมาก

ส่วนใหญ่คุณจะสูญเสียความสามารถในการอัพเกรดอินสแตนซ์ Magento ของคุณหากมีการเปลี่ยนคลาสดั้งเดิมในสถานที่คุณไม่ได้พิจารณาในชั้นเรียนที่โอเวอร์โหลด

ที่จริงแล้วฉันไม่สามารถนึกถึง usecase ใด ๆ ที่คุณต้องการเพิ่มวิธีในคลาสนามธรรมเนื่องจากคุณสามารถเพิ่มตรรกะของคุณเองในคลาสของตัวเองและรวมเข้ากับปลั๊กอิน / ผู้สังเกตการณ์ / viewModel / xml

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

หากคุณต้องการลบองค์ประกอบออกจาก Ui Component อาจเป็นไปได้ว่าวิธีที่ดีกว่าในการทำผ่านเลย์เอาต์ / ปลั๊กอินในตัวประมวลผลเลย์เอาต์ / เปลี่ยนไฟล์ js ที่ต้องการ

ดังนั้นหากคุณอธิบายถึงการใช้งานเฉพาะของคุณอาจมีคำตอบที่ดีกว่านี้


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

กรณีการใช้งานครั้งที่สองอาจเป็นได้ถ้าคุณต้องการทำสิ่งที่ฉันพูดในตั๋วยกเลิกการตั้งค่า / ลบองค์ประกอบจากอาร์เรย์นั้น (พิจารณาเป็นตัวอย่าง) คุณสามารถคิดในสิ่งอื่น ๆ ... คุณต้องสร้างฟังก์ชั่นใหม่ ในคลาสนามธรรมมิฉะนั้นคุณจะถูกบังคับให้สร้างฟังก์ชั่นเดียวกันในแต่ละคลาสที่ขยายออกไปและไม่สามารถปรับขนาดได้อีก ... และที่แย่ที่สุดเนื่องจากตัวแปรในแกนกลางวีโอไอพีนั้นเป็นส่วนตัวแทนที่จะได้รับการปกป้องดังนั้น วิธีเดียวที่จะทำคือการเพิ่มวิธีการในระดับนามธรรม ...
Matias Matias

ตัวอย่างแรกนั้นง่ายมากเพียงแค่เพิ่มปลั๊กอินรอบ ๆ กับโมเดลนามธรรมและแคชผลลัพธ์ของการโหลดต่อโมเดล ซึ่งจะดีกว่ามากแล้วการโหลดคลาสนามธรรมซึ่งจะทำลายการอัปเดตในอนาคตทุกครั้งที่มีการเปลี่ยนแปลงโมเดลนามธรรม คุณสอง "ตัวอย่างเช่น" ผมไม่สามารถบอกคุณได้มากเกี่ยวกับเพราะคุณพื้นถามว่าสำหรับการเพิ่มวิธีการระดับนามธรรมแทนการระบุกรณีการใช้งานที่แท้จริงของคุณ
เดวิด Verholen

ครับก็ยังคงเป็นไปได้ใน Magento2 เพราะคุณสามารถจัดการโหลดนักแต่งเพลง แต่ท้อแท้อย่างมากเพราะคุณจะมีปัญหากับการปรับปรุงmagento.stackexchange.com/questions/164455/...
เดวิด Verholen

นั่นไม่ใช่ตัวเลือก
Matias
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.