Изменение URL открытого фильтра

15

Когда я использовал открытый фильтр, выбор фильтра передается как пара имя / значение в URL, например:

members?field_a=valuea&field_b=valueb

Как я могу настроить его на использование большего количества ссылок в стиле "pathauto":

members/valuea/valueb
Уве
источник
Отличный вопрос. AFAIK, на данный момент это невозможно, кроме как с кодом. Нашел это, которое, кажется, решает проблему, но еще не проверял это.
Countzero
У вас проблемы с чистым URL, прочитайте это сообщение drupal.org/getting-started/clean-urls
subhojit777
1
У меня включен чистый URL-адрес, для других страниц он находится в SEO-дружественной нотации, но для открытого фильтра это только строка запроса, например, когда я перехожу к любой статье, URL-адрес является SEO-дружественным. Пожалуйста, дайте мне знать, если я что-то упустил.
Калпеш Патель
Я могу видеть, что в этом может быть какой-то смысл, но перед тем, как приступить к делу, я бы действительно нашел доказательства. Что важнее: «SEO-дружественный URL» или контент, который соответствует обычным поискам? Если страница результатов имеет сильный заголовок, я подозреваю, что она будет гораздо более ценной, чем ее URL. В любом случае, я бы в первую очередь сосредоточился на контенте.
Альфред Армстронг

Ответы:

9

Мой коллега недавно создал модуль под названием « Путь к данным» . Он намеревался решить эту проблему. К сожалению, оказалось, что он конфликтует с псевдонимами обычного пути, поэтому он будет работать на таком сайте, как 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 .

Letharion
источник
Благодарю. Это не выглядит тривиальным. Я главным образом хочу это для целей SEO, потому что пауки поисковой машины не ползают мимо формы. Я мог бы просто использовать второе представление с контекстными фильтрами и встроить свой открытый блок фильтров. Тогда мне просто нужно немного javascript, чтобы выставить фильтр в исходное представление.
Uwe
хм, если бы я сделал это, я мог бы использовать javascript для изменения URL-адреса формы GET со страницы? name1 = value1 & name2 = value2 на page / value1 / value2 stackoverflow.com/questions/5815995/… . Если javascript отключен, у меня есть исходный вид как запасной вариант.
Uwe
@letharion: не вижу никакой поддержки Drupal 7.
React Developer
4

Недавно я выпустил модуль Query Parameters To URL , который решает проблему, которую вы описываете:

Этот модуль предоставляет возможность перезаписывать параметры запроса URL в компоненты Clean 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 с перенаправлениями, где это необходимо.

Плэчинтэ
источник
Как насчет Drupal 8?
InspiredCoder
1

Открытые фильтры - это формы, что означает, что место, куда они перенаправляются (атрибут «действие»), должно быть известно, прежде чем пользователь выберет любую опцию. Поэтому мы не можем перенаправить его на любой симпатичный URL, который содержит информацию о его выборе. Обходные пути:

  1. JavaScript. Используйте JavaScript, чтобы на лету изменить атрибут «action» открытой формы фильтра на основе выбранных пользователем параметров, и задать для «action» URL-адрес соответствующего вида с настроенными соответствующими контекстными фильтрами. Но я сомневаюсь, что это будет "SEO дружественным" тогда (пожалуйста, кто-то поправит меня, если я ошибаюсь).

  2. Сделайте двойной редирект. Используя hook_form_alter, после получения формы перенаправьте пользователя на URL правильного просмотра с настроенными контекстными фильтрами, основанными на его входных данных. Это может потребовать подтверждения пользователя в некоторых браузерах, так что это может быть очень раздражающим.

В обоих описанных выше методах вам нужно будет использовать https://drupal.org/project/views_expost, чтобы изменить метод этих форм на POST, чтобы переменные не загрязняли URL-адрес пользователя.

Суть в том, что если вам нужны красивые URL с открытыми фильтрами - вы, вероятно, делаете что-то не так. Потому что я думаю, что они просто для фильтрации данных, и не должны использоваться для определения новых страниц на сайте. Если вам это нужно - вы можете создать представление, настроенное как меню, и URL-адреса в этом меню перенаправят пользователя к тому же представлению, которым он является сейчас, но с другими контекстными фильтрами.

Лукаш Зарода
источник
1

С программной точки зрения вы всегда можете использовать ловушки 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):

/**
 * 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-адреса на панели в панель просмотра или блок .

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

kenorb
источник
-1

Вы можете использовать следующий код.

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;
}
Махапал Пурохит
источник
Представления не знают о новом URL с вашим решением!
Прабин Гири