วิธีเพิ่มคอลัมน์พร้อมตัวกรองใน Magento 2 Orders Grid

เผยแพร่แล้ว: 2020-02-03

บ่อยครั้ง ผู้ดูแลระบบร้านค้า Magento 2 ต้องการตัวเลือกเพิ่มเติมเมื่อใช้และกำหนดตารางคำสั่งซื้อเอง การกรองตามพารามิเตอร์แบบสำเร็จรูปเฉพาะอาจกลายเป็นความท้าทายที่แท้จริง

เมื่อเร็ว ๆ นี้ นักพัฒนา Magento ได้ติดต่อฉันด้วยคำถาม เขาพยายามขยายตารางการสั่งซื้อบน Magento 2.3.1 โพสต์เก่าที่มีอยู่บนเว็บไม่ได้ช่วยอะไร ปกติแล้ว Magento ได้เปลี่ยนแปลงไปมากตั้งแต่สองปีที่ผ่านมา

จากคำถามของเขา ฉันขอเสนอให้คุณดูวิธีแก้ปัญหาสำหรับกรณีเฉพาะ:

เราจำเป็นต้องเพิ่มคอลัมน์ ― พร้อมรหัสภูมิภาคของลูกค้าที่ซื้อจนเสร็จ ― ลงในตารางใบสั่งซื้อ นอกจากนี้ ผู้ดูแลระบบร้านค้าต้องมีความเป็นไปได้ในการกรองคำสั่งซื้อตามคอลัมน์ที่เพิ่มใหม่นี้

อาจดูเหมือนง่าย แต่มีบางสิ่งที่ควรค่าแก่การใส่ใจ ตัวอย่างเช่น นักช้อปที่ซื้อสินค้าอาจไม่มีที่อยู่สำหรับจัดส่ง - ในกรณีของการสั่งซื้อเสมือนจริง หรือเราจะแสดงรายการภูมิภาคอย่างไร ทั้งหมดนี้ควรนำมาพิจารณาเมื่อเข้าสู่การพัฒนา จากคำถามที่กล่าวถึงก่อนหน้านี้ สมมติว่า:

  • ผลิตภัณฑ์เสมือนจะไม่มีพื้นที่จัดส่ง ('null') สิ่งนี้จะช่วยคุณเลือกตามพารามิเตอร์นี้
  • ภูมิภาคต่างๆ จะถูกแสดงรายการและมีลักษณะของรหัสโดยไม่มีการแปลงเป็นป้ายกำกับ เช่นเดียวกับที่อยู่ใน Magento 2 เริ่มต้น

*โปรดทราบว่าในตอนท้ายของบทความนี้จะมีลิงก์ไปยังโมดูลที่มีการเข้าถึงแบบเปิดบน GitHub แม้ว่าฉันจะรวมลิงก์ไว้ในย่อหน้านี้หากคุณไม่สามารถจัดการบทความนี้ให้จบ: https://github.com/mageworx/articles-extended-orders-grid

อย่างไรก็ตาม แม้จะไม่มีเวลา เราขอแนะนำให้คุณอ่านต่อ?

ดังนั้น ในการเพิ่มคอลัมน์ใหม่ในตารางคำสั่งซื้อ คุณต้อง:

สารบัญ

  • 1. สร้างโมดูลใหม่
  • 2. เพิ่มคอลัมน์ลงในตาราง
    • คำอธิบาย
  • 3. เพิ่มข้อมูลลงในคอลัมน์
  • จะเพิ่มคอลัมน์พิเศษได้อย่างไร?
  • [อัพเดท] จะเพิ่มคอลัมน์ด้วยข้อมูลรายการสั่งซื้อได้อย่างไร?

1. สร้างโมดูลใหม่

