วิธีเข้าร่วมการรวบรวมตารางการสั่งซื้อไปยังตารางที่กำหนดเองใน Magento2?


12

ฉันกำลังพยายามเพิ่มคอลัมน์ใหม่เพื่อสั่งซื้อกริดใน Magento 2.0 ดังนั้นฉันต้องทำการเข้าร่วมเพื่อสั่งซื้อชุดรวมตาราง ฉันจะบรรลุสิ่งนี้ได้อย่างไร เพราะใน magento2 กริดใช้องค์ประกอบ UI

คำตอบ:


12

Magento 2 เพิ่มคอลัมน์ที่กำหนดเองลงในตารางคำสั่งขาย

ที่จะเข้าร่วม

วีโอไอพี \ ขาย \ สั่งซื้อ \ กริด \ เก็บ

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

สร้างปลั๊กอินใน etc / di.xml ของโมดูลของคุณ

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <plugin name="sales_order_additional_columns" type="Vendor\ModuleName\Plugins\AddColumnsSalesOrderGridCollection" sortOrder="100" disabled="false" />
</type>

ดังนั้นเรากำลังสกัดกั้น

วีโอไอพี \ Framework \ ดู \ ธาตุ \ UIComponent \ dataprovider \ CollectionFactory

เพราะถ้าคุณดูที่

วีโอไอพี \ ขาย \ etc \ di.xml

คุณจะเห็น

วีโอไอพี \ ขาย \ สั่งซื้อ \ กริด \ เก็บ

ถูกฉีดเข้าสู่

วีโอไอพี \ Framework \ ดู \ ธาตุ \ UIComponent \ dataprovider \ CollectionFactory

สร้างโฟลเดอร์ปลั๊กอินและคลาสปลั๊กอินในโมดูลของคุณ

<?php namespace Vendor\ModuleName\Plugins;

use Magento\Framework\Message\ManagerInterface as MessageManager;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as SalesOrderGridCollection;

class AddColumnsSalesOrderGridCollection
{
    private $messageManager;
    private $collection;

    public function __construct(MessageManager $messageManager,
        SalesOrderGridCollection $collection
    ) {

        $this->messageManager = $messageManager;
        $this->collection = $collection;
    }

    public function aroundGetReport(
        \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
        \Closure $proceed,
        $requestName
    ) {
        $result = $proceed($requestName);
        if ($requestName == 'sales_order_grid_data_source') {
            if ($result instanceof $this->collection
            ) {
                $select = $this->collection->getSelect();
                $select->join(
                    ["soi" => "sales_order_item"],
                    'main_table.entity_id = soi.order_id AND soi.product_type="simple"',
                    array('weight', 'product_type')
                )
                    ->distinct();

                $select->join(
                    ["soa" => "sales_order_address"],
                    'main_table.entity_id = soa.parent_id AND soa.address_type="shipping"',
                    array('email', 'country_id', 'postcode', 'city', 'telephone')
                )
                    ->distinct();
            }

        }
        return $this->collection;
    }
}

ที่นี่เราจะสังเกตรอบกรณีของ getReport () วิธีการ

สำเนา

ผู้ขาย / วีโอไอพี / โมดูลการขาย / view / adminhtml / ui_component / sales_order_grid.xml

ถึงขอบเขตของโมดูลของคุณ

ผู้ขาย / ModuleName / view / adminhtml / ui_component / sales_order_grid.xml

ลบเนื้อหาทั้งหมดของ sales_order_grid.xml ที่คัดลอกของคุณเนื่องจากเราไม่ต้องการแทนที่เนื้อหาทั้งหมด

