Drupal: как показать форму (выбрать), действующую как параметры фильтра, а затем показать таблицу вещей из базы данных? - PullRequest
1 голос
/ 04 ноября 2010

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

Я хочу это (некоторые вещи могут измениться, например, набор полей, содержащий таблицу, и другие вещи):

http://img149.imageshack.us/img149/6436/60171054.jpg

Но работает .. конечно ..

В настоящее время я показываю эту страницу, используя одну функцию. Это полный беспорядок и что-то вроде «НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО», но я исследую и пробую кое-что, потому что я ученик друпалов. Это соответствующий код:

    form = array();  
    ahah_helper_register($form, $form_state);  
    //query here, build $options for the select

$form['listar_veics'] = array(  
        '#type'   => 'fieldset',  
    '#prefix' => '<div id="listar-veics-wrapper">',   
    '#suffix' => '</div>',  
    '#tree'   => TRUE,
    );

if (!isset($form_state['values']['listar_veics']['filial']))
    $choice = 1;
else 
    $choice = $form_state['values']['listar_veics']['filial'];


$form['listar_veics']['filial'] = array(
    '#type' => 'select', 
    '#title' => "Listar veículos da filial", 
    '#options' => $filiais,
    '#default_value' => $choice,
    '#ahah' => array(
        'event'     => 'change',
        'path'      => ahah_helper_path(array('listar_veics')),
        'wrapper'   => 'listar-veics-wrapper',
        'method'    => 'replace',
        ),
);

//query for the rows i wanna show

//building $data array, the rows array

//building $header, as an array of strings

$table = theme_table($header, $data);

$page = drupal_render($form);
$page .= $table;
return $page;

Таким образом, в этом коде drupal будет заменять только саму форму. Когда я изменяю опцию для выбора, он показывает новое значение для выбора, но таблица не отображается снова, поэтому не меняется.

Спасибо, оцените каждое предложение.

Ответы [ 3 ]

4 голосов
/ 04 ноября 2010

Я рекомендую взглянуть на модуль представлений.

http://drupal.org/project/views

После установки вы можете создать пользовательский запрос.

  1. Добавить все полячто вы хотели бы отображаться на вашем столе.(Placa, Marca)
  2. Затем добавьте все фильтры, которыми вы хотели бы ограничить свой запрос.(Listar veiculos da filial)
  3. При добавлении фильтра вы «выставляете» его так, что при просмотре запроса вы можете изменить параметры на странице.
  4. Тогда, если вы хотите просмотретьчто вы только что сделали, нужно добавить отображение.Если вы сделаете это отображением страницы, вы можете задать путь непосредственно к таблице.

Для получения дополнительной информации я мог бы порекомендовать http://gotdrupal.com/videos/drupal-views-tutorial.

Если вы хотите более аккуратные открытые поля, я могутакже рекомендуем http://drupal.org/project/better_exposed_filters

1 голос
/ 26 июня 2014

Чтобы развернуть ответ Азимова, приведу пример кода (для Drupal 7 ), в котором показан фильтр терминов таксономии для выбора узлов.Выбранные термины сохраняются в сеансе и используются в запросе для фильтрации результатов.

Вы можете поместить его в пользовательский модуль.Это не требует Представления или любые другие добавленные модули.В приведенном ниже примере кода имя пользовательского модуля: tic .Переименуйте tic в имя вашего пользовательского модуля.

Требуются четыре элемента:

  1. Функция, которая выводит фильтр, извлекает и выводит результаты
  2. Форма фильтра
  3. Пользовательская функция отправки, которая сохраняет выбранные параметры фильтра в сеансе
  4. Функция сброса, которая очищает сеанс

Использовать hook_menu() для вызова tic_fetch_results ().

Выборка, фильтрация, вывод результатов

В этом примере используется динамический запрос , поскольку его легко расширить с помощью условий.

/**
 * Filters, fetches and outputs results
 */