ขั้นแรก มาตัดสินใจเลือกโมดูลและชื่อผู้ขาย ฉันไม่ต้องการให้ฉันเลือกชื่อผู้ขาย – มันคือ MageWorx (ราวกับว่าฉันมีทางเลือก ล้อเล่น) ฉันยังคงสามารถเลือกชื่อโมดูลได้ ปล่อยให้เป็น ExtendedOrdersGrid (แต่เรามีนามสกุลเดียวกันสำหรับ Magento 2) อันที่จริง การใช้ MageWorx เป็นชื่อผู้ขายในเนมสเปซไม่ได้ให้สิทธิ์คุณในการขอรับการสนับสนุนฟรี อย่างไรก็ตาม หากสมาชิกในทีมสนับสนุนของเรามีวันหยุดสุดสัปดาห์ที่ดี คุณยังคงสามารถทดลองใช้ในวันจันทร์ได้หรือไม่

มาสร้างไดเร็กทอรีต่อไปนี้: `app/code/MageWorx/ExtendedOrdersGrid` ในการลงทะเบียนโมดูล เราจำเป็นต้องมีไฟล์มาตรฐานบางไฟล์:

 > registration.php php <?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'MageWorx_ExtendedOrdersGrid', __DIR__ ); > composer.json json { "name": "mageworx/module-extended-orders-grid", "description": "Extended Orders Grid Extension", "require": { "magento/module-ui" : ">=100.1.0 < 102", "magento/module-sales" : ">=100.0.0 <103" }, "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "AFL-3.0" ], "autoload": { "files": [ "registration.php" ], "psr-4": { "MageWorx\\ExtendedOrdersGrid\\": "" } } } > etc/module.xml xml <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="MageWorx_ExtendedOrdersGrid" setup_version="1.0.0"> <sequence> <module name="Magento_Sales"/> <module name="Magento_Ui"/> </sequence> </module> </config>

โปรดทราบว่าฉันได้ตัดลิขสิทธิ์ที่เพิ่มใน IDE ของฉันโดยอัตโนมัติแล้ว ดังนั้นคุณจึงสามารถใช้รหัสนี้ได้โดยไม่มีปัญหา ?

จากนั้นรันคำสั่งสองสามคำสั่ง:

 > sudo -u www-data php bin/magento module:enable MageWorx_ExtendedOrdersGrid > sudo -u www-data php bin/magento setup:upgrade

และโว้ว! ตอนนี้ สามารถเห็นโมดูลของเราใน Magento 2! อ้อ ถ้าคุณทำงานบนเซิร์ฟเวอร์ระยะไกล อย่าลืมโอนไฟล์ก่อนทำการทดสอบ

2. เพิ่มคอลัมน์ลงในตาราง

จากนั้น ใช้ Magento 2 UI ให้เพิ่มคอลัมน์ใหม่ในกริดมาตรฐาน สำหรับสิ่งนั้น ให้สร้างไฟล์:

 > view/adminhtml/ui_component/sales_order_grid.xml

โดยมีเนื้อหาดังต่อไปนี้ (เราจะพูดถึงความหมายต่อไป):

 xml <?xml version="1.0" encoding="UTF-8"?> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <columns name="sales_order_columns"> <column name="code"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> <item name="label" xsi:type="string" translate="true">Region Code</item> <item name="sortOrder" xsi:type="number">60</item> <item name="align" xsi:type="string">left</item> <item name="dataType" xsi:type="string">text</item> <item name="visible" xsi:type="boolean">true</item> <item name="filter" xsi:type="string">text</item> </item> </argument> </column> </columns> </listing>

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

เราใช้โหนด "คอลัมน์" มาตรฐานเพื่อเพิ่มคอลัมน์ลงในกริด โดยจะเพิ่มคอลัมน์ใหม่ภายใต้ชื่อ "โค้ด" ด้วยเช่นกัน ต่อไป มาเขียนแอตทริบิวต์ของคอลัมน์ของเราในตาราง:

1) ส่วนประกอบ . นี่คือคลาส JS ที่รับผิดชอบในการสร้างและประมวลผลคอลัมน์นี้ ตั้งอยู่ในโมดูล Magento_Ui ตามที่อยู่ต่อไปนี้:

`ผู้ขาย/วีโอไอพี/module-ui/view/base/web/js/grid/columns/column.js`

