Фильтрация views по разным единицам измерения

Главные вкладки

Аватар пользователя kuzmich111 kuzmich111 6 апреля 2023 в 9:29

Доброго времени суток! Имеется тип материала с полем "Площадь в кв.м." и вьюс, который показывает эти материалы. Во вьюсе работает раскрытая форма с фильтрацией по этому полю с типом "между". Возникла необходимость дать посетителю выбрать в каких единицах измерения делать фильтр: кв.м, сотки, гектары. Например, так:

Как такое реализовать?
Думаю в сторону computed fields, но непонятно как это красиво собрать в один блок...

Комментарии

Аватар пользователя kuzmich111 kuzmich111 18 апреля 2023 в 8:30
2

Как решил вопрос?
Сделал альтер формы вьюса:

<?php
function <MYMODULE>_form_views_exposed_form_alter(&$formFormStateInterface $form_state$form_id) {
  if (
$form['#id'] == '<MY-FORM-ID>') {
    
$form['area_wrapper']['area_units'] = array(
      
'#type' => 'radios',
      
'#options' => array('metr' => 'м<sup>2</sup>''sot' => 'сотках''ga' => 'ГА'),
      
'#default_value' => 'metr',
      
'#weight' => -1,
    );
  }
}
?>

Получилось такое:

Затем альтер запроса вьюса:

<?php
function <MYMODULE>_views_query_alter(ViewExecutable $viewQueryPluginBase $query) {
  if (
$view->id() == '<MY-VIEWS-ID>') {
    
$exposed_input $view->getExposedInput();
    if (isset(
$exposed_input['area_units'])) {
      
$unit $exposed_input['area_units'];
      
$where = &$query->getWhere();
      foreach (
$where[1]['conditions'] as &$condition) {
        if (
$condition[0] == 'field_lot_area') {
          if (
is_array($condition[1])) {
            foreach (
$condition[1] as &$value) {
              if (
$unit == 'sot') {
                
$value $value 100;
              } elseif (
$unit == 'ga') {
                
$value $value 10000;
              }
            }
          } else {
            if (
$unit == 'sot') {
              
$condition[1] = $condition[1] * 100;
            } elseif (
$unit == 'ga') {
              
$condition[1] = $condition[1] * 10000;
            }
          }
        }
      }
    }
  }
}
?>

Всем спасибо за помощь Wink