1

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

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

但是工作……当然……

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

谢谢,感谢每一个建议。

4

3 回答 3

4

我建议查看视图模块。

http://drupal.org/project/views

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

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

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

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

于 2010-11-04T10:30:06.543 回答
1

在这里扩展 Asimov 的答案是一个代码示例(对于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');
}
于 2014-06-26T12:31:42.367 回答
0

drupal 论坛上的以下页面包含对 drupal 表单过程的非常清晰的解释以及在您的特定情况下应该做什么。请参阅用户 Jaypan 的回答。

http://drupal.org/node/1770512

总结一下他的回答:

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

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

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

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

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

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

希望这可以帮助。

于 2013-04-05T07:46:46.333 回答