อันที่จริง หากคุณเป็นนักพัฒนาที่อยากรู้อยากเห็น ให้พิจารณาสิ่งอื่นๆ ด้วย มีสิ่งที่น่าตื่นเต้นมากมายอยู่ที่นั่น

2) ฉลาก นี่คือบรรทัดที่มีชื่อคอลัมน์ซึ่งจะแสดงต่อผู้ใช้ปลายทาง อย่าลืมเพิ่มลงในไฟล์การแปลภาษา i18n หากสร้างคุณสมบัติ "แปล" แล้ว ?

3) เรียงลำดับ นี่คือตำแหน่งคอลัมน์ในตาราง หากโมดูลได้รับการติดตั้งบน Magento 2 ที่ไม่เคยได้รับการจัดการโดยผู้ดูแลระบบร้านค้า จะมีผล มิฉะนั้น ใน Magento 2 ที่กำลังใช้งานอยู่ คอลัมน์ของเราจะถูกเพิ่มไปยังส่วนท้ายของรายการไม่ว่าเราจะทำอะไร

4) จัดตำแหน่ง ซึ่งหมายถึงการจัดแนวเนื้อหาของคอลัมน์ ฉันเดาที่ชัดเจน

5) ประเภทข้อมูล นี่คือประเภทข้อมูลที่เราจะจัดการ ในกรณีของเรา นั่นเป็นเพียงบรรทัดข้อความ อย่างไรก็ตาม อาจเป็นรายการหรือค่าบูลีน ตลอดจนตัวเลขได้ เช่น หากเราพูดถึงปริมาณผลิตภัณฑ์

6) มองเห็นได้ นี่ไม่ใช่อะไรอื่นนอกจากการมองเห็นคอลัมน์ แต่ขึ้นอยู่กับว่าก่อนหน้านี้มีการใช้กริดหรือไม่

ข้อมูลทั้งหมดเกี่ยวกับกริดถูกเก็บไว้ในฐานข้อมูล Magento ในตาราง `ui_bookmark` ดังนั้น หากไม่มีบันทึกเกี่ยวกับคอลัมน์ของเราสำหรับกริดที่แก้ไขในขณะที่ทำการติดตั้งโมดูล อย่าคาดหวังความมหัศจรรย์ใดๆ

7) กรอง . นี่คือประเภทตัวกรอง ในที่นี้ เราระบุว่าการกรองควรทำเช่นเดียวกับข้อความปกติ ขณะรันโค้ด โค้ดจะเปลี่ยนเป็นเงื่อนไข `LIKE %value%` ของ MySQL


MageWorx Magento 2 Extensions

คำอธิบาย

ในการทำให้เรื่องยาวสั้นลง ชื่อของคอมโพเนนต์ UI แบบขยายต้องตรงกับชื่อต้นฉบับ ในกรณีของเรา มันคือ `vendor/magento/module-sales/view/adminhtml/ui_component/sales_order_grid.xml` และคำนวณจากรูทของโมดูล `view/adminhtml/ui_component/sales_order_grid.xml`

