1

我正在使用 CCK 类型的 hook_form_alter(为您的 drupal-ers)。我的节点表单中有一个通常是选择列表的字段。但是,在这种情况下,我想隐藏选择列表,并使用 SQL 查询将其值填充到表单中。

一切都很顺利。我可以看到我想要的值出现在 HTML 源代码中,所以我知道我的查询正在正确执行。但是,当我提交表单时,它只插入值的第一个字符。我的一些测试是 566、784、1004 的值 - 列值分别是 5、7、1。

起初我以为它必须是 DB 列属性,但是当我删除了使字段隐藏并手动选择值的 form_alter 时,插入了正确的值?!?

   <?php
function addSR_form_service_request_node_form_alter(&$form, $form_state) {
       if (arg(0) == 'user' && is_numeric(arg(1))) {
        $account = arg(1);
        $club = 2589;
        $form['field_sr_account'] = array( '#type' => 'hidden',
        '#value' => $club
        );

           }
}


?>

谁能明白为什么只插入第一个字符?

注意:我尝试使用#value 和#default_value 删除并重新创建列,但它仍然只提交整数的第一个字符。另外,我通过删除提交处理程序来消除它作为可能的原因,这仍然导致只提交一个字符

更多更新 - 仍在搜索! 好的,一些很好的问题。请允许我回答他们:

  1. DB 列类型为整数(4)
  2. 钩子生成的 HTML 是:

    输入类型="hidden" name="field_sr_account" id="edit-field-sr-account" value="2589"

最新更新:我认为问题已缩小到数组的结构。当我在处理表单更改后对该字段执行 var_dump 时,这就是我得到的。

[43] => Array
        (
            [#type] => hidden
            [#default_value] => 2589
            [#post] => Array
                (
                )

            [#programmed] =>
            [#tree] =>
            [#parents] => Array
                (
                    [0] => field_sr_account
                )

            [#array_parents] => Array
                (
                    [0] => field_sr_account
                )

            [#weight] => 0.016
            [#processed] => 1
            [#description] =>
            [#attributes] => Array
                (
                )

            [#required] =>
            [#input] => 1
            [#process] => Array
                (
                    [0] => form_expand_ahah
                )

            [#name] => field_sr_account
            [#id] => edit-field-sr-account
            [#value] => 2589
            [#defaults_loaded] => 1
            [#sorted] => 1
        )

我可以将表单值设置为的字段结构是什么。它必须像 abhaga 所建议的那样......

4

4 回答 4

2

由于您尝试更改的字段最初使用的是选择小部件,因此 CCK 将寻找$form_state['values']['field_sr_account'][0]['value']. 通过将字段设置为#hidden 类型并设置#value,您将在$form_state['values']['field_sr_account']. CCK 将尝试访问该元素的第一个元素并以该值的第一个字符结束。

更新:实现你需要的最简单的方法是做一些事情:

function addSR_form_service_request_node_form_alter(&$form, $form_state) {
   if (arg(0) == 'user' && is_numeric(arg(1))) {
    $account = arg(1);
    $club = 2589;
    // Use this property to store the value to restore back
    $form['#field_sr_account'] = $club;
    $form['field_sr_account'] = array( '#type' => 'hidden','#value' => $club);
   }
}

/*in your submit handler, restore the value in the proper format*/
$form_state['values']['field_sr_account'] = array('0' => array('value' => $form['#field_sr_account']));

旧答案

完成您尝试做的事情的一种方法是将整个复制 $form['field_sr_account']$form['#field_sr_account'],然后通过 SQL 查询在提交处理程序本身中以正确的格式提供值。

于 2010-01-16T21:29:08.783 回答
0

好的,看看http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html#hiddenhttp://api.drupal.org/api/drupal/developer--topics- -forms_api_reference.html#value

还建议您使用 value 而不是 hidden。您可以在http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6上找到此信息

此外,不允许类型 hidden 具有您分配给它的属性,因此这可能会导致问题。您在使用表单 API 时可能遇到的任何使用问题都应该在这些资源中得到解答,因为我仍然不清楚您要完成什么……特别是使用提交按钮。

老答案:

好的,如果我理解正确的话 $club 设置不正确。如果您查询的第一个结果是您要查找的号码,那么这应该有效。

试着打电话

<?php print_r(db_fetch_array($result)) ?>

查看从查询返回的所有内容。

我有点不清楚什么设置不正确。如果它 #value在您的关联数组中,那么罪魁祸首必须是查询。如果#value设置正确,那么您以后用它做什么都可能是罪魁祸首(此处未显示)。如果它是您的值,$form_state我根本看不到您$club在这里使用。

此外,在您的情况下,addSR_submit_function 您似乎没有使用该$form 变量,或使用 $club 进行任何操作,只是设置了在调用时显示在页面顶部的消息。

我可能需要进一步澄清到底出了什么问题。

另外,当您调用 drupal_set_message函数时,您是否只是出于调试目的而这样做?

于 2010-01-09T23:35:09.670 回答
0

你不应该检查

drupal_set_message($form_state['values']['field_sr_account']);

代替

drupal_set_message($club);

在 addSR_submit_function 中?

好的,只是一个问题:不确定 db_result 为您的查询返回什么类型,可能与类型转换有关吗?所以这是为了确保 value 是 int。

'#value' => (int)$club
于 2010-01-10T07:52:43.243 回答
0

cinqoTimo,出于好奇,这是什么CCK领域?它是整数、小数还是浮点数?并且您在该字段上是否有任何默认情况下通常不打开的特殊参数?数据库中的列类型是什么?

你能发布表单的html输出吗?这可能会为可能发生的事情提供线索。

您是否使用任何 javascript 来编辑此字段的任何值?

您是否尝试过从 addSR_form_service_request_node_submit 钩子输出值结果?那里有什么不同。

抱歉有这些问题。只是大声思考,因为您似乎已经覆盖了大部分基础。

于 2010-01-13T04:30:39.300 回答