<?php namespace Drupal\bb2b_order\Plugin\views\filter; use Drupal\Core\Form\FormStateInterface; use Drupal\views\Plugin\views\filter\FilterPluginBase; /** * Filter products by stock status. * * @ingroup views_filter_handlers * * @ViewsFilter("stock_status") */ class StockStatus extends FilterPluginBase { /** * {@inheritDoc} */ public function acceptExposedInput($input) { return TRUE; } /** * {@inheritDoc} */ public function buildExposedForm(&$form, FormStateInterface $form_state) { if (empty($this->options['exposed'])) { return; } $identifier = $this->options['expose']['identifier']; $exposed_input = $this->view->getExposedInput(); $options = [ NULL => t('Show all products'), 'only_available' => t('Show only available products'), ]; $form[$identifier] = [ '#type' => 'select', '#title' => t('Stock status'), '#options' => $options, '#default_value' => $exposed_input, ]; return $form; } /** * {@inheritDoc} */ public function query() { /** @var \Drupal\views\Plugin\views\query\Sql $query */ $query = $this->query; $stock_status = $this->view->getExposedInput(); if (isset($stock_status['stock_status']) && $stock_status['stock_status'] === 'only_available') { $query->addWhereExpression($this->options['group'], "commerce_product_field_data.stock > 0"); } } }