Рейтинг:0

Загрузка контента в представление через ссылку на одноуровневый объект

флаг za

Я думаю, что мне нужно использовать результаты одного представления Drupal для фильтрации результатов другого представления. Вот чего я пытаюсь добиться.

У меня есть 3 типа контента (типы узлов): Блог, Сообщение в блоге, Страница биографии (также известная как Автор блога)

Сообщение в блоге содержит ссылку как на блог, в котором он должен быть, так и на одну или несколько страниц биографии автора.

Что мне нужно сделать, так это взять идентификатор для данного блога и вернуть всех авторов, которые связаны через связанное сообщение в блоге. Затем удалите все дубликаты, чтобы отобразить список всех авторов определенного «блога».

Думаю, я смогу использовать отношения. Но все еще неясно, как это будет работать.

Как я могу это сделать?


ОБНОВЛЕНИЕ: Чтобы уточнить, мне нужно начать с идентификатора блога и с его помощью найти авторов любых сообщений в блоге, которые связаны с указанным идентификатором объекта блога. Затем возьмите этот набор результатов и выполните его дедупликацию. Я не беспокоюсь о дедупликации. Мне просто нужна помощь, чтобы понять, как загрузить авторов через эту связь.

Вот схема этого:

введите описание изображения здесь

Спасибо!

beltouche avatar
флаг cn
Судя по вашему описанию, для этого вам не нужно несколько представлений. Можете ли вы дать более подробную информацию? Что является отправной точкой - блог или сообщение в блоге? Где находится этот список авторов?
Patrick avatar
флаг za
@beltouche Я добавил дополнительную информацию, а также диаграмму, которая, надеюсь, поможет проиллюстрировать то, чего я пытаюсь достичь. Пожалуйста, дайте мне знать, если я могу предоставить любую другую информацию.
Рейтинг:1
флаг cn

Я собираюсь предположить, что этот список авторов будет отображаться, например, в виде блока на странице поста в блоге, например, «Другие авторы, связанные с блогом этого поста». (Я также предполагаю, что вы используете Drupal 8 или 9)

Ты может сделать это с отношениями:

  1. Первая связь осуществляется через поле идентификатора блога сообщения в блоге, чтобы получить блог.
  2. Следующая связь использует первую с «обратной» связью через то же поле, чтобы найти все сообщения в блоге, ссылающиеся на этот блог.
  3. Третье отношение использует второе, чтобы получить авторов через идентификатор автора.

Вот пошаговое руководство, которое я рекомендую использовать для полей.

  1. Добавьте первое отношение. Дайте ему хорошо читаемое «Административное название», потому что встроенные имена Drupal очень быстро становятся загадочными.
  2. Чтобы проверить, добавьте поле заголовка блога, чтобы подтвердить, что вы получили то, что ожидаете. (Вы всегда можете удалить его позже, если он вам не нужен.)
  3. Добавьте вторую связь, обязательно используя первую, а также дайте ей хорошее имя. Снова используйте поле из нового отношения для проверки работоспособности.
  4. Добавьте третье отношение, обязательно используя второе...

Вы, вероятно, захотите установить флажок «требовать отношения» в каждом случае.

Да, я вижу, вы получаете массу дубликатов, которые вам придется удалить. Ты май иметь возможность избавиться от некоторых с помощью пользовательского интерфейса Views, но это всегда рискованно. Вам, вероятно, придется использовать хук представления, чтобы очистить вещи.

Patrick avatar
флаг za
Идея состоит в том, чтобы перечислить всех авторов на странице блога.По сути, лицо любого автора, у которого есть сообщение в данном блоге, должно отображаться на странице блога.
Patrick avatar
флаг za
Интересный подход. Мне не приходило в голову использовать третье отношение. Надо выяснить, как эта часть будет связана. Но мне нравится подход.
beltouche avatar
флаг cn
Если вы начнете со страницы блога, а не с поста в блоге, вы устраните первую связь, которую я указал.
Patrick avatar
флаг za
Я тоже как-то приземлился. Я просто не мог заставить Drupal правильно строить отношения через пользовательский интерфейс. Поэтому мне пришлось взломать его до конца. Но я собираюсь отдать вам должное за то, что вы помогли мне добраться туда.
Patrick avatar
флаг za
Для тех, кто еще читает это в будущем, см. мой ответ ниже для моего окончательного подхода к этому.
beltouche avatar
флаг cn
Должен признаться, я все еще удивлен, что это невозможно сделать полностью в пользовательском интерфейсе (за исключением дубликатов). Спасибо хоть. Я рад, что смог помочь вам найти решение.
Patrick avatar
флаг za
Может быть, есть способ, который я просто упускаю. Но, честно говоря, я думаю, что пользовательский интерфейс тоже страдает от попыток упростить имена отношений. Что запутывает дело.
Рейтинг:0
флаг za

Хорошо, поэтому после еще немного анализа Drupal Views и запроса из него я сделал это (что, честно говоря, было вдохновлено предложением в ответе от @beltouche).

Поэтому я устанавливаю отношения, используя поле ссылки на авторов постов в блоге. Установите его по мере необходимости. Затем я устанавливаю вторую обязательную связь через поле, которое ссылается на блог, и использую первую связь. Это второе отношение затем используется контекстным фильтром, который принимает значение идентификатора блога и таким образом находит результаты.

Затем я обнаружил, что запрос был очень близким и нужно было всего лишь изменить два соединения. Поэтому я взломал его, используя запрос alter (подробности ниже). Наконец, я установил «Использовать агрегацию» на «Да».

Вот мой код:

<?php
функция my_module_views_query_alter (ViewExecutable $ view, QueryPluginBase $ запрос) {
  if ($view->id() == 'авторы' && $view->current_display == 'authors_eva') {
    /*
     * В основном то, что я сделал здесь, заставило его построить отношения так, как я знаю, работает
     * который я протестировал, вручную переписав запрос и проверив базу данных.
     */
    $table_authors_field_data = $query->getTableInfo('blog_post_authors_node_field_data');

    если (!пусто($table_authors_field_data)) {
      $table_authors_field_data['join']->leftField = 'blog_post_authors_target_id';
    }

    $table_node_blog = $query->getTableInfo('blog_post_authors_node_field_data__node__blog');

    если (!пусто($table_node_blog)) {
      $table_node_blog['join']->field = 'entity_id';
      $table_node_blog['join']->leftField = 'entity_id';
      $table_node_blog['join']->leftTable = 'node__blog_post_authors';
    }
  }
}

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

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