ป้อนรหัสต่อไปนี้ในโมดูล sales_order_grid.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">

        <!-- sales_order_item weight -->
        <column name="weight">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Weight</item>
                    <item name="sortOrder" xsi:type="number">222</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_item product_type-->
        <column name="product_type">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Vendor\ModuleName\Ui\Component\Listing\Column\ProductTypes</item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Product Type</item>
                    <item name="sortOrder" xsi:type="number">232</item>
                    <item name="align" xsi:type="string">right</item>
                    <!--<item name="filter" xsi:type="string">select</item>-->
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
                    <item name="dataType" xsi:type="string">select</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address country_id -->
        <column name="country_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Country ID</item>
                    <item name="sortOrder" xsi:type="number">242</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address post_code -->
        <column name="postcode">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Postcode</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address city -->
        <column name="city">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">City</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address telephone -->
        <column name="telephone">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Telephone</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

    </columns>

</listing>

ตอนนี้ลบแคชออกจากโฟลเดอร์ var / cache หรือรีเฟรชแคชของคุณ คุณจะสามารถเห็นคอลัมน์เพิ่มของคุณในคือตารางใบสั่งขาย


ขอบคุณมากสำหรับการที่หนึ่งปัญหาเดียวของฉัน (กับวีโอไอพี 2.2.0) คือการที่ฉันจะต้องเพิ่มคำนำหน้าตารางบนเส้นและ["soi" => "sales_order_item"] ["soa" => "sales_order_address"]
เดวิด

ฉันคิดว่ามันใช้งานได้ดี แต่ดูเหมือนว่าจะยุ่งกับตารางใบแจ้งหนี้ด้วย .. เมื่อเปิดใช้งานโมดูล ID การสั่งซื้อและสถานะจะว่างเปล่าแปลก ๆ ในตารางใบแจ้งหนี้ .. ความคิดเกี่ยวกับสิ่งที่อาจผิด
เดวิด

ขอบคุณสำหรับข้อมูลนี้มันช่วยฉันเพิ่มชื่อ บริษัท แต่ฉันจะแสดงข้อมูลการเรียกเก็บเงินและการจัดส่งแทนการจัดส่งได้อย่างไร ฉันสามารถแสดง 1 หรืออื่น ๆ แต่ฉันไม่สามารถเปลี่ยนชื่อ 'บริษัท ' เพื่อพูดว่า 'billing_company' และ 'shipping_company' เพื่อใช้ใน sales_order_grid.xml
RLTcode

1
รับข้อผิดพลาดในหน้า CMS, CMS Block, ลูกค้าและ Creditmemo กริดเมื่อใช้คลาสปลั๊กอินโปรดแจ้งให้เราทราบหากมีวิธีอื่นในการแก้ไขคอลเลกชันกริด
Vishal

คุณสามารถเห็นข้อผิดพลาดอะไรบ้างสำหรับตารางใบแจ้งหนี้และอื่น ๆ
Asrar

9

เมื่อคุณดู\Magento\Framework\Data\Collection\AbstractDbmagento2 ตัวเองให้ดำเนินการเบ็ดสำหรับคอลเลกชันของคุณ

protected function _renderFilters()
{
    if ($this->_isFiltersRendered) {
        return $this;
    }

    $this->_renderFiltersBefore(); // Hook for operations before rendering filters

    ....................
}

ดังนั้นสิ่งที่คุณต้องทำคือเพียงเพิ่มในคอลเลกชันของคุณ [ NAMESPACE\MODULENAME\Model\ResourceModel\YOUR_CLASSNAME\Grid\Collection]

protected function _renderFiltersBefore() {
    $joinTable = $this->getTable('catalog_product_entity_varchar');
    $this->getSelect()->join($joinTable.' as cpev','main_table.entity_id = cpev.entity_id', array('*'));
    parent::_renderFiltersBefore();
}

ฉันต้องการแสดงเขตข้อมูลตารางที่กำหนดเองของฉันในตารางการสั่งซื้อในกรณีนี้โฮที่จะแสดงมัน?
Pradeep Kumar

@Keyur Shah ขอบคุณมากที่ช่วยฉัน
Rohit Goel

ดีใจที่ได้ยินว่ามันช่วยคุณ :) @RohitGoel Keep ช่วยสมาชิกชุมชนคนอื่น ๆ
Keyur Shah

