Drupal: повторный выбор терминов таксономии в расширенном поиске - PullRequest
2 голосов
/ 16 декабря 2009

Я уверен, что я не первый, кто пытается решить эту проблему, но Google не приносит мне никакой пользы.

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

search phrase category:32,33

Выбранные значения НЕ выбираются снова в поле выбора таксономии.

Вместо того, чтобы показывать их в текстовом поле ключевого слова, я бы хотел, чтобы они были выбраны в поле выбора таксономии - так, чтобы любой пользователь ожидал, что такая форма будет действовать. Я искал модуль, который добавит эту функциональность, но безрезультатно. Я попытался реализовать hook_form_alter(), чтобы установить #default_value для этого элемента формы на основе предыдущей отправки формы (доступно в $form_state arg), но а) это кажется глупым и б) кажется, что эта функция вызывается один раз для проверки формы и ее повторного отображения, а отправленное значение недоступно во второй раз (когда это необходимо).

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 17 декабря 2009

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

Создайте модуль и используйте hook_form_alter () для изменения формы. У меня уже был модуль, который я использовал для настройки расширенного поиска, поэтому я поместил его туда. Я не буду вдаваться в детали создания вашего собственного модуля - вы можете найти простое руководство для этого, и вам нужно только определить эту функцию.

/**
 * Implementation of hook_form_alter().
 * Remove 'category:x,y,z' from the keyword textbox and select them in the taxonomy terms list
 */
function modulename_form_alter(&$form, $form_state, $form_id) {
    // Advanced node search form
    if ($form_id == 'search_form' && $form['module']['#value'] == 'node' && user_access('use advanced search')) {
        // Remove category:x,y,z from the keyword box
        $searchPhrase = $form['basic']['inline']['keys']['#default_value'];
        if(!empty($searchPhrase) && strpos($searchPhrase, 'category:') !== false) {
            $searchWords = explode(' ', $form['basic']['inline']['keys']['#default_value']);
            foreach($searchWords as $index=>$word) {
                if(strpos($word, 'category:') === 0) {
                    // Use the value to set the default on the taxonomy search
                    $word = substr($word, strlen('category:'));
                    $form['advanced']['category']['#default_value'] = explode(',', $word);
                    // Remove it from the keyword textbox
                    unset($searchWords[$index]);
                }
            }

            // Re-set the default value for the text box without the category: part
            $form['basic']['inline']['keys']['#default_value'] = implode(' ', $searchWords);
        }
    }
}
1 голос
/ 02 марта 2010

Спасибо, что поделились этим. После нескольких инсталляций на друпале я тоже столкнулся с этой проблемой. Однако на этот раз мне пришлось использовать несколько расширений поиска, таких как search_config и search_files, чтобы удовлетворить требования клиентов. Кроме того, я использую better_select, который превращает списки выбора в списки флажков (проще выбирать несколько значений в длинных списках). Таким образом, флажки всегда возвращали какое-то значение (либо идентификатор, если выбран, либо 0 (ноль), если не выбран), и в итоге я получал что-то вроде «категория поисковой фразы: 0,0,0,0, ..., 0».

Ваше решение, приведенное выше, действительно удаляет строку "category: 0,0,0,0,0,0, ..., 0" из поля поиска по ключевым словам и правильно проверяет все термины таксономии. То же самое можно сделать для типов контента, вам просто нужно заменить «category:» на «type:» во всем сценарии.

Пол

...