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>

그래서 우리는 가로 채고 있습니다

마 젠토 \ 프레임 워크 \보기 \ 요소 \ UiComponent \ DataProvider \ CollectionFactory

왜냐하면 당신이 보면

마 젠토 \ 판매 \ etc \ di.xml

당신은 볼 것이다

마 젠토 \ 판매 \ 주문 \ 그리드 \ 컬렉션

에 주입되었다

마 젠토 \ 프레임 워크 \보기 \ 요소 \ 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 () 메소드의 이벤트를 관찰 하고 있습니다.

vendor / magento / module-sales / view / adminhtml / ui_component / sales_order_grid.xml

모듈의 범위에

공급 업체 / 모듈 이름 /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"].
David

제대로 작동한다고 생각했지만 송장 그리드도 엉망인 것 같습니다. 모듈을 활성화하면 송장 그리드에 주문 ID와 상태가 이상하게 비어 있습니다. 무엇이 잘못 될 수 있는지에 대한 아이디어가 있습니까?
David

이 정보에 감사드립니다. 회사 이름을 추가하는 데 도움이되었습니다. 하지만 배송 대신 결제 및 배송 정보를 표시하려면 어떻게해야하나요? 나는 1 표시 할 수 있습니다 또는 다른 그러나 나는 말을 '회사'이름을 바꿀 수없는 것 'billing_company'와 'shipping_company'sales_order_grid.xml에서 사용하려면
RLTcode

1
플러그인 클래스를 사용할 때 CMS 페이지, CMS 블록, 고객 및 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은 다른 커뮤니티 회원을
도왔습니다

물론 :) @KeyurShah 나는 커뮤니티를 돕기를 좋아합니다 .ui 구성 요소없이 그리드를 만들고 있습니다. 내에서 내보내기 기능을 추가하는 방법을 알려주십시오.
Rohit Goel

1
대신을 _renderFiltersBefore(를) 재정의 / 확장 할 수도 있습니다 _initSelect.
Jānis Elmeris

3

두 개의 사용자 정의 테이블을 결합한 관리 표를 만들었습니다. 가상 유형 인 di.xml을 사용하여이 작업을 수행 할 수 없으므로 다음 단계를 수행하고

etc / di.xml,

이 파일에서 Model / Resource / Modulename / Collection.php add join,

Model / Resource / Modulename / Grid / 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>

모델 / 리소스 / 모듈 이름 /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']
            );
    }
}
?>

모델 / 리소스 / 모듈 이름 / 그리드 /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 2016 년

나를 위해 잘 작동합니다. 당신에게 어떤 오류가 있습니까?
Ekta Puri

인터넷 서버 오류. 코드를 확인하고 재 포맷 할 수 있습니다
saravanavelu

어딘가에서 파일을 볼 수 있습니까? 이것은 나를 위해 완벽하게 작동했기 때문에 여전히 다시 포맷을 시도합니다
Ekta Puri

etc / di.xml 모델 / 리소스 / 모듈 이름 / 컬렉션 di.xml에는 이와 같은 것이 없습니다
saravanavelu

2

UI 정의 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\CollectionFactorycollections가져와야합니다. 해당 콜렉션 클래스의 _initSelect()메소드에서 테이블을 결합 할 수 있습니다.


1
sales di.xml에서 Magento \ Sales \ Model \ ResourceModel \ Order \ Grid \ Collection을 표시합니다.이 파일은 자체 종료되지 않습니다.이 경우 플러그인 또는 이벤트를 다시 작성할 수 없습니다. 그리드 수집 코드, 나는 그것이 더 명확
해지기를

여기 github.com/magento/magento2/blob/develop/app/code/Magento/Sales/…에 정의되어 있으며 Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ SearchResult
Fooman의 Kristof에서

그 클래스에 조인을 추가하기 위해 ho. 당신은 예제 코드를 줄 수 있습니다
Pradeep Kumar


@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.