2

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?

1 Answer 1

1

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.