为drupal表单使用主题覆写函数
By g089h515r806 on 17 9月 2008
导言很多人都知道如何覆写一个标准的theme_函数,但是对于表单主题的覆写,可能就不大清楚了,在Drupal 5.x(及更高版本)中由FormAPI生成的表单,可用相似的方式来定制其主题.本文将一步步给出表单主题化的流程.
样例表单和数据经常会有人问,如何在一个表格(table)内部嵌入复选框。我们这里就讲讲这个。首先我们要为表格准备点数据,这些数据将会和复选框一起放到表格中。所以,我们先这样:
<?php
$r = db_rewrite_sql(db_query("SELECT nid, title, created FROM {node} LIMIT 20"));
while ($row = db_fetch_object($r)) {
$rows[] = $row;
}
?>
注意,我们这里使用了一个SQL LIMIT,这样就不会取出全部数据了,如果将来讨论分页的话,就会去掉这个关键字。还有,很明显,在drupal中,这也不是获取节点的最好方式。这里仅仅是个例子,用来说明问题的。
现在,使用这些数据,加上复选框,我们就可以创建一个表格了,我们将把复选框放在最左边,这和Drupal内核中的批量操作非常类似。
首先要做的是生成$form数组,以供
drupal_get_form来调用。
请看下面这段代码:
<?php
$r = db_rewrite_sql(db_query('SELECT nid, title, created FROM {node} LIMIT 20'));
while ($row = db_fetch_object($r)) {
$rows[] = $row;
}
foreach ($rows as $v) {
$nids[$v->nid] = '';
$form['title'][$v->nid] = array('#type' => 'markup', '#value' => check_plain($v->title));
$form['created'][$v->nid] = array('#type' => 'markup', '#value' => date("d/m/Y H:i", $v->created));
}
$form['nids'] = array('#type' => 'checkboxes', '#options' => $nids);
?>
这看起来可能有点特别。大多数表单都是静态的,开发者将会使用一列长长的$form声明。而在这里,我们看到的表单却是动态的。在循环的内部,我们创建了两个
markup类型的$form['title'][$v->nid] 和$form['created'][$v->nid]数组。它用来在表单内部展示这些字段。$nids[$v->nid]是一个数组,将传递给表单元素
checkboxes的
options。
最后每个表格都需要一个头部(header)。由于没有其它更好的方式,所以我们需要把头部数组作为表单的一部分传递过来。所以,我们将添加一个表格头部数组,这里还使用markup类型,最后我们将调用drupal_get_form()来得到表单本身。
<?php
$r = db_rewrite_sql(db_query('SELECT nid, title, created FROM {node} LIMIT 20'));
while ($row = db_fetch_object($r)) {
$rows[] = $row;
}
foreach ($rows as $v) {
$nids[$v->nid] = '';
$form['title'][$v->nid] = array('#type' => 'markup', '#value' => check_plain($v->title));
$form['created'][$v->nid] = array('#type' => 'markup', '#value' => date("d/m/Y H:i", $v->created));
}
$form['nids'] = array('#type' => 'checkboxes', '#options' => $nids);
$form['submit'] = array('#type' => 'submit', '#value' => 'Update');
$form['header'] = array(
'#type' => 'value',
'#value' => array(
array('data' => 'nid'),
array('data' => t('Title')),
array('data' => t('Created')),
)
);
return drupal_get_form('my_test_form', $form); // 4.7
?>
现在,如果我们啥都不再做的话,打开浏览器,你也会看到结果,不过样子丑了点(在测试站点上进行试验)。所以,现在我们要做的就是把这个表单放在一个表格中,我们这里使用了一个主题覆写函数。
这个函数的名字,源于上面传递给drupal_get_form()的$form_id参数。所在,在这里,函数名就是theme_my_test_form($form)。下面就是这个函数:
<?php
function theme_my_test_form($form) {
foreach (element_children($form['title']) as $key) {
$row = array();
$row['data'][0] = form_render($form['nids'][$key]);
$row['data'][1] = form_render($form['title'][$key]);
$row['data'][2] = form_render($form['created'][$key]);
$rows[] = $row;
}
$output = form_render(theme('table', $form['header']['#value'], $rows));
$output.= form_render($form); // Process any other fields and display them
return $output;
}
?>
Drupal 5用户应该使用
drupal_render()来代替这里的
form_render()。
那么,这个函数都干了些什么呢。首先, 将$form数组传递给了这个主题函数。这个数组中包含了各种东西,submit(提交), form_token,甚至表格头部也在这里。为了提取里面的数据记录,我们在这里使用element_children()函数得到一个子数组(我选择 了$form['title']),然后对其循环处理。
你可以看到,每行有3个<td> </td>,最左边的为复选框,后两个为markup字段。现在,运行这段代码,你就会看到每条数据库记录都会显示在一个表格行中,而复选框位于最左边。
我将在以后的教程中,进一步讲解相关技术,比如表格的排序,以及对大的数据集进行分页。
感谢
a79v对本文的帮助。
来自
http://www.thinkindrupal.com/drupal-theme-guide-5/using-theme-override-functions-for-forms