function tic_fetch_results() {

  // Adds filter form to the build array.
  $form = drupal_get_form('tic_term_filter_form');

  $output = drupal_render($form);

  $node_types = array('article', 'page', 'blog_post');

  // Sets up dynamic query
  $query = db_select('node', 'n')
      ->extend('PagerDefault')
      ->limit(33)
      ->fields('n', array('nid', 'title'))
      ->condition('n.type', $node_types, 'IN')
      ->condition('n.status', 1);

  // Fetches selected values from session and applies them to the query.
  if (isset($_SESSION['form_values']['terms']) && count($_SESSION['form_values']['terms']) > 0) {
    $query->join('field_data_field_tags', 'tags', 'n.nid = tags.entity_id');
    $query->condition('tags.field_tags_tid', $_SESSION['form_values']['terms'], 'IN');
    $query->condition('tags.bundle', $node_types, 'IN');
  }
  $result = $query->execute();

  $items = array();
  foreach ($result as $row) {
    $items[] = array('data' => $row->nid . ' - ' . $row->title);
    // do something interesting with the results
  }
  $output .= theme('item_list', array('items' => $items, 'title' => '', 'type' => 'ul', 'attributes' => array()));
  $output .= theme('pager');
  return $output;
}

Построение формы

Список опций таксономических терминов заполняется из словаря тегов

/**
 * Implements hook_form().
 */
function tic_term_filter_form($form, &$form_state) {

  // Loads terms from the Tags vocabulary and use as select options.
  $vocab = taxonomy_vocabulary_machine_name_load('tags');
  $terms = taxonomy_get_tree($vocab->vid);
  $term_options = array();
  foreach ($terms as $term) {
    $term_options[$term->tid] = $term->name;
  }

  // Sets the values that are stored in session as default.
  $storage = (isset($_SESSION['form_values']) ? $_SESSION['form_values'] : 0);
  $selected_terms = isset($storage['tags']) ? $storage['tags'] : NULL;

  $form['terms'] = array(
    '#title' => 'Filter by terms',
    '#type' => 'select',
    '#options' => $term_options,
    '#multiple' => TRUE,
    '#default_value' => $selected_terms,
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Filter'),
  );

  $form['reset'] = array(
    '#type' => 'submit',
    '#value' => t('Reset'),
    '#weight' => 30,
    '#submit' => array('tic_tools_reset'),
  );

  return $form;
}

Сохранение выбранных значений в сеансе

/**
 * Implements hook_form_submit().
 */
function tic_term_filter_form_submit(&$form, &$form_state) {

  // Stores form values in session.
  $_SESSION['form_values'] = $form_state['values'];
}

Сбросить фильтр

/*
 * Clears set filters.
 */

function tic_tools_reset() {
  if (isset($_SESSION['form_values'])) {
    unset($_SESSION['form_values']);
  }
  drupal_goto(current_path());
  drupal_set_message('Filters were reset');
}
0 голосов
/ 05 апреля 2013

Следующая страница на форуме drupal содержит очень четкое объяснение процесса создания формы drupal и того, что делать в вашем конкретном случае.См. Ответ пользователя Jaypan.

http://drupal.org/node/1770512

Подводя итог его ответу:

  1. Создайте кнопку отправки в форме, чтобы отправитьвыбранный фильтр.Эта кнопка имеет собственную функцию отправки:

    $ form ['submit_filter'] = array ('#type' => 'submit', '#value' => 'Apply the filter', '#submit'=> array ('apply_filter'));

  2. Создать функцию отправки для применения вашего фильтра.В этой функции сохраните значение фильтра, чтобы сохранить его для следующего построения формы при обновлении страницы.Также установите для $ form_state ['rebuild'] значение TRUE.

    function apply_filter ($ form, & $ form_state) {// Сохраните фильтр $ form_state ['filter'] = $ form_state ['values'] ['фильтр'];$ form_state ['rebuild'] = TRUE;}

Теперь у вас будет доступ к значению фильтра при следующем построении формы.Просто проверьте наличие значения как:

if (isset($form_state['filter']))
{
   // do your filtering here
}

Надеюсь, это поможет.

...