Когда я использовал открытый фильтр, выбор фильтра передается как пара имя / значение в URL, например:
members?field_a=valuea&field_b=valueb
Как я могу настроить его на использование большего количества ссылок в стиле "pathauto":
members/valuea/valueb
Ответы:
Мой коллега недавно создал модуль под названием « Путь к данным» . Он намеревался решить эту проблему. К сожалению, оказалось, что он конфликтует с псевдонимами обычного пути, поэтому он будет работать на таком сайте, как drupal.org, который не использует псевдонимы, но будет нарушать ссылки на псевдонимы пути, используя сайт.
В настоящее время я считаю, что единственным общим способом решения этой проблемы является либо манипулирование URL-адресами на уровне httpd, либо использование hook_url_inbound_alter и hook_url_outbound_alter . Вы можете прочитать немного больше о упомянутых хуках в этом вопросе .
Однако, если бы я сам попробовал еще один снимок, я бы попытался вместо этого использовать конкретное решение для Views, поскольку эта проблема достаточно распространена, и для этого может быть оправдано наличие модуля.
В hook_views_pre_build можно взять данные из URL- адреса , такого как "members / valuea / valueb", вставить эти значения в $ _GET ['q'], позволить представлениям построить свой запрос, увидев аргументы get "в URL", а затем, возможно, удалить их. снова в hook_views_post_build .
источник
Недавно я выпустил модуль Query Parameters To URL , который решает проблему, которую вы описываете:
Вы можете настроить, для каких путей их аргументы запроса должны быть переписаны как чистые компоненты URL, используя простое регулярное выражение или реализуя перехват модуля.
Таким образом, вы можете преобразовать URL-адрес отображаемого фильтра, например
http://example-site.com/events?field_category_id[0]=100&field_category_id 1 = 101 & field_author_name [0] = John & field_author_surname [0] = Doe
в http://example-site.com/events/p/field_category_id/0__100--1__101/field_author_name/0__John/field_author_surname/0__Doe
Под ним используются hook_url_inbound_alter, hook_url_outbound_alter и hook_init с перенаправлениями, где это необходимо.
источник
Открытые фильтры - это формы, что означает, что место, куда они перенаправляются (атрибут «действие»), должно быть известно, прежде чем пользователь выберет любую опцию. Поэтому мы не можем перенаправить его на любой симпатичный URL, который содержит информацию о его выборе. Обходные пути:
JavaScript. Используйте JavaScript, чтобы на лету изменить атрибут «action» открытой формы фильтра на основе выбранных пользователем параметров, и задать для «action» URL-адрес соответствующего вида с настроенными соответствующими контекстными фильтрами. Но я сомневаюсь, что это будет "SEO дружественным" тогда (пожалуйста, кто-то поправит меня, если я ошибаюсь).
Сделайте двойной редирект. Используя hook_form_alter, после получения формы перенаправьте пользователя на URL правильного просмотра с настроенными контекстными фильтрами, основанными на его входных данных. Это может потребовать подтверждения пользователя в некоторых браузерах, так что это может быть очень раздражающим.
В обоих описанных выше методах вам нужно будет использовать https://drupal.org/project/views_expost, чтобы изменить метод этих форм на POST, чтобы переменные не загрязняли URL-адрес пользователя.
Суть в том, что если вам нужны красивые URL с открытыми фильтрами - вы, вероятно, делаете что-то не так. Потому что я думаю, что они просто для фильтрации данных, и не должны использоваться для определения новых страниц на сайте. Если вам это нужно - вы можете создать представление, настроенное как меню, и URL-адреса в этом меню перенаправят пользователя к тому же представлению, которым он является сейчас, но с другими контекстными фильтрами.
источник
С программной точки зрения вы всегда можете использовать ловушки hook_url_inbound_alter () и hook_url_outbound_alter () для этого.
Вы можете попробовать запросить параметры к модулю URL или, если вы используете Search API и Facets , вы можете использовать Facet API Pretty Paths .
Вы также можете преобразовать свое представление, чтобы использовать аргументы в вашем пути и использовать модуль Redirect .
Помимо вышесказанного, простого способа добиться этого не существует, поскольку в Drupal 8 все еще есть ожидающая функция; см. Разрешить строки запроса в псевдонимах URL .
Когда вы используете панели, которые используют представления и, например, лучше экспонированные фильтры, вы можете сделать несколько таких хаков, как (пример URL: / panel_url? Category = 123):
Для получения дополнительной информации см. Раздел Передача аргумента из URL-адреса на панели в панель просмотра или блок .
Наконец, вы можете использовать hook_menu () для определения ваших собственных обратных вызовов меню и программной загрузки вашего представления.
источник
Вы можете использовать следующий код.
источник