Вы здесь

Похожие материалы на основе значения полей с текущей ноды

0

Подскажи, пожалуйста, как можно реализовать подобный функционал (без таксономии).

Есть тип материала (Unit) в нем есть поля Цена и Регион

Нужно вывести на странице ноды блок с материалами типа Unit в которых поле Регион имеет такое же значение как и в ноде которую просматриваем, а поле Цена +/- 30%...

Версия Drupal: 
8.x
Вопрос задан 11.05.2019 - 14:15
Аватар пользователя Denis
Denis
77

А поле Регион, как сделано? В виде списка?

Комментарий оставлен 16.05.2019 - 20:32

Ответы

0

Нашел достаточно простое решение.

  1. Создаем Views настраиваем на свой вкус.
  2. Добавляем все нужные фильтра (включая те, которые должны быть динамичны)
  3. Пишем маленький модуль
use Drupal\views\ViewExecutable;
use Drupal\views\Plugin\views\query\QueryPluginBase;

/**
 * Implements hook_views_query_alter().
 */
function MODULENAME_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {

   if ($view->id() == 'VIEWS_ID' and $view->getDisplay()->display['id'] == 'VIEWS_DISPLAY') {

       // Получаем обхект текущей ноды
       $node = \Drupal::routeMatch()->getParameter('node');
       if ($node instanceof \Drupal\node\NodeInterface) {

            // Получаем значение полей по которому будем фильтровать.
            // Поле ЦЕНА (числовое значение)
            $curPrice = $node->get('field_unit_sale_price')->getValue();
            $curPrice = $curPrice[0]['value'];

            // Поле РЕГИОН (Таксономия)
            $curDistrict = $node->get('field_unit_district')->getValue();
            $curDistrict = $curDistrict[0]['target_id'];

            // Поле ТИП (списко)
            $curType = $node->get('field_unit_type')->getValue();
            $curType = $curType[0]['value'];

           // Смотрим, если в поле ЦЕНА нету значения или равно 0, записываем в значения для фильтрации 0 и существующий максимум, если нет, считаем +/- 20% и записываем в фильтра.
           if (!empty($curPrice) or $curPrice != 0) {
               $minPrice = $curPrice - ($curPrice * 0.2);
                $maxPrice = $curPrice + ($curPrice * 0.2);
           } else {
               $minPrice = 0;
               $maxPrice = 999999999;
           }
       }

       // Проходимся по фильтрам
        foreach ($query->where as &$condition_group) {
            foreach ($condition_group['conditions'] as &$condition) {

                // Находим фильтр ТИП, подставляем наше значение
                if (strpos($condition['field'], 'ield_unit_type_value')) {
                    $condition['value'][':node__field_unit_type_field_unit_type_value'] = $curType;
                }

                // Находим фильтр Регион, подставляем наше значение
                if (strpos($condition['field'], 'field_unit_district_target_id')) {
                    $condition['value'][':node__field_unit_district_field_unit_district_target_id'] = $curDistrict;
                }

                // Находим фильтр ЦЕНА, подставляем наши значение, фильтр типа BETWEEN
                if (strpos($condition['field'], 'field_unit_sale_price_value')) {
                    $condition['value'][0] = $minPrice;
                    $condition['value'][1] = $maxPrice;
                }
            }
        }
   }
  1. Profit
Ответ дан 25.09.2019 - 14:21
Аватар пользователя Denis
Denis
77
0

Я думаю, можно написать следующий модуль.

Описывается блок, контент которого будет представлять список требуемых нод.

А список требуемых нод можно получить с помощью SQL-запроса, который получает nid текущей ноды и возвращает ноды, у которых nid не равен nid текущей ноды, значение региона равно значению региона текущей ноды, а цена находится в таком-то диапазоне.

Можно также, думаю, использовать кеширование, а кеш обновлять при добавлении/изменении/удалении нод такого типа.

Думаю, это одно из самых простых решений.

Ответ дан 16.05.2019 - 23:22