Как использовать заголовок узла или псевдоним пути вместо идентификатора узла в контекстном фильтре ссылки на узел в представлениях?

7

У меня есть узел A со ссылкой на узел B.

В представлении я показываю все узлы A, на которые ссылается конкретный узел B (nid: 123, title: node-B-title).

Вместо использования nid в контекстном фильтре я хотел бы использовать заголовок узла. Например, вместо:

view-name/123

Я хотел бы использовать

view-name/node-B-title

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

Уве
источник

Ответы:

10

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

Когда вы создаете представление с одним или несколькими контекстными фильтрами, оно должно откуда-то получать значения этих фильтров. Это может быть сделано с помощью -

  1. Выбор значений фильтра контекста из URL
    • Как правило, для таких целей у вас будет представление страницы с URL-адресом формы foo/%/barили foo/bar/%для одного контекстного фильтра ИЛИ формы foo/%/bar/%или foo/bar/%/%для нескольких фильтров.
    • Если у вас есть несколько фильтров, значение URL, которое отображается первым, сопоставляется с первым фильтром, рядом со вторым фильтром и так далее.
  2. Представления позволяют указать, что делать, если значения фильтра недоступны в URL-адресе . Это обычно используется для блочных представлений .
    • Вы можете выбрать из различных действий, а затем настроить выбор тоже. Вы можете выбрать из различных действий, а затем настроить выбор тоже. asdfj kajsdf
  3. Другая вещь, которую позволяет просматривать представления, - это указывать, что делать со значениями фильтра, если они найдены в URL, как описано в # 1 выше. Типичные случаи использования: создание динамических заголовков на основе значений фильтра, проверка значений фильтра и т. Д.
    • При проверке значений фильтра вы также можете изменить значения! (Вот где наше решение лежит между прочим). Это очень похоже на то, как мы можем изменять значения $ form в обратных вызовах проверки формы drupal. введите описание изображения здесь

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

Эта ссылка оказалась мне очень полезной. Вот выдержка из этого:

$np = explode('/', drupal_get_normal_path($argument));
if (!empty($np[1])) {
  $handler->argument = $np[1];
  return TRUE;
} else {
  return FALSE;
}
Сумит Парик
источник
Это не сработало для меня, а скорее вызвало ошибку ajax в представлении при сохранении.
DrCord
1

Это не будет работать при всех обстоятельствах, но один из подходов к проблеме, о которой идет речь, состоит в том, чтобы использовать фактическое отображение узла узла B (или типа узла B) и установить его путь так, как вы хотите, с помощью модуля path или pathauto. Затем используйте блок views, чтобы добавить отношение контента и желаемое представление.

Используйте контекстный фильтр по NID и затем настройку Provide default value > Content ID from URL. Затем добавьте блок представлений на свою страницу или набор страниц.

Если ваш контекст позволяет вам использовать блок представлений на самом узле, а не на странице представлений, это значительно облегчит получение желаемого пути и отображений, которые вы хотите отобразить.

squarecandy
источник
1

Я отредактировал принятый ответ, но хотел добавить фактический код здесь:

Используйте опцию PHP validated под опциями валидации в контекстном фильтре.

$np = explode('/', drupal_get_normal_path($argument));
if (!empty($np[1])) {
  $handler->argument = $np[1];
  return TRUE;
} else {
  return FALSE;
}
Эрик Стейнборн
источник
1

Аргумент представления должен быть ссылкой на поле типа контента, затем выберите опцию «Предоставить аргумент по умолчанию» и отметьте опцию «Id Node» (что-то подобное).

1) Добавить аргумент «Ссылка на поле X» 2) Проверить идентификатор узла из URL (в добавлении аргумента по умолчанию) 3) В разделе проверки проверьте тип содержимого узла, а в разделе «Тип узла» выбрать «Идентификатор узла».

И сделано. :)

Eleo
источник
«идентификатор контента из URL» дает только nid. Если бы я использовал ссылку на термин, я мог бы использовать «критерии проверки» с «именем термина, преобразованным в идентификатор термина». Для ссылки на узел нет аналогичной опции для перевода заголовка в nid. Возможно, потому что названия не обязательно уникальны.
Uwe
Да, это правильно, но необходимо, чтобы аргумент был ссылкой на поле (nid), попробуйте это.
Элео
1) Добавить аргумент «Ссылка на поле X» 2) Проверить идентификатор узла по URL (в добавлении аргумента по умолчанию) 3) В разделе проверки проверьте тип содержимого узла, а в разделе «Тип узла» выбрать «Идентификатор узла»
Eleo
Фактический URL может иметь nid, а псевдоним пути может быть заголовком узла. Это работает, не так ли?
SGhosh
0

Старый вопрос, но нашел его через Google и решил, что поделюсь своим решением для всех, кто найдет его в будущем:

Теперь есть модуль с именем safeword, который в основном делает то, что предложил Сумит Парик: (автоматически) создает поле, дружественное к URL.

Gerto
источник
0

Я бы порекомендовал модуль расширенных псевдонимов пути (path_alias_xt) . Он решает эту проблему просто путем установки без настройки, по-видимому, это в основном волшебство. : D Не совсем, но отрывок со страницы модуля объясняет, как вы просто устанавливаете его, и это исправляет эту и другие проблемы, но не затрагивает, как модуль делает это за кулисами ... О, хорошо, мы всегда могли прочитайте код: D В нем конкретно не упоминается исправление путей просмотра, но я использовал его для этого, и он отлично работает.

Список проблем, которые он решает, со страницы модуля:

  • Вы когда-нибудь задумывались над тем, почему после определения псевдонима, например about-us для, скажем, узла / 123, ваши страницы все еще полны этих ужасных сгенерированных машиной вкладок и ссылок, таких как / node / 123 / edit, node / 123 / revisions и т. Д. .?
  • Аналогично для ссылок / taxonomy / term /% и / user /%: вы ожидали увидеть / сохнет / отследить, но получил / user / 5 / отследить?
  • Считаете ли вы, что адресная строка вашего браузера также показывает эти ужасные цифры вместо ваших псевдонимов?
DrCord
источник