drupal创建拖动排序表格的方法

所属分类: CMS教程 / drupal 阅读数: 619
收藏 0 赞 0 分享

Drupal中,有许多用户界面采用了拖动排序的功能。在排序的界面上,拖动排序是一种比较友好的形式。
下面是一个例子。

1. 在hook_menu里定义一个menu

复制代码
代码如下:
//栏目下,节点排序界面,可以拖动行来排序 $items['admin/nodeorder_taxonomy/term/%taxonomy_term/nodeorder'] = array ( 'title' => '节点排序', 'page callback' => 'drupal_get_form', 'page arguments' => array('nodeorder_taxonomy_term_nodeorder_form',3), 'access callback' => '_nt_node_order_right', 'access arguments' => array(3), 'type' => MENU_LOCAL_TASK, );

2.在hook_theme里定义表单的theme方法

复制代码
代码如下:
function my_module_theme() {
return array( 'nodeorder_taxonomy_term_nodeorder_form' => array( 'render element' => 'form', ), );
}

3.定义表单。表单的定义与一般表单基本一样。这里用$form['nodes']存储了表格里需要的数据,用$form['nodes'][$count]表示一行。但是对于tabledrag来说,这不是必须的。

复制代码
代码如下:
function nodeorder_taxonomy_term_nodeorder_form(&$form,&$form_state,$term) {
$tid=$term->tid; $query=db_select('node_term_order','nto')->extend('PagerDefault')->limit(20);
$query->join('node','n','nto.nid = n.nid');
$query->fields('n',array('nid','title','created')) ->fields('nto',array('tid','node_order')) ->condition('nto.tid',$tid) ->condition('sticky_order',0,'<=') ->orderBy('sticky_order','desc') ->orderBy('nto.node_order', 'desc');
$result=$query->execute();
$form['term_name']=array("#markup" => $term->name);
$form['nodes']['#tree']=true;
$form['nodes']['#theme'] = 'theme_nodeorder_taxonomy_term_nodeorder_form';
$delta=20*5; $count=0;
$form['foreactions'] = array('#type' => 'actions');
$form['foreactions']['submit'] = array('#type' => 'submit', '#value' => t('Save changes'));
foreach ($result as $row) { $form['nodes'][$count]['title']=array('#markup' => "nid)."">".check_plain($row->title)."" );
$form['nodes'][$count]['created']=array('#markup' => date("Y-m-d H:i:s",$row->created));
$form['nodes'][$count]['nid']=array( '#type'=>'value', '#title_display' => 'invisible', '#value' => $row->nid, );
$form['nodes'][$count]['tid']=array( '#type'=>'value', '#title_display' => 'invisible', '#value' => $row->tid, );
$form['nodes'][$count]['node_order']=array( '#type' => 'value', '#title_display' => 'invisible', '#value' => $row->node_order, );
$form['nodes'][$count]['weight'] = array( '#type' => 'weight', '#delta' => $delta, '#title_display' => 'invisible', '#default_value' => $count, '#title' => t('Weight for @title', array('@title' => $row->title)), );
$count +=1; } $form['actions'] = array('#type' => 'actions');
$form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save changes'));
return $form;
}

4.theme上面定义的表单。这里的关键

① 对每一行中用于存放顺序的weight字段,指定class 

复制代码
代码如下:
$form['nodes'][$count]['weight']['#attributes']['class'] = array('text-format-order-weight');

② theme table时指定table的ID:

复制代码
代码如下:
$output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'text-format-order')));

③ 加上tabledrag需要的功能:

复制代码
代码如下:
drupal_add_tabledrag('text-format-order', 'order', 'sibling', 'text-format-order-weight');
function theme_nodeorder_taxonomy_term_nodeorder_form($variables) {
$form = $variables['form'];
$rows = array();
if (isset($_GET["page"]))
$page=intval($_GET["page"]);
else
$page=0;
foreach (element_children($form['nodes']) as $count) { $form['nodes'][$count]['weight']['#attributes']['class'] = array('text-format-order-weight');
$rows[] = array( 'data' => array( drupal_render($form['nodes'][$count]['title']), drupal_render($form['nodes'][$count]['created']), drupal_render($form['nodes'][$count]['weight']), ), 'class' => array('draggable'), );
}
$header = array(t('title'), t('created'), t('weight') );
$output = drupal_render($form['term_name']);
$output .= drupal_render($form['foreactions']);
$output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'text-format-order')));
$output .= drupal_render_children($form);
$output .= theme('pager', array('#theme' => 'pager', '#weight' => 5,));
drupal_add_tabledrag('text-format-order', 'order', 'sibling', 'text-format-order-weight');
return $output;
}

5. 最后一步,用hook_form_submit处理结果数据。

希望本文所述对大家的drupal二次开发有所帮助。

更多精彩内容其他人还在看

Drupal实现不同节点类型使用不同模板的方法

这篇文章主要为大家介绍了Drupal实现不同节点类型使用不同模板的方法,是针对Drupal主题机制的灵活应用,需要的朋友可以参考下
收藏 0 赞 0 分享

定制Drupal首页的方法

这篇文章主要为大家介绍了定制Drupal首页的方法,以实例形式讲述了几种常见的实现方法,非常实用,需要的朋友可以参考下
收藏 0 赞 0 分享

Drupal第三方模块汇总

这篇文章主要为大家介绍了Drupal第三方模块,较为详细的罗列了drupal常用的第三方模块及其对应的下载地址,对于drupal建站来说具有很好的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Drupal采用钩子系统删除用户实例详解

这篇文章主要为大家介绍了Drupal采用钩子系统删除用户的实现方法,对钩子系统的运行机制做了较为详细的叙述,具有很好的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal6上传中文文件名附件乱码问题解决方法

这篇文章主要为大家介绍了drupal6上传中文文件名附件乱码问题解决方法,是很多drupal用户都会遇见的问题,具有很好的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal函数node_get_types用法详解

这篇文章主要为大家介绍了drupal函数node_get_types用法,针对node_get_types函数中不同参数对应功能做了简单描述,对于drupal建站非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

DRUPAL6中定义hook_menu参数的方法

这篇文章主要为大家介绍了DRUPAL6中定义hook_menu参数的方法,较为详细的讲述了hook_menu的参数及其对应的用法,对于采用drupal建站来说非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Drupal中hook_theme函数用法

这篇文章主要为大家介绍了Drupal中hook_theme函数用法,可以实现对drupal主题的灵活定制,对于drupal建站来说非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal的url传值和表单传值分析

这篇文章主要为大家介绍了drupal的url传值和表单传值,以实例形式较为详细的分析了drupal的URL传值与表单传值的具体实现方法,是采用drupal建站中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Drupal7的cache缓存开发实例教程

这篇文章主要为大家介绍了Drupal7的cache缓存开发的方法,可以有效的缓解网站的访问压力,是进行drupal建站中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多