แน่นอน :) @KeyurShah ฉันชอบที่จะช่วยชุมชนฉันกำลังสร้างตารางโดยไม่ต้องมีองค์ประกอบ UI คุณช่วยบอกฉันว่าฉันจะเพิ่มคุณสมบัติการส่งออกในที่
Rohit Goel

1
แทนที่จะคุณยังสามารถแทนที่_renderFiltersBefore / ขยาย _initSelect
Jānis Elmeris

3

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

etc / di.xml,

Model / Resource / Modulename / Collection.php เพิ่มการเข้าร่วมในไฟล์นี้

รุ่น / ทรัพยากร / modulename / ตาราง / Collection.php,

ใน etc / di.xml ของคุณ

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="namespace_modulename_listing_data_source" xsi:type="string">Namespace\Modulename\Model\Resource\Modulename\Grid\Collection</item>
            </argument>
        </arguments>
</type>
<type name="Namespace\Modulename\Model\Resource\Modulename\Grid\Collection">
    <arguments>
        <argument name="mainTable" xsi:type="string">tablename</argument>
        <argument name="eventPrefix" xsi:type="string">namespace_modulename_grid_collection</argument>
        <argument name="eventObject" xsi:type="string">namespace_grid_collection</argument>
        <argument name="resourceModel" xsi:type="string">Namespace\Modulename\Model\Resource\Modulename</argument>
    </arguments>
</type>

ใน Model / Resource / Modulename / Collection.php ของคุณ

<?php
namespace Namespace\Modulename\Model\Resource\Modulename;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{
    /**
     * Define model & resource model
     */
    const YOUR_TABLE = 'tablename';

    public function __construct(
        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
    ) {
        $this->_init(
            'Namespace\Modulename\Model\Modulename',
            'Namespace\Modulename\Model\Resource\Modulename'
        );
        parent::__construct(
            $entityFactory, $logger, $fetchStrategy, $eventManager, $connection,
            $resource
        );
        $this->storeManager = $storeManager;
    }
    protected function _initSelect()
    {
        parent::_initSelect();

        $this->getSelect()->joinLeft(
                ['secondTable' => $this->getTable('tablename')],
                'main_table.columnname = secondTable.columnname',
                ['columnname1','columnname2','columnname3']
            );
    }
}
?>

ใน Model / Resource / Modulename / Grid / Collection.php ของคุณ

<?php
namespace Namespace\Modulename\Model\Resource\Modulename\Grid;

use Magento\Framework\Api\Search\SearchResultInterface;
use Magento\Framework\Search\AggregationInterface;
use Namespace\Modulename\Model\Resource\Modulename\Collection as ModulenameCollection;

/**
 * Class Collection
 * Collection for displaying grid
 */
class Collection extends ModulenameCollection implements SearchResultInterface
{
    /**
     * Resource initialization
     * @return $this
     */
   public function __construct(
        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        $mainTable,
        $eventPrefix,
        $eventObject,
        $resourceModel,
        $model = 'Magento\Framework\View\Element\UiComponent\DataProvider\Document',
        $connection = null,
        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
    ) {
        parent::__construct(
            $entityFactory,
            $logger,
            $fetchStrategy,
            $eventManager,
            $storeManager,
            $connection,
            $resource
        );
        $this->_eventPrefix = $eventPrefix;
        $this->_eventObject = $eventObject;
        $this->_init($model, $resourceModel);
        $this->setMainTable($mainTable);
    }

    /**
     * @return AggregationInterface
     */
    public function getAggregations()
    {
        return $this->aggregations;
    }

    /**
     * @param AggregationInterface $aggregations
     *
     * @return $this
     */
    public function setAggregations($aggregations)
    {
        $this->aggregations = $aggregations;
    }


    /**
     * Get search criteria.
     *
     * @return \Magento\Framework\Api\SearchCriteriaInterface|null
     */
    public function getSearchCriteria()
    {
        return null;
    }

    /**
     * Set search criteria.
     *
     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setSearchCriteria(
        \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria = null
    ) {
        return $this;
    }

    /**
     * Get total count.
     *
     * @return int
     */
    public function getTotalCount()
    {
        return $this->getSize();
    }

