Рейтинг:0

Возникли проблемы с программной фильтрацией представлений

флаг jp

Я использую блок представлений на своем веб-сайте, содержимое этого представления фильтруется программно. Теперь я получаю сообщения от пользователей, которые видят неверную информацию. Фильтр основан на текущем вошедшем в систему пользователе. Поскольку мне нужна эта информация в обычном фильтре, а не в контекстном, я создал простой модуль для изменения значения фильтра.

Мой фильтр такой:

(
Тип контента = contenttype_a
И
uid(автор узлов) = */это значение добавляется программно*/
)

ИЛИ ЖЕ

(
Тип контента = contenttype_b
И
user_target_id(reference) = */это значение добавляется программно*/
)

Чем я использую это в своем модуле:

 */
функция entity_access_views_pre_view (ViewExecutable $ view, $ display_id, массив и $ args) {
  $currentUser = \Drupal::currentUser();
  $cuid = $currentUser->id();

    /* @ Представление фильтра: Медиа */
    если ($view->id() == 'my_view_id') {
      если ($display_id == 'block_1' || $display_id == 'page_1' || $display_id == 'page_2') {
        $filters = $view->display_handler->getOption('filters');
        $filters['uid']['value']['value'] = $cuid;
        $filters['user_target_id']['value']['value'] = $cuid;
        $view->display_handler->overrideOption('filters', $filters);
      }
    }
}

Поскольку я не могу найти проблему, у меня есть сомнения, работает ли выше, как я хочу. Поэтому я хотел проверить, не видите ли вы чего-нибудь странного или фальшивого. Можно ли каким-то образом кэшировать это значение фильтра? Или, может быть, есть лучший способ сделать это.

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

Заранее спасибо.

Рейтинг:0
флаг cn

Сначала вы можете попробовать добавить контекст кеша в элемент рендеринга представления перед его рендерингом:

/**
 * Реализует hook_views_pre_render().
 *
 */
функция mymodule_views_pre_render (ViewExecutable $ view) {
  если ($view->id() == 'my_view_id') {
    если ($view->current_display == 'block_1') {
      $view->element['#cache']['contexts'][] = 'user';
      // или добавьте кеш max-age 0 для большого количества пользователей
      $view->element['#cache']['max-age'] = 0;
    }
  }
}

Однако это не помогает, если Views кэширует запрос внутренне. Затем вы можете попробовать отключить кеширование, настроив Никто или же по времени кеш-плагин в представлении. Здесь вы не можете настроить контекст кеша, только максимальный возраст кеша 0. Это не обязательно плохая идея, если у вас много пользователей и вы не хотите кэшировать такое же количество вариантов. Drupal имеет отличную систему кэширования для доставки некэшируемых блоков аутентифицированным пользователям (Dynamic Page Cache + BigPipe).

Joost avatar
флаг jp
Спасибо, отключение кеша в самом представлении — моя первая попытка решить эту проблему. Теперь жду, решит ли это проблему.

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

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