代码之家  ›  专栏  ›  技术社区  ›  hfingler Jim Puls

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

  •  1
  • hfingler Jim Puls  · 技术社区  · 15 年前

    我想要一个简单的筛选表单,以及它下面的一个表。当用户更改选择窗体上的选项时,表将自动更改。我想这是因为阿哈。

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

    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 回复  |  直到 12 年前
        1
  •  4
  •   Maleki    15 年前

    我建议查看视图模块。

    http://drupal.org/project/views

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

    1. 添加要在表中显示的所有字段。(马卡·普拉卡)
    2. 然后添加您希望限制查询的任何筛选器。(细脉列表)
    3. 当添加过滤器时,您要“公开”它,以便在查看查询时,可以更改页面上的选项。
    4. 然后,如果你想查看你刚做的,你需要添加一个显示。如果将其设置为页面显示,则可以直接设置表的路径。

    关于更多信息,我可以推荐 http://gotdrupal.com/videos/drupal-views-tutorial .

    如果你想要更整洁的裸露场地,我也可以推荐 http://drupal.org/project/better_exposed_filters

        2
  •  1
  •   batigolix maged adel    12 年前

    要扩展asimov的答案,这里有一个代码示例(用于 德鲁帕尔7 )它显示了用于选择节点的分类术语过滤器。所选术语存储在会话中,并在查询中用于筛选结果。

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

    需要四个要素:

    1. 输出滤波器并获取和输出结果的函数。
    2. 筛选窗体
    3. 在会话中存储所选筛选选项的自定义提交函数
    4. 一种清除会话的复位功能。

    使用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');
    }
    
        3
  •  0
  •   Dawied    13 年前

    Drupal论坛的下一页包含一个非常清楚的Drupal表单过程的解释,以及在特定情况下应该做什么。请参阅用户jaypan的答案。

    http://drupal.org/node/1770512

    总结他的回答:

    1. 在表单上创建提交按钮以提交所选筛选器。此按钮有自己的提交功能:

      $form['submit_filter']=数组( '类型'=>'提交', 'value'=>'应用筛选器', '提交'=>数组('应用筛选器') ;

    2. 创建用于应用筛选器的提交函数。在此函数中,存储筛选器的值,以便在页面刷新时将其保存到下一个窗体生成中。同时将$form_state['rebuild']设置为true。

      函数应用筛选器($form,&$form\u状态) { //保存过滤器 $form_state['filter']=$form_state['values']['filter']; $form_state['rebuild']=真; }

    现在,您可以在下次构建表单时访问筛选值。只需检查值是否存在,如:

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

    希望这有帮助。

    推荐文章