我想要一个简单的过滤器表单,下面有一个表格。当用户更改选择表单上的选项时,表会自动更改。我认为那是用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上显示新值,但表格不会再次渲染,因此不会改变。
谢谢,赞成每一个建议。
答案 0 :(得分:4)
我建议查看视图模块。
http://drupal.org/project/views
安装完成后,您可以创建自定义查询。
有关详细信息,我建议您http://gotdrupal.com/videos/drupal-views-tutorial。
如果你想要更新的暴露字段,我可能还会推荐http://drupal.org/project/better_exposed_filters
答案 1 :(得分:1)
扩展Asimov的答案是一个代码示例(对于 Drupal 7 ),它显示了用于选择节点的分类术语过滤器。选定的术语存储在会话中,并在查询中用于过滤结果。
您可以将其放入自定义模块中。它不需要视图或任何其他贡献的模块。 在下面的示例代码中,自定义模块的名称为 tic 。将 tic 重命名为自定义模块的名称。
需要四个要素:
使用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
总结他的答案:
在表单上创建一个提交按钮以提交所选的过滤器。这个按钮有自己的提交功能:
$ form ['submit_filter'] = array( '#type'=&gt; '提交', '#value'=&gt; '应用过滤器', '#submit'=&gt;阵列( 'apply_filter') );
创建用于应用过滤器的提交功能。在此函数中存储过滤器的值,以便在页面刷新时为下一个表单构建保存它。同时将$ form_state ['rebuild']设置为TRUE。
function apply_filter($ form,&amp; $ form_state) { //保存过滤器 $ form_state ['filter'] = $ form_state ['values'] ['filter']; $ form_state ['rebuild'] = TRUE; }
现在,您可以在下次构建表单时访问过滤器值。只需检查是否存在值:
if (isset($form_state['filter']))
{
// do your filtering here
}
希望这有帮助。