Доброго всем дня! Я буквально сегодня познакомился с Drupal и очень рад этому. Потихоньку стали возникать первые вопросы.
Вопрос такой: вот есть у записи доп. поле с возможностью мультивыбора значений. Есть значения 1, 2 и 3. Каким способом можно вывести на сайте диапазон выбранных значений? Т.е. если выбраны все три значения, то выводим 1-3. Если выбраны значения 2 и 3, то и выводим 2-3 и так далее.
Комментарии
Стандартными средствами - никак.
Нужно писать свой файлд форматтер и в нем реализовывать нужную логику.
Для ленивых есть модуль на эту тему: https://www.drupal.org/project/custom_formatters
Но я бы начал с логики - может быть изначально лучше выбирать диапазон?
Спасибо! Посмотрю возможности модуля. Поле типа "диапазон" не совсем подходит для моих целей. Нужен именно вывод на экран первого выбранного из списка значения и последнего.
Спасибо! Надеялся на то, что есть готовое решение. В одной из популярных cms это реализовывалось несколькими строчками кода.
Здесь тоже можно в несколько строк решить в препроцессе поля. По поводу готовых решений тут не всё так просто, потому что ваше поле по сути не диапазон. Представьте, что будет, если в поле более трёх значений, например 1,2,3,5,7,8,9. Это нужно выводить как 1-3, 5, 7-9? А как быть с нецелыми значениями? Или если они, скажем, кратны 10? Нужна ли обработка буквенных значений? Должен ли форматтер понимать римские цифры?
А вы говорите пару строчек. Да тут их никак не меньше 15.
Да оно вообщем и есть несколькими строчками, в пхп много функций работы со строками и массивами. Я бы сделал так:
1. Загнал список значений в массив.
2. Отсортировал по возрастанию.
3. Вывел первое и последнее.
Строчек пять вроде будет.
Ага, и при значениях 1 и 9 выведется 1- 9, что вообще никаким боком не соответствует действительности.
Согласно ТЗ)))
Тут для начала нужно описывать задачу на уровне логики, а потом загонять в код. У нас в школе на информатике висел плакатик, на котором было написано что-то аля "компьютер делает не то что вы думаете, а то что вы пишете".
Например, как-то так (только для ориентира, реализация зависит от конкретного типа поля, юзайте dpm())
<?php
$output = '';
// Теперь мякотка. Первое значение (подразумевается, что поле таки числовое).
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());
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. Могут быть некоторые неточности, писал навскидку, да и не проверял. Но смысл такой.