Magento 2:如何自定义管理销售订单网格集合?

时间:2017-05-16 12:46:34

标签: magento2

我正在尝试自定义管理销售订单网格集合。 我创建了自定义sale_order属性store_manager。这些商店经理是管理员用户,例如:'manager1','manager2'。

1)订单被手动分配到'manager1'或'manager2' - 此部分已完成

2)现在我正在尝试在销售订单网格集上设置过滤器,因此当经理登录系统时他们只能看到订单。

在Magento 1中,我们为此要求sales_order_grid_collection_load_beforesales_order_grid_collection_load_after

为Magento 2尝试了这样的活动,但没有取得任何成功。

我的查询:

magento 1中是否有像sales_order_grid_collection_load_after这样的事件满足我的要求?

有没有其他方法可以将过滤器设置为销售订单网格集合?

注意:我已经在google上搜索了这个,但没有得到任何完美的解决方案。

4 个答案:

答案 0 :(得分:1)

我正在搜索事件sales_order_grid_collection_load_after和sales_order_grid_collection_load_before以自定义销售订单网格。

我的调查结果显示,Magento 2中没有此类事件。一般事件' core_collection_abstract_load_after'或者' core_collection_abstract_load_before'发送以呈现Magento 2 Admin中的所有网格。

我们可以覆盖_renderFiltersBefore()函数,在销售订单网格中添加列,或者将表与sales_order_grid连接。以下是步骤:

步骤1:在app / code / Vendor / Module / etc / di.xml中指定销售订单网格数据源的类

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <arguments>
        <argument name="collections" xsi:type="array">
            <item name="sales_order_grid_data_source" xsi:type="string">Vendor\Module\Model\ResourceModel\Order\Grid\Collection</item>
        </argument>
    </arguments>
</type>

第2步:在app / code / Vendor / Module / Model / ResourceModel / Order / Grid中添加Collection类以覆盖_renderFiltersBefore()

<?php
    namespace Vendor\Module\Model\ResourceModel\Order\Grid;

    use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OriginalCollection;
    use Magento\Framework\Data\Collection\Db\FetchStrategyInterface as FetchStrategy;
    use Magento\Framework\Data\Collection\EntityFactoryInterface as EntityFactory;
    use Magento\Framework\Event\ManagerInterface as EventManager;
    use Psr\Log\LoggerInterface as Logger;
    class Collection extends OriginalCollection
    {
        protected $_authSession;
        public function __construct(
           EntityFactory $entityFactory,
           Logger $logger,
           FetchStrategy $fetchStrategy,
           EventManager $eventManager,
           \Magento\Backend\Model\Auth\Session $authSession
          )
        {        
           $this->_authSession = $authSession;
           parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager);
        }

        protected function _renderFiltersBefore() {
            $user = $this->_authSession->getUser();
            $joinTable = $this->getTable('your_table');
            $this->getSelect()->joinLeft($joinTable, 'main_table.entity_id = your_table.order_id', ['user_id']);
            parent::_renderFiltersBefore();
        }
    }
?>    

步骤3 - 可选:要在销售订单网格中显示新的用户ID列,请在app / code / Vendor / Module / view / adminhtml / ui_component / 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">
        <column name="user_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">User ID</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

引用为here

答案 1 :(得分:1)

我们通常需要在对di.xml进行任何更改后执行以下命令:

php -dmemory_limit = 6G / [MAGENTO2_ROOT] / bin / magento设置:di:compile

php -f / [MAGENTO2_ROOT] / bin / magento设置:升级

rm -rf / [MAGENTO2_ROOT] / var / view_preprocessed / / [MAGENTO2_ROOT] / var / cache / / [MAGENTO2_ROOT] / var / page_cache / / [MAGENTO2_ROOT] / var / generation /

rm -rf / [MAGENTO2_ROOT] / pub / static / frontend /

