Вывод диапазона значений доп. поля

Аватар пользователя Kerncraft1

Доброго всем дня! Я буквально сегодня познакомился с Drupal и очень рад этому. Потихоньку стали возникать первые вопросы.

Вопрос такой: вот есть у записи доп. поле с возможностью мультивыбора значений. Есть значения 1, 2 и 3. Каким способом можно вывести на сайте диапазон выбранных значений? Т.е. если выбраны все три значения, то выводим 1-3. Если выбраны значения 2 и 3, то и выводим 2-3 и так далее.

Тип материала:
Версия Drupal:
Форумы:
0 Thanks

Комментарии

Аватар пользователя Kerncraft1
Kerncraft1 3 месяца назад

Спасибо! Посмотрю возможности модуля. Поле типа "диапазон" не совсем подходит для моих целей. Нужен именно вывод на экран первого выбранного из списка значения и последнего.

Аватар пользователя Kerncraft1
Kerncraft1 3 месяца назад

Спасибо! Надеялся на то, что есть готовое решение. В одной из популярных cms это реализовывалось несколькими строчками кода.

Аватар пользователя gun_dose
gun_dose 3 месяца назад

Здесь тоже можно в несколько строк решить в препроцессе поля. По поводу готовых решений тут не всё так просто, потому что ваше поле по сути не диапазон. Представьте, что будет, если в поле более трёх значений, например 1,2,3,5,7,8,9. Это нужно выводить как 1-3, 5, 7-9? А как быть с нецелыми значениями? Или если они, скажем, кратны 10? Нужна ли обработка буквенных значений? Должен ли форматтер понимать римские цифры?
А вы говорите пару строчек. Да тут их никак не меньше 15.

Аватар пользователя Phantom63rus
Phantom63rus 3 месяца назад

Да оно вообщем и есть несколькими строчками, в пхп много функций работы со строками и массивами. Я бы сделал так:
1. Загнал список значений в массив.
2. Отсортировал по возрастанию.
3. Вывел первое и последнее.

Строчек пять вроде будет.

Аватар пользователя gun_dose
gun_dose 3 месяца назад

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

Аватар пользователя Phantom63rus
Phantom63rus 3 месяца назад
1

Согласно ТЗ)))

Тут для начала нужно описывать задачу на уровне логики, а потом загонять в код. У нас в школе на информатике висел плакатик, на котором было написано что-то аля "компьютер делает не то что вы думаете, а то что вы пишете".

Аватар пользователя OldWarrior
OldWarrior 3 месяца назад
1
Kerncraft1 написал:
В одной из популярных cms это реализовывалось несколькими строчками кода.

Например, как-то так (только для ориентира, реализация зависит от конкретного типа поля, юзайте dpm())

<?php
function my_module_node_view(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display$view_mode) {
  
// Обрабатываем только тип материала 'page'.
  
if ($entity->getType() == 'page') {
    
// Грузим готовый объект $node. 
    
$node Node::load($entity->id());

    

$output '';
    if (
count($node->field_tags)) {
      
// Просто для примера - выводим/перечисляем все сохранённые значения нашего множественного поля.
      
foreach ($node->field_tags as $node_tag) {
        
// Например, если поле типа 'entity_reference'.
        
$output .= $node_tag->target_id;
        
// Или если обычное числовое поле.
        
$output .= $node_tag->value;
      }

      

// Теперь мякотка. Первое значение (подразумевается, что поле таки числовое).
      
$first reset($node->field_tags);
      
$first_value $first->value;
      
// Последнее значение.
      
$last end($node->field_tags);
      
$last_value $last->value;
      
// Форматируем диапазон.
      
$output .= $first_value ' - ' $last_value;
      
// Bingo. В twig'е будет доступно как динамическое поле 'field_selected_range'
      
$build['field_selected_range'] = [
        
'#markup'   => $output,
      ];
    }
  }
}
?>

PS. Могут быть некоторые неточности, писал навскидку, да и не проверял. Но смысл такой.