Коли я використовував відкритий фільтр, вибір фільтра передається як пара імен / значень у URL-адресі, наприклад:
members?field_a=valuea&field_b=valueb
Як я можу налаштувати його на використання більше URL-адреси "патауто":
members/valuea/valueb
Коли я використовував відкритий фільтр, вибір фільтра передається як пара імен / значень у URL-адресі, наприклад:
members?field_a=valuea&field_b=valueb
Як я можу налаштувати його на використання більше URL-адреси "патауто":
members/valuea/valueb
Відповіді:
Мій колега створив модуль під назвою дані про шлях деякий час назад. Його наміром було вирішити цю саму проблему. На жаль , виявилося , що він конфліктує з регулярними псевдонімами шляху, тому він буде працювати на сайті як drupal.org , який не використовує псевдоніми, але буде розривати зв'язку на шляху-псевдонім з допомогою сайту.
Наразі, я вважаю, що єдиним загальним способом вирішити цю проблему є або маніпулювання URL-адресами на шарі httpd, або використання гачка_url_inbound_alter та kuka_url_outbound_alter . Ви можете прочитати трохи більше про згадані гачки в цьому питанні .
Однак, якби я хотів би зробити цю ще одну зйомку самостійно, я б спробував вирішити специфічне рішення натомість, оскільки ця проблема є достатньо поширеною, щоб можна було виправдати наявність модуля для цього.
У mock_views_pre_build можна взяти дані з URL-адреси на зразок "members / valuea / valueb", ввести ці значення в $ _GET ['q'], нехай перегляди створюють запит, бачачи аргументи get "в URL-адресі", а потім, можливо, видаляють їх знову в mook_views_post_build .
Існує модуль " Параметри запиту до URL" , який я нещодавно випустив, і вирішує проблему, яку ви описуєте:
Цей модуль надає можливість переписати параметри запиту URL-адреси в «Очистити компоненти URL-адреси» на вказаних шляхах.
Ви можете налаштувати, які шляхи повинні мати аргументи запитів, переписані як чисті компоненти URL-адреси, використовуючи простий регулярний вираз, або застосувавши гачок модуля.
Таким чином ви можете перетворити URL-адресу фільтру, що відкривається, як-от
http://example-site.com/events?field_category_id evidence0škar=100&field_category_id 1 = 101 & field_author_name [0] = Іван & field_author_surname [0] =
Під ним він використовує гачок_url_inbound_alter, гак_url_outbound_alter та прив'язку_init з перенаправленнями, де це необхідно.
Викриті фільтри - це форми, це означає, що місце, куди вони переспрямовуються (атрибут "дія"), повинно бути відомо, перш ніж користувач вибере будь-який варіант. Тож ми не можемо перенаправити його на будь-яку гарну URL-адресу, яка містить інформацію про його вибір. Обхідні шляхи:
JavaScript. Використовуйте JavaScript, щоб змінювати атрибут "action" на відкритій формі фільтру на основі параметрів, які вибрав користувач, і встановіть "action" на URL-адресу належного перегляду за допомогою налаштованих належних контекстних фільтрів. Але я сумніваюся, що це було б "SEO дружньо" тоді (будь-хто виправить мене, якщо я помиляюся).
Зробіть подвійне переспрямування. Користуючись гаком_form_alter, отримавши форму, перенаправляйте користувача на URL належного перегляду з налаштованими належними контекстними фільтрами на основі його даних. Насправді це може знадобитися підтвердження користувача в деяких браузерах, тому це може бути дуже прикро.
В обох вищезазначених методах вам потрібно буде використовувати https://drupal.org/project/views_expost, щоб змінити метод цих форм на POST, тому змінні не забруднюють URL-адресу користувачів.
Суть полягає в тому, що якщо вам потрібно мати гарні URL-адреси з відкритими фільтрами - ви, ймовірно, робите щось не так. Тому що я думаю, що вони призначені лише для фільтрації даних, і їх не слід використовувати для визначення нових сторінок на веб-сайті. Якщо вам це потрібно - ви можете створити представлення, налаштоване на меню, і URL-адреси в цьому меню перенаправлять користувача на той самий вигляд, який він є зараз, але з різними контекстними фільтрами.
З програмної точки зору, ви завжди можете використовувати для цього гачки kuk_url_inbound_alter () та гачки_url_outbound_alter () .
Ви можете спробувати Виправити параметри для модуля URL-адреси або якщо ви використовуєте API пошуку та грані , ви можете використовувати Додаткові шляхи API Facet API .
Ви також можете перетворити свій погляд, щоб використовувати аргументи на своєму шляху та використовувати модуль перенаправлення .
Крім вищезазначеного, не існує простого способу цього досягти, оскільки для Drupal 8 ще існує функція, що очікує на розгляд; див. Дозволити рядки запитів у псевдонімах URL .
Коли ви використовуєте панелі, які використовують представлення даних, і, наприклад, краще відкриті фільтри, ви можете зробити кілька таких хак, як-от (наприклад, URL-адреса: / panel_url? Kategorija = 123):
/**
* Implements hook_url_inbound_alter().
*/
function foo_url_outbound_alter(&$path, &$options, $original_path) {
if (arg(0) == 'panel_url') {
// Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
$path_info = parse_url($path);
switch (@$path_info['path']) {
case 'panel_url/term_name':
case 'panel_url/term_name2':
$path = 'panel_url/all'; // Convert loopy urls into base url
}
if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
$term_name = strtolower(taxonomy_term_load((int)$tid)->name);
$path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
}
}
}
Для отримання додаткової інформації див. Передачу аргументу з URL-адреси на панелі для перегляду області чи блокування .
Нарешті, ви можете скористатись пунктом_меню (), щоб визначити зворотні дзвінки в користувальницькому меню та завантажити програму перегляду програмно.
Ви можете використовувати наступний код.
function hook_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == "abcd") {
$form['#submit'] = array('custom_search_redirect');
}
}
function custom_search_redirect($form, &$form_state) {
$form_state['redirect'] = "members/valuea/valueb;
}