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