Drupal:如何显示一个表单(select)作为过滤器选项,然后显示数据库中的东西表?

时间:2010-11-04 03:31:33

标签: php drupal drupal-6 drupal-fapi

我想要一个简单的过滤器表单,下面有一个表格。当用户更改选择表单上的选项时,表会自动更改。我认为那是用ahah完成的。

我想要这个(有些东西可以改变,比如包含表格的字段集,以及其他东西):

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

但是工作..当然..

我目前正在使用一个功能显示该页面。这是一个完全混乱的东西,像“永远不要这样”,但我正在研究和尝试一些东西,因为我是一个drupal学习者。  这是相关的代码:

    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只会替换表单本身,当我更改select上的选项时,它会在select上显示新值,但表格不会再次渲染,因此不会改变。

谢谢,赞成每一个建议。

3 个答案:

答案 0 :(得分:4)

我建议查看视图模块。

http://drupal.org/project/views

安装完成后,您可以创建自定义查询。

  1. 添加您希望在表格中显示的所有字段。 (Placa,Marca)
  2. 然后添加您要限制查询的所有过滤器。 (Listar veiculos da filial)
  3. 添加过滤器时,您“公开”它,以便在查看查询时,您可以更改页面上的选项。
  4. 然后,如果您想要查看刚刚制作的内容,则需要添加一个显示。如果将其设为页面显示,则可以直接将路径设置为表格。
  5. 有关详细信息,我建议您http://gotdrupal.com/videos/drupal-views-tutorial

    如果你想要更新的暴露字段,我可能还会推荐http://drupal.org/project/better_exposed_filters

答案 1 :(得分:1)

扩展Asimov的答案是一个代码示例(对于 Drupal 7 ),它显示了用于选择节点的分类术语过滤器。选定的术语存储在会话中,并在查询中用于过滤结果。

您可以将其放入自定义模块中。它不需要视图或任何其他贡献的模块。 在下面的示例代码中,自定义模块的名称为 tic 。将 tic 重命名为自定义模块的名称。

需要四个要素:

  1. 输出过滤器并获取并输出结果的功能
  2. 过滤表格
  3. 自定义提交功能,用于在会话中存储所选的过滤器选项
  4. 清除会话的重置功能
  5. 使用hook_menu()调用tic_fetch_results()。

    获取,过滤,输出结果

    此示例使用dynamic query,因为它很容易随条件扩展。

    /**
     * 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');
    }
    

答案 2 :(得分:0)

drupal论坛上的以下页面包含对drupal表单过程的明确解释以及在特定情况下该怎么做。请参阅用户Jaypan的答案。

http://drupal.org/node/1770512

总结他的答案:

  1. 在表单上创建一个提交按钮以提交所选的过滤器。这个按钮有自己的提交功能:

    $ form ['submit_filter'] = array(     '#type'=&gt; '提交',     '#value'=&gt; '应用过滤器',     '#submit'=&gt;阵列( 'apply_filter')   );

  2. 创建用于应用过滤器的提交功能。在此函数中存储过滤器的值,以便在页面刷新时为下一个表单构建保存它。同时将$ form_state ['rebuild']设置为TRUE。

    function apply_filter($ form,&amp; $ form_state) {   //保存过滤器   $ form_state ['filter'] = $ form_state ['values'] ['filter'];   $ form_state ['rebuild'] = TRUE; }

  3. 现在,您可以在下次构建表单时访问过滤器值。只需检查是否存在值:

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

    希望这有帮助。