UI กริดเองถูกเพิ่มไปยังคอนโทรลเลอร์ที่ต้องการโดยใช้เลย์เอาต์ `vendor/magento/module-sales/view/adminhtml/layout/sales_order_index.xml` ดังนี้:

 xml <?xml version="1.0"?> <!-- /** * Copyright Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ --> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <update handle="styles"/> <body> <referenceContainer name="content"> <uiComponent name="sales_order_grid"/> </referenceContainer> </body> </page>

ซึ่งหมายความว่า *เพิ่มองค์ประกอบ UI นี้ภายใต้ชื่อ `sales_order_grid` ให้กับเนื้อหาของหน้า* เช่นเดียวกับในกรณีที่มีการบล็อก อย่างไรก็ตาม แทนที่จะบล็อก เรามี "uiComponent" ที่มีคุณสมบัติและข้อจำกัด


ตอนนี้ล้างแคช Magento 2 โดยใช้คำสั่งต่อไปนี้:

 > sudo -u www-data php bin/magento cache:clean config

และตรวจสอบผลลัพธ์ในตารางคำสั่งซื้อ:

วิธีเพิ่มคอลัมน์พร้อมตัวกรองใน Magento 2 Orders Grid | บล็อก MageWorx Magento

3. เพิ่มข้อมูลลงในคอลัมน์

คุณอาจสังเกตเห็นว่าคอลัมน์ปรากฏขึ้นแล้ว แต่เนื้อหาของคอลัมน์ดูไม่เป็นไปตามที่คาดไว้...ไม่มีข้อมูลแสดงอยู่ที่นั่นเลย ยุติธรรมดี เราไม่ได้เพิ่มอะไรเลย ดังนั้นจึงไม่มีเนื้อหาอยู่ที่นั่น

มาลงที่การเขียนปลั๊กอินง่ายๆ ที่จะช่วยคุณกรอกคอลัมน์ของเรา สำหรับสิ่งนั้น มาดูคิวรีคอลเลกชันกริด ทำการเข้าร่วมภายในตารางและกริดที่ต้องการ ปลั๊กอินจะมีลักษณะดังนี้:

 > app/code/MageWorx/ExtendedOrdersGrid/Plugin/AddDataToOrdersGrid.php
 php <?php namespace MageWorx\ExtendedOrdersGrid\Plugin; /** * Class AddDataToOrdersGrid */ class AddDataToOrdersGrid { /** * @var \Psr\Log\LoggerInterface */ private $logger; /** * AddDataToOrdersGrid constructor. * * @param \Psr\Log\LoggerInterface $customLogger * @param array $data */ public function __construct( \Psr\Log\LoggerInterface $customLogger, array $data = [] ) { $this->logger = $customLogger; } /** * @param \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject * @param \Magento\Sales\Model\ResourceModel\Order\Grid\Collection $collection * @param $requestName * @return mixed */ public function afterGetReport($subject, $collection, $requestName) { if ($requestName !== 'sales_order_grid_data_source') { return $collection; } if ($collection->getMainTable() === $collection->getResource()->getTable('sales_order_grid')) { try { $orderAddressTableName = $collection->getResource()->getTable('sales_order_address'); $directoryCountryRegionTableName = $collection->getResource()->getTable('directory_country_region'); $collection->getSelect()->joinLeft( ['soa' => $orderAddressTableName], 'soa.parent_id = main_table.entity_id AND soa.address_type = \'shipping\'', null ); $collection->getSelect()->joinLeft( ['dcrt' => $directoryCountryRegionTableName], 'soa.region_id = dcrt.region_id', ['code'] ); } catch (\Zend_Db_Select_Exception $selectException) { // Do nothing in that case $this->logger->log(100, $selectException); } } return $collection; } }

มันจะอ้างถึงคลาสต่อไปนี้:

'Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory'

 > etc/adminhtml/di.xml xml <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <!-- Plugins --> <!-- Adds additional data to the orders grid collection --> <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory"> <plugin name="mageworx_extended_orders_grid_add_data_to_orders_grid" type="MageWorx\ExtendedOrdersGrid\Plugin\AddDataToOrdersGrid" sortOrder="10" disabled="false"/> </type> </config>

ปลั๊กอินทำงานด้วยวิธีต่อไปนี้:

เนื่องจากจะจับคอลเลกชันทั้งหมดได้อย่างแน่นอน เรามาเพิ่มการตรวจสอบความถูกต้องให้กับตาราง `sales_order_grid` ที่จำเป็น เมื่อมันถูกค้นพบและวีโอไอพีพยายามที่จะรับข้อมูลเกี่ยวกับสิ่งนี้ เราจะทำการเข้าร่วมของตารางด้วยที่อยู่ `sales_order_address` โดย`order_id` (`entity_id` ในตาราง `sales_order_grid` และ `parent_id` ในตาราง `sales_order_address` ( `soa` นามแฝง)) ตอนนี้ เรามีสิทธิ์เข้าถึงข้อมูลที่อยู่สำหรับจัดส่งคำสั่งซื้อของลูกค้า ซึ่งเราสามารถใช้เพื่อกำหนด `region_id` ซึ่งอยู่ในตาราง `sales_order_address` ตัวเลขนี้สอดคล้องกับดัชนีในตาราง "directory_country_region" (นามแฝง "dcrt") เนื่องจากเราต้องการรหัสภูมิภาคนี้จากตารางดังที่กล่าวไว้ข้างต้น เรามาเชื่อมต่อคอลัมน์ 'รหัส' กัน คอลัมน์ที่แม่นยำนี้จะได้รับผลลัพธ์ (สอดคล้องกับค่า "คอลัมน์" ใน "sales_order_grid.xml")

จากนั้นล้างแคช:

 > sudo -u www-data php bin/magento cache:clean config

เข้าสู่ระบบแผงผู้ดูแลระบบไปยังตารางการสั่งซื้อ หากทำทุกอย่างถูกต้องแล้ว เราจะเห็นรหัสภูมิภาคแสดงขึ้น:

วิธีเพิ่มคอลัมน์พร้อมตัวกรองใน Magento 2 Orders Grid | บล็อก MageWorx Magento

เข้าถึงโมดูลได้ฟรีบน GitHub: https://github.com/mageworx/articles-extended-orders-grid

ไซด์โน๊ตสำคัญ!

ในการเพิ่มข้อมูลลงในคอลัมน์นี้ จำเป็นต้องได้รับคอลัมน์ 'your_column_name' และข้อมูลที่จำเป็นทั้งหมดที่เพิ่มเมื่อสร้างคอลเล็กชัน นั่นคือ คุณต้องทำบางอย่างที่แตกต่างออกไป – แทนที่ชื่อตารางและเขียนการเข้าร่วมของคุณเอง นอกจากนี้ อย่าลืมแก้ไขชื่อคอลัมน์ในไฟล์ `sales_order_grid.xml` หากจำเป็น

จะเพิ่มคอลัมน์พิเศษได้อย่างไร?

หากคุณตัดสินใจที่จะเพิ่มอีกหนึ่งคอลัมน์ โปรดปฏิบัติตามหลักเกณฑ์ที่อธิบายไว้ใน Git commit ต่อไปนี้: https://github.com/mageworx/articles-extended-orders-grid/commit/d31c364a25ce493ab64731c5ca0481e146dbbac3

เราได้เพิ่มคอลัมน์ telephone ลงในกริดจากตาราง sales_order_address สำหรับที่อยู่ของประเภท shipping ดังที่คุณเห็นในโค้ดการคอมมิต ไม่จำเป็นต้องแก้ไขโค้ดที่สำคัญ

นอกจากนี้ คอลัมน์เหล่านี้สามารถส่งออกได้สำเร็จจากอินเทอร์เฟซ 'ตารางการสั่งซื้อ' มาตรฐาน

นี่คือลักษณะของตารางที่มีคอลัมน์ 'โทรศัพท์':

วิธีเพิ่มคอลัมน์พร้อมตัวกรองใน Magento 2 Orders Grid | บล็อก MageWorx Magento

ในภาพหน้าจอด้านล่าง คุณสามารถดูคำสั่งซื้อเดียวกันที่ส่งออกไปยังไฟล์ .csv:

วิธีเพิ่มคอลัมน์พร้อมตัวกรองใน Magento 2 Orders Grid | บล็อก MageWorx Magento

[อัพเดท] จะเพิ่มคอลัมน์ด้วยข้อมูลรายการสั่งซื้อได้อย่างไร?

อย่างที่คุณทราบ คำสั่งซื้อทั้งหมดมีจำนวนสินค้า เริ่มจากหนึ่งถึงออกเกินจำนวน (ใช่ ความฝันของพ่อค้า) แต่เราจะแสดงข้อมูลนั้นในตารางคำสั่งซื้อเพื่อเริ่มการค้นหาหรือเรียกใช้การวิเคราะห์ได้ง่ายขึ้นได้อย่างไร

เราไม่สามารถเพิ่มคอลัมน์เหมือนที่เราทำไว้ก่อนหน้านี้ได้เนื่องจากเราได้รับชื่อผลิตภัณฑ์หรือ SKU เพียงชื่อเดียวในแต่ละแถวในกรณีนั้น หรือบันทึกคำสั่งซื้อจะถูกทำซ้ำ ... เราไม่ต้องการความยุ่งเหยิงนั้นเช่นกัน

ดังนั้นฉันจะพยายามอธิบายว่าเราจะทำอย่างนั้นได้อย่างไร (ในความคิดของฉัน)

สมมติว่าเราต้องการคอลัมน์ข้อมูล 'ชื่อผลิตภัณฑ์' ในตารางคำสั่งซื้อ

ขั้นแรก ให้เพิ่มคอลัมน์ใหม่ในข้อกำหนด sales_order_grid ตามที่เราทำก่อนหน้านี้:

 <columns> .... <column name="name"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> <item name="filter" xsi:type="string">text</item> <item name="label" xsi:type="string" translate="true">Product Name</item> <item name="visible" xsi:type="boolean">false</item> <item name="sortOrder" xsi:type="number">70</item> </item> </argument> </column> </columns>

จากนั้น สิ่งที่เราต้องทำคือสร้างการสืบค้นข้อมูลที่ถูกต้องสำหรับคอลัมน์ใหม่ของเรา ต้องมีชื่อของแต่ละผลิตภัณฑ์ที่ซื้อตามลำดับ คั่นด้วยเครื่องหมายจุลภาค มีความสามารถในการค้นหาด้วยค่าคอลัมน์นั้น เป็นต้น มาสร้างวิธีการใหม่ในปลั๊กอิน mageworx_extended_orders_grid_add_data_to_orders_grid กัน:

 /** * Adds products name column to the orders grid collection * * @param OrderGridCollection $collection * @return OrderGridCollection */ private function addProductsNameColumn(OrderGridCollection $collection): OrderGridCollection { return $collection; }

และตั้งชื่อวิธีการนั้นภายในเนื้อหาของวิธีการดั้งเดิม:

 if ($collection->getMainTable() === $collection->getResource()->getTable('sales_order_grid')) { try { $orderAddressTableName = $collection->getResource()->getTable('sales_order_address'); ... // Add product's name column $this->addProductsNameColumn($collection); } catch (\Zend_Db_Select_Exception $selectException) { ...

เพื่อให้ได้ข้อมูลที่ต้องการในคอลัมน์เดียว เราต้องสร้างการเลือกย่อยด้วยสองคอลัมน์: order_id และ name (ชื่อผลิตภัณฑ์) ในการเลือกแต่ละรายการ ซึ่งสามารถเข้าร่วมกับคอลเล็กชันหลักได้ในภายหลัง:

 // Get original table name $orderItemsTableName = $collection->getResource()->getTable('sales_order_item'); // Create new select instance $itemsTableSelectGrouped = $collection->getConnection()->select(); // Add table with columns which must be selected (skip useless columns) $itemsTableSelectGrouped->from( $orderItemsTableName, [ 'name' => new \Zend_Db_Expr('GROUP_CONCAT(DISTINCT name SEPARATOR \',\')'), 'order_id' => 'order_id' ] ); // Group our select to make only one column for one order $itemsTableSelectGrouped->group('order_id');

ชี้แจง:

  • $collection->getConnection()->select() line จะสร้างอินสแตนซ์ Magento\Framework\Db\Select ใหม่
    สิ่งนี้จำเป็นเนื่องจากเราไม่สามารถใช้การเลือกเดิมจากคอลเล็กชันได้ เนื่องจากมีข้อมูลอยู่ภายใน และการแก้ไขใดๆ จะทำให้เกิดข้อผิดพลาด
  • คอลัมน์ name ต้องมีชื่อผลิตภัณฑ์ทั้งหมดสำหรับลำดับที่ระบุ กล่าวคือ ต้องจัดกลุ่มโดยใช้นิพจน์ \Zend_Db_Expr('GROUP_CONCAT(DISTINCT name SEPARATOR \',\')') เพื่อจุดประสงค์นั้น เรากำลังเพิ่ม group('order_id') ให้กับรายการที่เลือกในภายหลัง หากไม่มีการจัดกลุ่ม เราจะใช้ GROUP_CONCAT ไม่ได้

ตอนนี้ เราสามารถเพิ่มการเลือกย่อยของเราลงในคอลเล็กชันหลักได้ และมันจะเป็นจุดสิ้นสุดทางตรรกะของเมธอด addProductsNameColumn :

 // Add our sub-select to main collection with only one column: name $collection->getSelect() ->joinLeft( ['soi' => $itemsTableSelectGrouped], 'soi.order_id = main_table.entity_id', ['name'] ); return $collection;

ชี้แจง:

  • soi เป็นนามแฝงสำหรับตารางเทียมของเรา
  • order_id เป็นกุญแจสำคัญ ซึ่งเราใช้เชื่อมโยงตารางหลัก (ตาราง) ของเรากับข้อมูลรายการสั่งซื้อ
  • ['name'] เป็นคอลัมน์เดียวที่เพิ่มลงในผลลัพธ์ เนื่องจากเราไม่ต้องการข้อมูลอื่น

ผลลัพธ์สุดท้ายมีอยู่ในที่เก็บอย่างเป็นทางการของตัวอย่างนั้น
นี่คือลิงค์ไปยังคอมมิตเฉพาะ: https://github.com/mageworx/articles-extended-orders-grid/commit/0cdffcd4ba66cacb2fd857ba7626fdbcfc0d6fe3

คอลัมน์นั้นมีลักษณะอย่างไรในโฮสต์การแสดงละครของเรา:

?‍? วิธีเพิ่มคอลัมน์พร้อมตัวกรองใน Magento 2 Orders Grid | บล็อก MageWorx Magento

และนี่คือผลลัพธ์ของการส่งออก (CSV):

และนี่คือผลลัพธ์ของการส่งออก (CSV):

ต่อไปนี้คือลักษณะของข้อความค้นหาเมื่อพยายามค้นหาคำสั่งซื้อด้วยผลิตภัณฑ์ "Black" (บนโฮสต์สำหรับนักพัฒนาของเรา):
เลือก main_table .*, soat telephone , ดีซีอาร์ dcrt . code soi . name FROM sales_order_grid AS main_table
ซ้ายเข้าร่วม sales_order_address AS soat ON soat.parent_id = main_table.entity_id และ soat.address_type = 'การจัดส่ง'
ซ้ายเข้าร่วม directory_country_region AS dcrt ON soat.region_id = dcrt.region_id
LEFT JOIN (เลือก GROUP_CONCAT(DISTINCT name SEPARATOR ',') AS name , sales_order_item . order_id FROM sales_order_item GROUP BY order_id ) AS soi ON soi.order_id = main_table.entity_id
soi .ไหน . name LIKE '%Black%'

เห็นได้ชัดว่านี่ไม่ใช่วิธีที่เร็วที่สุดในการส่งออกข้อมูล อย่างไรก็ตาม นั่นอาจเป็นวิธีที่ง่ายที่สุด วิธีที่ดีที่สุดคือการรวบรวมข้อมูลเกี่ยวกับชื่อผลิตภัณฑ์ในคอลัมน์ที่แยกจากกันของตารางที่แยกจากกัน (order_id, products_name) และเพิ่มตารางนี้โดยไม่มีการจัดกลุ่มเพิ่มเติมและการเลือกย่อยใดๆ

เพื่อจุดประสงค์นั้น เราเพิ่มกลุ่ม ('order_id') ลงในการเลือกของเรา (ที่ส่วนท้ายของโค้ดวิธีการ)
การเลือกหมายถึงองค์ประกอบ
กลุ่มหมายถึงวิธีการเลือก


ฉันเดาว่านั่นคือมัน หากคุณมีคำถามหรือคำขอใด ๆ โปรดแสดงความคิดเห็นในช่องแสดงความคิดเห็น