Magento2'de sipariş tablosu koleksiyonunu özel tabloya nasıl ekleyebilirim?


12

Magento 2.0 ızgara sipariş için yeni bir sütun eklemek çalışıyorum. Yani, ızgara koleksiyonu sipariş etmek için katılmalıyım. Bunu nasıl başarabilirim ? Çünkü magento2'de, ızgara UI bileşenini kullanır.

Yanıtlar:


12

Magento 2 müşteri siparişi ızgarasına özel sütunlar ekler,

Katılmak

Magento \ Satış \ al \ Izgara \ Koleksiyonu

herhangi bir tabloya eklenti kullanmak en iyi seçenek olacaktır, çünkü bu yeniden yazma işlemlerine dayanmaz ve kodu yalınlaştırır.

Eklentiyi modülünüzün etc / di.xml dosyasında oluşturun

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

Yani, biz müdahale ediyoruz

Magento \ Framework \ Görünüm \ Eleman \ UIComponent \ DataProvider'ın \ CollectionFactory

çünkü eğer

Magento \ Satış \ vb \ di.xml

görürdün

Magento \ Satış \ al \ Izgara \ Koleksiyonu

içine enjekte edildi

Magento \ Framework \ Görünüm \ Eleman \ UIComponent \ DataProvider'ın \ CollectionFactory

Modülünüzde bir Eklenti klasörü ve bir eklenti sınıfı oluşturun

<?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;
    }
}

Burada gözlemlediklerini çevresindeki getReport () yönteminin etkinliği.

kopya

satıcı / Magento / modül-satış / görünüm / adminhtml / ui_component / sales_order_grid.xml

modülünüzün kapsamına

Satıcı / modulename / görünüm / adminhtml / ui_component / sales_order_grid.xml

Tüm içeriği geçersiz kılmak istemediğimiz için kopyalanan sales_order_grid.xml dosyanızın tüm içeriğini silin.

Modülünüzün sales_order_grid.xml dosyasına aşağıdaki kodu girin

    <?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>

Şimdi var / cache klasöründen önbelleği silin veya önbelleğinizi yenileyin. Eklediğiniz sütunları müşteri siparişi ızgarasında görebilirsiniz.


Bunun için çok teşekkürler, benim tek sorun (Magento 2.2.0 ile) satırları ["soi" => "sales_order_item"]ve tablo öneki eklemek zorunda oldu ["soa" => "sales_order_address"].
David

Ben iyi çalıştığını düşündüm, ama aynı zamanda fatura ızgara ile karışıklık gibi görünüyor .. Modül etkinken, sipariş kimliği ve durumu fatura kılavuzunda garip boş .. Ne olabilir hakkında herhangi bir fikir?
David

Bu bilgi için teşekkür ederim, şirket adını eklememe yardımcı oldu. Ancak, yalnızca gönderim yerine fatura ve gönderim bilgilerini nasıl gösterebilirim? 1 veya diğerini gösterebilirim, ancak sales_order_grid.xml
RLTcode

1
Eklenti sınıfını kullanırken CMS Sayfası, CMS Bloğu, Müşteri ve Creditmemo ızgaralarında hata alma, Izgara koleksiyonunu değiştirmek için alternatif bir çözüm olup olmadığını lütfen bize bildirin.
Vishal

Fatura ızgarası vb. İçin hangi hataları görebilirsiniz?
Asrar

9

\Magento\Framework\Data\Collection\AbstractDbMagento2'ye baktığınızda koleksiyonunuz için kanca işlemi sağlayın.

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

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

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

Yani, sadece koleksiyonunuza ekleyerek bunu yapmanız gerekenler [ 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();
}

Bu durumda ho göstermek için benim özel tablo alanı göstermek gerekir ho?
Pradeep Kumar

@Keyur Shah Teşekkürler bana çok yardımcı oluyor.
Rohit Goel

Sana yardım ettiğini duyduğuma sevindim :) @RohitGoel Keep diğer topluluk üyesine yardım ediyor
Keyur Shah

Tabii :) @KeyurShah Topluluğa yardım etmeyi seviyorum. UI bileşeni olmadan bir ızgara oluşturuyorum, lütfen bana nasıl bir dışa aktarma özelliği ekleyebileceğimi söyleyebilir misiniz?
Rohit Goel

1
Bunun yerine, _renderFiltersBeforegeçersiz kılabilir / genişletebilirsiniz _initSelect.
Jānis Elmeris

3

İki özel tabloyu birleştiren yönetici ızgarası oluşturdum. di.xml sanal türünü kullanarak bunu yapamazsınız, bu nedenle bu adımları izlemeniz ve

etc / di.xml,

Model / Kaynak / Modulename / Collection.php bu dosyaya katıl,

Model / Kaynak / modulename / Izgara / Collection.php,

IN your 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>

Modelinizde / Kaynağınızda / 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']
            );
    }
}
?>

Modelinizde / Kaynak / 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;
    }
}

?>

Bu çalışma değildi
saravanavelu

benim için iyi çalışıyor .. senin için hata nedir?
Ekta Puri

İç Sunucu Hatası. kodunuzu kontrol edip yeniden biçimlendirebilir misiniz
saravanavelu

dosyalarınızı bir yerde görüntüleyebilir miyim? çünkü bu benim için mükemmel çalıştı, Yine yeniden biçimlendirmeye çalışacağım
Ekta Puri

etc / di.xml Model / Kaynak / modulename / Koleksiyon değil di.xml bu gibi bir şey var mı
saravanavelu

2

Ui xml tanımında buna benzer bir veri kaynağı düğümü vardır

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

Burada listing_name_data_sourcetanımlanabilir di.xmlveya doğrudan bir sınıfa referansta bulunabilirsiniz. Sınıfın kendisi , özel koleksiyonunuzdan genişlemeli Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactoryve collectionsargüman olarak olmalıdır . Bu toplama sınıfının _initSelect()yönteminde tablolarınıza katılabilirsiniz.


1
satış di.xml Magento \ Sales \ Model \ ResourceModel \ Order \ Grid \ Collection'ı gösteren dosyanın kendiliğinden çıkmadığını gösterir, bu durumda eklentiyi veya etkinliği yeniden yazamayız, o nasıl yapılır lütfen satış di ve siparişini kontrol edin ızgara toplama kodu, umarım daha fazla bilgi verir
Pradeep Kumar

Burada github.com/magento/magento2/blob/develop/app/code/Magento/Sales/… olarak tanımlanmıştır ve Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ SearchResult
Fooman'dan

sonra ho bu sınıfa katılmak için. örnek kod verebilir misiniz
Pradeep Kumar

burada bu init'te kullanılan bir github.com/magento/magento2/blob/develop/app/code/Magento/… için örnek olarak github.com/magento/magento2/blob/develop/app/code/Magento/… ' i seçin
Kristof at Fooman

@KristofatFooman, sanal bir tür olduğu için yanlış bir örnek veriyorsunuz, sanal tür olarak tanımlanan ızgara koleksiyonu için bir örnek verebilir misiniz?
LucScu

2

@ Asrar çözümü ile sorun yaşayan herkes için şunu yapın :

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;
}

Bu benim için iyi çalışıyor gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.