我正在使用CCK类型的hook_form_alter(对于你的drupal-ers)。我有一个字段,通常是我的节点表单中的选择列表。但是,在这种情况下,我想隐藏选择列表,并使用SQL查询在表单中填充其值。
一切都很顺利。我可以看到我想要的值出现在HTML源代码中,所以我知道我的查询正在执行。但是,当我提交表单时,它只插入值的第一个字符。我的一些测试值是566,784,1004 - 柱值分别为5,7,1。
起初我认为它必须是数据库列属性,但当我删除了使字段隐藏并手动选择值的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&amp;删除并重新创建列。 #default_value,它仍然只提交整数的第一个字符。此外,我删除了提交处理程序作为可能的原因,删除它仍然只导致一个字符被提交
更多更新 - 仍在搜索! 好的,一些好问题。请允许我回答:
钩子产生的HTML是:
input type =“hidden”name =“field_sr_account”id =“edit-field-sr-account”value =“2589”
最新更新:我认为问题已缩小到数组的结构。当我在处理表单alter之后对这个字段执行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所暗示的那样......
答案 0 :(得分: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提供值 以正确的格式查询 提交处理程序本身。
答案 1 :(得分:0)
好的,请查看http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html#hidden与http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html#value
还建议您使用值而不是隐藏。您可以在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
I中的值 看不到你在这里使用$club
一点都不。此外,在
addSR_submit_function
中 你似乎没有使用$form
变量,或使用$ club做任何事情 除了设置消息 出现在页面顶部 当它被召唤时。我可能需要进一步澄清 至于到底出了什么问题。
另外,当你打电话的时候
drupal_set_message
功能,是吗? 这样做是为了调试 目的
答案 2 :(得分:0)
你不应该检查
drupal_set_message($form_state['values']['field_sr_account']);
而不是
drupal_set_message($club);
在addSR_submit_function?
好的,只是一个问题:不确定db_result为您的查询返回什么类型,可能是它与类型转换有关?所以这是为了确保值为int。
'#value' => (int)$club
答案 3 :(得分:0)
cinqoTimo,出于好奇,这是什么样的CCK领域?它是整数,十进制,浮点数吗?你是否在该字段上有任何特殊参数,默认情况下通常不会打开? db中的列类型是什么?
您可以发布表单的html输出吗?这可能会给出可能发生的事情的线索。
您是否使用任何javascript编辑此字段的任何值?
您是否尝试过从addSR_form_service_request_node_submit hook输出值结果?那里有任何不同。
对不起所有问题。只是大声思考,因为你似乎已经覆盖了大部分基地。