    /**
     * Set total count.
     *
     * @param int $totalCount
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setTotalCount($totalCount)
    {
        return $this;
    }

    /**
     * Set items list.
     *
     * @param \Magento\Framework\Api\ExtensibleDataInterface[] $items
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setItems(array $items = null)
    {
        return $this;
    }
}

?>

มันไม่ทำงาน
saravanavelu

ทำงานได้ดีสำหรับฉัน .. อะไรคือข้อผิดพลาดสำหรับคุณ?
Ekta Puri

ข้อผิดพลาดเซิร์ฟเวอร์ภายใน คุณสามารถตรวจสอบและฟอร์แมตโค้ดของคุณใหม่ได้
ไหม

ฉันสามารถดูไฟล์ของคุณที่ไหนสักแห่ง? เพราะสิ่งนี้ได้ผลกับฉันอย่างสมบูรณ์แบบฉันยังจะพยายามฟอร์แมตอีกครั้ง
Ekta Puri

etc / di.xml Model / Resource / Modulename / Collection ไม่มีอะไรอย่างนี้ใน di.xml
saravanavelu

2

ใน ui definition xml มีโหนดแหล่งข้อมูลคล้ายกับสิ่งนี้

<dataSource name="listing_name_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">UniqueNameGridDataProvider</argument>
        <argument name="name" xsi:type="string">listing_name_data_source</argument>

ซึ่งlisting_name_data_sourceสามารถกำหนดได้ในของคุณdi.xmlหรือเพียงแค่อ้างอิงชั้นเรียนโดยตรง ชั้นควรขยายจากMagento\Framework\View\Element\UiComponent\DataProvider\CollectionFactoryและมีการcollectionsโต้แย้งคอลเลกชันที่กำหนดเองของคุณ ใน_initSelect()วิธีการเรียนของคอลเลกชันที่คุณสามารถเข้าร่วมตารางของคุณ


1
ในการขาย di.xml มันแสดง Magento \ Sales \ Model \ ResourceModel \ Order \ Grid \ Collection โดยที่ไฟล์นั้นมันไม่ออกเองในกรณีนั้นเราไม่สามารถเขียนปลั๊กอินหรือเหตุการณ์ได้อีกวิธีการตรวจสอบยอดขายและสั่งซื้อ รหัสชุดกริดฉันหวังว่าจะชัดเจนมากขึ้น
Pradeep Kumar

มันถูกกำหนดไว้ที่นี่github.com/magento/magento2/blob/develop/app/code/Magento/Sales/…และเป็นประเภทเสมือนจริงที่ยื่นออกมาจาก Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ SearchResult
Kristof at Fooman

จากนั้นโฮเพื่อเพิ่มเข้าร่วมใน class.can คุณให้รหัสตัวอย่าง
Pradeep Kumar

นี่เป็นตัวอย่างสำหรับการเข้าร่วมgithub.com/magento/magento2/blob/develop/app/code/Magento/ ...... ตามที่ใช้ใน initSelect github.com/magento/magento2/blob/develop/app/code/Magento/
Kristof ที่ Fooman

@KristofatFooman คุณให้ตัวอย่างที่ไม่ถูกต้องเพราะมันเป็นประเภทเสมือนคุณช่วยยกตัวอย่างการกำหนดกริดคอลเลกชันเป็นประเภทเสมือนได้หรือไม่?
LucScu

2

สำหรับใครก็ตามที่มีปัญหากับโซลูชัน@Asrar ให้ทำดังนี้

public function aroundGetReport(
    \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
    \Closure $proceed,
    $requestName
) {
    $result = $proceed($requestName);
    if ($requestName == 'sales_order_grid_data_source_firsty') {
        if ($result instanceof $this->collection
        ) {
            $select = $this->collection->getSelect();
            $select->join(
                ["soi" => "sales_order_item"],
                'main_table.entity_id = soi.order_id',
                array('sku', 'name','item_id')
            )
                ->distinct();
            return $this->collection;
        }

    }
    return $result;
}

ดูเหมือนว่าจะใช้ได้สำหรับฉัน

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