php -dmemory_limit = 6G / [MAGENTO2_ROOT] / bin / magento设置:静态内容:部署

php -f / [MAGENTO2_ROOT] / bin / magento缓存:刷新 php -f / [MAGENTO2_ROOT] / bin / magento缓存:干净

sudo chmod -R 777 / [MAGENTO2_ROOT] / var / [MAGENTO2_ROOT] / pub

按照您的要求使用。

答案 2 :(得分:1)

这可能已经晚了,但是下面是使用Magento-2.3的经过测试的解决方案,用于向销售订单网格添加任何过滤器。

步骤1:将Magento/Sales/view/adminhtml/ui_component/sales_order_grid.xml覆盖为Vendor/Module/view/adminhtml/ui_component/sales_order_grid.xml,并使用您的自定义类Vendor/Module/Ui/Component/DataProvider/MyDataProvider.php更新dataProvider类(在覆盖的sales_order_grid.xml文件中)。

第2步:向其中添加以下代码

<?php

namespace Vendor\Module\Ui\Component\DataProvider;

use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\ReportingInterface;
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
use Magento\Framework\App\RequestInterface;

class MyDataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
{

    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        ReportingInterface $reporting,
        SearchCriteriaBuilder $searchCriteriaBuilder,
        RequestInterface $request,
        FilterBuilder $filterBuilder,
        array $meta = [],
        array $data = []
    ) {
        parent::__construct($name, $primaryFieldName, $requestFieldName, $reporting, $searchCriteriaBuilder, $request, $filterBuilder, $meta, $data);
        $this->myDefaultFilter();
    }

    protected function myDefaultFilter()
    {
        //do your stuff here get admin user id and apply filter accordingly

        //here is sample filtering
        $this->addFilter(
            $this->filterBuilder->setField('my_column_name')->setValue('value_to_be_filtered')->setConditionType('eq')->create()
        );
    }
    
}

现在,在此myDefaultFilter函数中,调用您的块来获取当前的用户详细信息,并相应地添加逻辑以过滤网格数据。

答案 3 :(得分:0)

对于我们的自定义网格,我们将使用自己的默认数据源进行更改。它的父级是grid集合的标准类,它将使第三方扩展可以使用观察者和插件轻松地处理修改(如果需要)。

要实现此目的,请在我们模块的di.xml文件中,指定应将另一个类用于sales_order_grid数据源。

  

app / code / Vendor / ExtendGrid / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
<arguments>
<argument name="collections" xsi:type="array">
<item name="sales_order_grid_data_source" xsi:type="string">Vendor\ExtendGrid\Model\ResourceModel\Order\Grid\Collection</item>
</argument>
</arguments>
</type>
</config>

如您所见,我们需要集合的扩展类。让我们在这里创建它:

  

app / code / Vendor / ExtendGrid / Model / ResourceModel / Order / Grid / Collection.php

<?php
namespace Vendor\ExtendGrid\Model\ResourceModel\Order\Grid;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OriginalCollection;
use Vendor\ExtendGrid\Helper\Data as Helper;
/**
* Order grid extended collection
*/
class Collection extends OriginalCollection
{
}

我们修改了_renderFiltersBefore方法,以便它可以连接到我们的表并在其中选择必要的列。

为此,

<?php
namespace Vendor\ExtendGrid\Model\ResourceModel\Order\Grid;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OriginalCollection;
use Vendor\ExtendGrid\Helper\Data as Helper;
/**
* Order grid extended collection
*/
class Collection extends OriginalCollection
{
     protected function _renderFiltersBefore()
     {
        $joinTable = $this->getTable('sales_order');
        $this->getSelect()->joinLeft($joinTable, 'main_table.entity_id = sales_order.entity_id', ['coupon_code']);

       //or filter in sale_order_grid collection then use like that

       $this->getSelect()->where("main_table.your_attribute is NULL");

       parent::_renderFiltersBefore();
   }
}

希望对您有帮助。

相关问题