【问题标题】:Drupal: how to show a form (select) acting as filter options, then show a table of stuff from the database?Drupal:如何显示充当过滤器选项的表单(选择),然后显示数据库中的内容表?
【发布时间】:2010-11-04 03:31:33
【问题描述】:

我想要一个简单的过滤器表单,以及它下面的表格。当用户更改选择表单上的选项时,表格会自动更改。我想这已经完成了啊。

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

但是工作..当然..

我目前正在使用一个功能显示该页面。这完全是一团糟,就像“永远不要这样做”,但我正在研究和尝试一些东西,因为我是一个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 上显示新值,但表格不会再次呈现,因此不会改变。

谢谢,感谢每一个建议。

【问题讨论】:

    标签: php drupal drupal-6 drupal-fapi


    【解决方案1】:

    我建议查看视图模块。

    http://drupal.org/project/views

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

    1. 添加您希望在表格中显示的所有字段。 (马卡广场)
    2. 然后添加您希望限制查询的任何过滤器。 (Listar veiculos da filial)
    3. 添加过滤器时,您“公开”它,以便在查看查询时,您可以更改页面上的选项。
    4. 那么如果你想查看你刚刚制作的东西,你需要添加一个显示器。如果做成页面显示,可以直接设置table的路径。

    我可以推荐http://gotdrupal.com/videos/drupal-views-tutorial了解更多信息。

    如果你想要更整洁的暴​​露字段,我也推荐http://drupal.org/project/better_exposed_filters

    【讨论】:

    • 忘了说,但我正在开发我们自己的模块,所以我不想使用另一个模块并将链接放在不同的地方。我想把它和其他模块的功能、我自己的访问权限和其他东西放在一起。
    【解决方案2】:

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

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

    需要四个元素:

    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】:

      drupal 论坛上的以下页面非常清楚地说明了 drupal 表单流程以及在您的特定情况下应该做什么。查看用户 Jaypan 的回答。

      http://drupal.org/node/1770512

      总结一下他的回答:

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

        $form['submit_filter'] = 数组( '#type' => '提交', '#value' => '应用过滤器', '#submit' => 数组('apply_filter') );

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

        函数 apply_filter($form, &$form_state) { // 保存过滤器 $form_state['filter'] = $form_state['values']['filter']; $form_state['重建'] = TRUE; }

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

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-28
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 1970-01-01
        相关资源
        最近更新 更多