Drupal 7 在ajax回调函数中填充表选择的#选项#头

Drupal 7 在ajax回调函数中填充表选择的#选项#头,drupal-7,drupal-modules,Drupal 7,Drupal Modules,我试图做的是通过ajax在按下按钮时显示一个带有复选框的表。该表最初应该隐藏,并通过函数调用动态填充。 如果最初我用一些伪值加载$options1,那么在ajax调用之后,它会抛出一个错误,说- 注意:未定义的索引:theme_tableselect()中的红色(第3285行) D:\wamp\www\drupal7\includes\form.inc) 其中“red”是虚拟行值的索引,而#选项不会填充新值。怎样才能让它工作 这是表格的代码- $form['mltag_new']['tag']

我试图做的是通过ajax在按下按钮时显示一个带有复选框的表。该表最初应该隐藏,并通过函数调用动态填充。 如果最初我用一些伪值加载$options1,那么在ajax调用之后,它会抛出一个错误,说-

注意:未定义的索引:theme_tableselect()中的红色(第3285行) D:\wamp\www\drupal7\includes\form.inc)

其中“red”是虚拟行值的索引,而#选项不会填充新值。怎样才能让它工作

这是表格的代码-

$form['mltag_new']['tag'] = array(
        '#type' => 'button',
        '#value' => t("Suggest Tags"),
        '#ajax' => array(
            'callback' => 'mltag_suggest_tags_ajax',
            'wrapper' => 'mltag_suggest_tags_table_div',
            'effect' => 'slide',
            ),
    );




 $options1 = array();                      //initial dummy values
    $options1['red']['tag'] = "A red row";
    $options1['red']['chi'] = "A red row";


 $form['mltag_new']['myselector'] = array (
        '#type' => 'tableselect',
        '#title' => 'My Selector',
        '#header' => $header,
        '#options' => $options1,
        '#prefix' => '<div id="mltag_suggest_tags_table_div">',
        '#suffix' => '</div>',        
    );

    return $form;
$form['mltag\u new']['tag']=array(
“#键入”=>“按钮”,
“#值”=>t(“建议标记”),
“#ajax”=>数组(
'callback'=>'mltag\u suggest\u tags\u ajax',
'wrapper'=>'mltag\u suggest\u tags\u table\u div',
“效果”=>“幻灯片”,
),
);
$options1=array()//初始虚拟值
$options1['red']['tag']=“一行红色”;
$options1['red']['chi']=“红色行”;
$form['mltag_new']['myselector']=array(
“#type”=>“tableselect”,
“#title”=>“我的选择器”,
“#header”=>$header,
“#选项”=>$options1,
“#前缀”=>”,
“#后缀”=>”,
);
返回$表格;
Ajax回调看起来像这样-

function mltag_suggest_tags_ajax($form, $form_state) {
          //$content has some content
          //pass the content to a function 
          include_once 'includes/content_tag.inc';
          $tags = mltag_content_tag($content, variable_get('algo_type'), 20);

          if (empty($tags)) {
            $output .= t('Content is insufficient to generate Tags using this algorithm. <br>Please choose other algorithm from Settings Page.');
            $form['mltag_new']['sample_text']['#markup'] = $output;
            return $form['mltag_new']['sample_text'];
          }
          else {
            $algo = variable_get('algo_type');
            if ($algo == 1) {
              $header = array(
                  'tag' => t('Tag'),
                  'frequency' => t('Frequency'), 
                  );

              $options = array();      
              foreach ($tags as $key => $value) {
                $options[$key] = array(
                    'tag' => $key,
                    'frequency' => $value,
                    );
              }    
            }

            elseif ($algo == 2) {
              $header = array(
                  'tag' => t('Tag'),
                  'chi' => t('Chi Square Value'), 
                  );

              $options = array();

              foreach ($tags as $key => $value) {
                $options[$key] = array(
                    'tag' => $key,
                    'chi' => $value,
                ); 
              } 

            }

          $form['mltag_new']['myselector']['#header'] = $header; 
          $form['mltag_new']['myselector']['#options'] = $options;
          return $form['mltag_new']['myselector'];
          }
}
function mltag\u suggest\u tags\u ajax($form,$form\u state){
//$content有一些内容
//将内容传递给函数
include_once“includes/content_tag.inc”;
$tags=mltag_content_tag($content,variable_get('algo_type'),20);
if(空($tags)){
$output.=t('内容不足以使用此算法生成标记。
请从“设置”页面选择其他算法'); $form['mltag_new']['sample_text']['markup']=$output; 返回$form['mltag_new']['sample_text']; } 否则{ $algo=variable_get('algo_type'); 如果($algo==1){ $header=数组( 'tag'=>t('tag'), “频率”=>t(“频率”), ); $options=array(); foreach($标记为$key=>$value){ $options[$key]=数组( 'tag'=>$key, “频率”=>$value, ); } } elseif($algo==2){ $header=数组( 'tag'=>t('tag'), ‘chi’=>t(‘卡方值’), ); $options=array(); foreach($标记为$key=>$value){ $options[$key]=数组( 'tag'=>$key, “chi”=>美元价值, ); } } $form['mltag_new']['myselector']['#header']=$header; $form['mltag_new']['myselector']['#options']=$options; 返回$form['mltag_new']['myselector']; } }
我回复了你在Drupal.org上关于我如何处理类似问题的帖子。尝试添加

$form['mltag_new']['myselector'] =
    form_process_tableselect($form['mltag_new']['myselector']);

就在你回来之前。希望这对你的帮助比对我的帮助更大。请注意,当块从ajax重新加载时,#选项只会被渲染,但原始的$form对象似乎没有意识到。

我知道这是几年后的事,但我在搜索自己的解决方案时发现了这一点:

tableselect模块在$form中创建必须删除的复选框。在上面的示例中,它们将是
$form['mltag_new']['myselector']
,键等于原始代码中的原始
$option1
。如果您取消设置这些设置,请拨打电话

 $form['mltag_new']['myselector'] = form_process_tableselect($form['mltag_new']['myselector']);

在返回之前,它将消除虚拟行

我应该补充一点,我不知道这是否与你所犯的错误有关。我有一些类似的代码,没有出现错误,但也没有更新表。所以,这就是我建议这段代码可能为您解决的问题。我解决了我的问题,似乎在回调函数中进行这些更新不是正确的方法,尽管它可能仍然适用于您。对我来说,有效的方法是将构建选项列表的逻辑放在process函数中,每次ajax回调重新加载该块时都会调用该函数。然后ajax函数所做的只是重新加载该元素。嘿,非常感谢!这似乎成功了。。我仍然收到红色索引错误,但我删除了我传递的初始虚拟$options1,它与您的答案一起工作。知道如何更改表的列宽吗?它们对我来说太宽了。现在我从回调函数返回两个表。你说的正确方法是什么?你可以发布一个使用回调函数的简短片段吗?我的$form_state['values']['mltag_new']['myselector']现在在表单提交时也返回一个空数组。也就是说,$form_state不会返回所选行。知道为什么会这样吗?