欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

为drupal表单使用主题覆写函数

shiping1 的头像

为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]是一个数组,将传递给表单元素checkboxesoptions
 
最后每个表格都需要一个头部(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
普通分类: