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


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. Затем добавьте блок представлений на свою страницу или набор страниц.

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


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) В разделе проверки проверьте тип содержимого узла, а в разделе «Тип узла» выбрать «Идентификатор узла».

И сделано. :)


«идентификатор контента из URL» дает только nid. Если бы я использовал ссылку на термин, я мог бы использовать «критерии проверки» с «именем термина, преобразованным в идентификатор термина». Для ссылки на узел нет аналогичной опции для перевода заголовка в nid. Возможно, потому что названия не обязательно уникальны.
— Uwe

Да, это правильно, но необходимо, чтобы аргумент был ссылкой на поле (nid), попробуйте это.
— Элео

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

Фактический URL может иметь nid, а псевдоним пути может быть заголовком узла. Это работает, не так ли?
— SGhosh

0

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

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


0

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

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

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