Как мне настроить мои представления так, чтобы они возвращали 404, используя Global: Null в контекстных фильтрах?

14

Стандартное поведение Drupal заключается в передаче всех аргументов независимо от того, запрошены они или нет. Иногда такое поведение желательно. Однако мне нужно вернуть 404 для чего угодно, кроме строки запроса.

Пример проблемы http://drupal.org/project/modules http://drupal.org/project/modules/google.com <- это должно вернуть 404; 200 дано. Штраф за дублированный контент!

Модуль views 404 предполагает, что по умолчанию вы не хотите, чтобы аргументы передавались. Однако нет версии D7 модуля.

Но на странице проекта написано, что 404-е для представлений также можно выполнить, установив Global: Null в Arguments.

Очевидно, что в D7 «аргументы» теперь являются «контекстными фильтрами», но я не уверен, какие настройки добавить в контекстный фильтр Global: null, чтобы получить желаемый результат.

Любая помощь будет оценена.

Найджел Уотерс
источник

Ответы:

22

В контекстных фильтрах выберите Добавить ; в появившемся диалоговом окне выберите Global: Null .

Скриншот

Нажмите на Добавить и настроить контекстные фильтры .

В диалоговом окне , которое появится рядом, в FIELDSET Когда значение фильтра доступен или по умолчанию предоставляется , проверьте Укажите критерии проверки , выберите - Базовая проверка - для валидатора , и выберите Показать «Страница не найдена» для действий , чтобы принять , если Значение фильтра не проверяется . В наборе полей Дополнительно установите флажок Сбой базовой проверки, если указан какой-либо аргумент .

Скриншот

Я протестировал его с созданным представлением «Статьи», и оно работает.

Скриншот

Скриншот

Аргумент «Global: Null» должен быть последним. Например, если вам нужен идентификатор пользователя, сначала добавьте его в качестве аргумента, а затем добавьте аргумент «Global: Null».

Я изменил представление «Статья», чтобы принимать идентификатор пользователя в качестве аргумента, который используется для фильтрации списка узлов статьи. Представление все еще работает, поскольку оно не принимает дополнительный аргумент.

Скриншот

Скриншот

киамлалуно
источник
1
Это вернет 403, а не 404 ошибку кода. Вместо этого выберите «Показать» Страница не найдена »
Евгений Фиделин
В теме о DO я вижу, что кто-то предлагает использовать arg (1) == NULL; в коде проверки php. Это лучше или почти то же самое?
Найджел Уотерс
1
@EugeneFidelin Я редактировал «главный» дисплей и не видел « Показать страницу не найдена» в качестве опции. Я исправил свой ответ.
kiamlaluno
@NigelWaters Забудь мой предыдущий ответ. :)Я редактировал неправильный дисплей, и вид не работал должным образом. Нет необходимости использовать код PHP для проверки аргумента; см обновленный ответ.
kiamlaluno
У меня пока недостаточно комментариев, чтобы комментировать, поэтому пишите здесь, чтобы сказать спасибо @kiamlaluno. Прекрасно работает и кое-что, против чего я бился некоторое время.
Blue Waters
1

Вы можете сделать это с помощью представлений из коробки функциональности. В каждой настройке контекстного фильтра вы можете увидеть флажок «Указать критерии проверки», чтобы увидеть больше настроек.

Затем вы можете выбрать «валидатор» на основе ваших условий просмотра. Если вы хотите выполнить пользовательскую проверку, выберите код php. Верните True или False в php-код в зависимости от ваших условий проверки.

Наконец, выберите «Действие, которое нужно предпринять», так как доступ к дисплею запрещен! Смотрите скриншот ниже для nid контекстного фильтра.

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

Анил Сагар
источник
Какой код php я добавляю?
Найджел Уотерс
Я использую только глобальный: нулевой контекстный фильтр
Найджел Уотерс
3
НИКОГДА НЕ ИСПОЛЬЗУЙТЕ КОД PHP В ПРОСМОТРАХ ИЛИ ЛЮБОМ ИНСТРУМЕНТЕ UI !!!
hugronaphor