In Magento 1.9 I had:

protected function getOptionArray()
{
    return array(
        'Has Ticket' => Mage::helper('Sales')->__('Si'),
        'Has No Ticket' => Mage::helper('Sales')->__('No')
    );
}

protected function _callbackHasTicket($collection, $column){
    if (!$value = $column->getFilter()->getValue()) {
        return $this;
    }
    if ($value == 'Has No Ticket') {
        $this->getCollection()->getSelect()->where(
             "bileamara_order_tickets.nr_tickets IS NULL");
    }
    else {
        $this->getCollection()->getSelect()->where(
             "bileamara_order_tickets.nr_tickets IS NOT NULL");
    }

    return $this;
}

I need to do the same on Magento 2 but I can't find anything similar to filter_condition_callback.

Any Help?

有帮助吗?

解决方案

Maybe there are better solutions, but this work for me:

<?php

namespace Bileamara\SalesOrderGrid\Ui\Component\Listing\Column\Ticket;

use Magento\Framework\Data\OptionSourceInterface;

/**
 * Class Options
 */
class Options implements OptionSourceInterface
{
    protected $salesCollection;

     protected $options;

    public function toOptionArray()
    {
        return array(
            array(
                'label' => __('Yes'),
                'value' => 'bot.nr_tickets IS NOT NULL'
            ),
            array(
                'label' => __('No'),
                'value' => 'bot.nr_tickets IS NULL'
            )
        );
    }
}

<?php
namespace Bileamara\SalesOrderGrid\Model\ResourceModel\Order\Grid;

class Collection extends \Magento\Sales\Model\ResourceModel\Order\Grid\Collection
{
    protected function _construct()
    {
        parent::_construct();
        $this->addFilterToMap(
            'items_skus',
            'soi.sku'
        );
        $this->addFilterToMap(
            'items_names',
            'soi.name'
        );
        $this->addFilterToMap(
            'bill_to_country',
            'soa.country_id'
        );
        $this->addFilterToMap(
            'has_ticket',
            'bot.nr_tickets'
        );
    }

    protected function _renderFiltersBefore()
    {

        $select = $this->getSelect();
        $select->joinLeft(
            ['soi' => 'sales_order_item'],
            'soi.order_id = main_table.entity_id',
            [
            'items_skus'  => new \Zend_Db_Expr('group_concat(soi.sku SEPARATOR ";")'),
            'items_names' => new \Zend_Db_Expr('group_concat(soi.name SEPARATOR ";")')
            ]
        );                
        $select->joinLeft(
            ['soa' => 'sales_order_address'],
            'main_table.entity_id = soa.parent_id',
            ['bill_to_country' => 'country_id']
        );                
        $select->joinLeft(
            ['bot' => 'bileamara_order_tickets'],
            'bot.order_id = main_table.entity_id',
            ['has_ticket' => 'bot.nr_tickets']
        );                
        $select->where('soa.address_type = "billing"');
        $select->where('soi.product_type = "simple"');
        $select->group('main_table.entity_id');

        $where = $select->getPart(\Zend_Db_Select::WHERE);
        foreach ($where as $key => $condition){
            $wh[] = preg_replace('/\(.*=.*(bot.nr_tickets IS (NOT )?NULL).*/','($1)',$condition);
        }
        $select->setPart(\Zend_Db_Select::WHERE,$wh);

        $this->_logger->debug(print_r($select->getPart(\Zend_Db_Select::WHERE),true));
        parent::_renderFiltersBefore();
    }
}

In addition, to export the grid in csv and xml you need to override the ConvertToCsv and ConvertToXml files:

<?php
namespace Bileamara\SalesOrderGrid\Model\Export;

class ConvertToCsv extends \Magento\Ui\Model\Export\ConvertToCsv
{
    public function getCsvFile()
    {
        $component = $this->filter->getComponent();

        $name = md5(microtime());
        $file = 'export/'. $component->getName() . $name . '.csv';

        $this->filter->prepareComponent($component);
        $this->filter->applySelectionOnTargetProvider();
        $dataProvider = $component->getContext()->getDataProvider();
        $fields = $this->metadataProvider->getFields($component);
        $options = $this->metadataProvider->getOptions();

        $this->directory->create('export');
        $stream = $this->directory->openFile($file, 'w+');
        $stream->lock();
        $stream->writeCsv($this->metadataProvider->getHeaders($component));
        $i = 1;
        $searchCriteria = $dataProvider->getSearchCriteria()
            ->setCurrentPage($i)
            ->setPageSize($this->pageSize);
        $totalCount = (int) $dataProvider->getSearchResult()->getTotalCount();
        while ($totalCount > 0) {
            $items = $dataProvider->getSearchResult()->getItems();
            foreach ($items as $item) {
                if($item->getHasTicket()){
                    $item->setHasTicket('bot.nr_tickets IS NOT NULL');
                }
                $this->metadataProvider->convertDate($item, $component->getName());
                $stream->writeCsv($this->metadataProvider->getRowData($item, $fields, $options));
            }
            $searchCriteria->setCurrentPage(++$i);
            $totalCount = $totalCount - $this->pageSize;
        }
        $stream->unlock();
        $stream->close();

        return [
            'type' => 'filename',
            'value' => $file,
            'rm' => true  // can delete file after use
        ];
    }
}

<?php
namespace Bileamara\SalesOrderGrid\Model\Export;

class ConvertToXml extends \Magento\Ui\Model\Export\ConvertToXml
{
    protected function prepareItems($componentName, array $items = [])
    {
        foreach ($items as $document) {
            if($document->getHasTicket()){
                $document->setHasTicket('bot.nr_tickets IS NOT NULL');
            }
            $this->metadataProvider->convertDate($document, $componentName);
        }
    }
}
许可以下: CC-BY-SA归因
scroll top