Рейтинг:0

Программное изменение порядка ссылочных объектов по полю

флаг es
gr8

У меня есть тип контента Speaker, который использует тип контента Event в качестве ссылки. Событие имеет поле даты и времени начала. Мероприятий, на которых выступает спикер, может быть любое количество, при посещении страницы спикера события упорядочены не по дате, а по id. Как мне программно изменить это?

Я могу получить значение поля и отсортировать его по дате, но не могу вернуть его в переменную.

Связанная ссылка API Drupal

используйте \Drupal\Component\Utility\SortArray;


функция mytheme_preprocess_node__speaker_page(&$variables) {
  $узел = $переменные['узел'];
  $entity_ids = [];
  если ($ узел) {
    если (isset($node->field_events)) {
      $items = $node->field_events; // ссылка на сущность
      $ несортированный = массив ();
      foreach ($items as $item) {
        $target_id = $item->target_id;
        $field_event = $item->сущность;
        //создание нового несортированного массива с целевым идентификатором и датой события, это используется для сортировки
        array_push($unsorted, array('target_id' => $target_id, 'event_date' => strtotime($field_event->field_date_of_event->value)));
      }
      //сортировка
      usort($unsorted, функция ($a, $b) {
        вернуть SortArray::sortByKeyInt($a, $b, 'event_date');
      });
      //отсортированные идентификаторы
      $new_entity_ids = array_column($unsorted, 'target_id');

      $items_new = \Drupal\node\Entity\Node::loadMultiple($new_entity_ids);
      $variables['node']->field_events = $items_new; // это не работает
      //$variables['node']->set($field_name)->referencedEntities(); 
    }
  }
}
Kevin avatar
флаг in
Вам все еще нужно изменить порядок в массиве рендеринга, чтобы это повлияло на вывод.
Kevin avatar
флаг in
Не проще ли перенести эту логику в средство форматирования полей?
Jaypan avatar
флаг de
Вот где бы я это сделал.
флаг es
gr8
спасибо @Kevin извините, я новичок в этом, насколько я понимаю, мне нужно будет создать средство форматирования настраиваемого поля, которое сортирует ссылочные объекты по дате события, а затем установить этот форматировщик поля для поля ссылочных объектов на дисплее Тип контента динамика, я прав? Не будет ли это более долгим и трудоемким способом сделать это? Я пытался сделать быстрее, так как это просто сортировка.
Kevin avatar
флаг in
Проблема в том, что вы не хотите иметь здесь дело с манипулированием массивом рендеринга, и в тот момент, когда вы захотите показать это поле в другом месте, вам придется снова выполнять код в другом месте. Форматировщики полей можно использовать повторно.
флаг es
gr8
Имеет смысл, спасибо @Kevin
4uk4 avatar
флаг cn
Аналогичное обсуждение манипулирования списком ссылочных объектов в средстве форматирования поля, включая пример кода: https://drupal.stackexchange.com/questions/294728/filter-the-list-of-entities-referenced-by-entity-reference-revisions -поле
4uk4 avatar
флаг cn
Для решения без кода вы можете использовать https://www.drupal.org/project/eva
флаг es
gr8
да, я создаю средство форматирования полей, спасибо @4k4

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.