Drupal7模块可拖拽表格#weight元素渲染为空字符串求助
Drupal 7可拖拽表格权重值不显示的排查与解决
你说的这种情况我太熟悉了——表格能正常拖拽但权重值看不见,大概率是在表单构建或主题渲染环节漏了关键配置或步骤,我帮你梳理几个最容易踩的坑:
1. 先检查hook_theme()与主题函数的匹配
确保你的主题函数正确处理了表单里的weight元素:
- 首先
hook_theme()里的变量配置要包含表单对象,比如:function mymodule_theme() { return array( 'mymodule_draggable_table' => array( 'render element' => 'form', ), ); } - 在对应的主题函数
theme_mymodule_draggable_table($variables)里,遍历行的时候一定要显式渲染weight元素,不能直接跳过。比如:function theme_mymodule_draggable_table($variables) { $form = $variables['form']; $rows = array(); foreach (element_children($form['rows']) as $delta) { $row_data = array(); // 处理其他列,比如标题、操作按钮等 $row_data[] = drupal_render($form['rows'][$delta]['title']); // 关键步骤:渲染权重元素 $row_data[] = drupal_render($form['rows'][$delta]['weight']); $rows[] = array( 'data' => $row_data, 'class' => array('draggable'), // 拖拽功能必需的类 ); } // 构建表格并添加拖拽行为 $header = array(t('Title'), t('Weight')); $output = theme('table', array( 'header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'mymodule-draggable-table'), )); $output .= drupal_render_children($form); // 绑定拖拽逻辑 drupal_add_tabledrag('mymodule-draggable-table', 'order', 'sibling', 'row-weight'); return $output; }
2. 确认weight元素的配置完整
每个行的weight表单元素必须包含以下核心属性,少一个都可能导致渲染为空:
$form['rows'][$delta]['weight'] = array( '#type' => 'weight', '#title' => t('Weight for row @delta', array('@delta' => $delta)), '#title_display' => 'invisible', // 隐藏标题但保留语义完整性 '#default_value' => isset($row->weight) ? $row->weight : 0, // 必须设置默认值,哪怕是0 '#delta' => 10, // 权重的取值范围,比如-10到10 '#attributes' => array('class' => array('row-weight')), // 与tabledrag的handle参数对应 );
重点:#default_value不能为空或未设置;#attributes里的类要和tabledrag调用里的handle参数完全一致。
3. 排查是否有模板或自定义渲染干扰
- 如果你自定义了
form-element-weight.tpl.php模板,检查里面的代码是不是漏了输出元素内容,比如有没有写<?php print $element['#children']; ?>? - 有没有用
hook_form_alter修改过weight元素,不小心把#access设为FALSE或者清空了#children属性?
4. 用Devel模块快速验证
安装Devel模块后,在主题函数里加dpm($form['rows'][$delta]['weight']);,查看这个元素的所有属性:
- 确认
#type是weight,#default_value有实际值,#access是TRUE - 如果
#processed是FALSE,说明Drupal还没处理这个元素,可能是你在渲染前没让表单经过完整的处理流程
按这几步排查下来,基本就能解决权重值不显示的问题了。
内容的提问来源于stack exchange,提问作者David S.
相关产品推荐
相关产品推荐

