2010-03-03 61 views
2

我有一个选择列表我已经在表单alter中创建,但是,当我选择一个选项并提交值时,只有第一个数字被存储在数据库中。我知道这与数组的格式有关,但似乎无法使其正确提交。Drupal选择列表只提交第一个字符

function addSR_form_service_request_node_form_alter(&$form, $form_state) { 
$form['field_sr_account'] = array('#weight' => '-50', 
            '#type' => 'select', 
            '#title' => 'Select which account', 
            '#options' => addSR_getMultiple()); 

//Custom submit handler  
$form['#submit'][] = 'addSR_submit_function'; 
} 

function addSR_submit_function{ 
    $form_state['values']['field_sr_account'] = array('0' => array('value' => $form['#field_sr_account'])); 

下面是返回关联数组的函数。它返回正确的选项,因为我可以在HTML源代码查看正确的值/选项页面加载时

//The values returned are not the problem, however, the format of the array could be.. 
    function addSR_getMultiple(){ 
      $return = array(); 
      $return['one'] = 'Choice1' 
      $return['two'] = 'Choice2' 

      return $return; 
     } 

更新:

Drupal 6: Only inserting first character of value to MySQL

我有一个类似的问题与同一个领域。然而,在那种情况下,我知道我想提交的价值,并且我可以在表单提交之前将值赋给字段中的alter形式。与这个问题的区别在于,我不知道该字段的价值,直到它被提交,所以我不能以alter形式“分配”它。我如何在提交处理程序中以相同的方式分配它。

+0

你的例子很混乱,因为在任何地方都没有选择列表 - 你可能想要编辑它以显示你的选择列表处理(应该不需要通过单独的'#field_cckField'条目来解决奇怪的'解决方法'或者我不明白它打算做什么)。 – 2010-03-03 11:57:38

+0

@Henrik欧宝 - 你说得对,我试图简化它,但我让它变得更加混乱。我重申了上述问题。 – tpow 2010-03-03 13:44:12

+0

@Henrik欧宝 - 有没有办法将此传递给某种会话变量?这个问题正在杀死我。使用直接的PHP,这很容易 - 我想这是一个像Drupal这样的真棒系统的缺点.. – tpow 2010-03-04 13:36:42

回答

1

编辑问题更新(和根本的问题的发现与协作的独立问题中)后:

当你在试图操纵CCK领域,相比那些具有相当特殊的处理机制“标准”的Drupal FAPI表格元素,您应该阅读一般的CCK表格处理,特别是hook_form_alter() and CCK fieldsCCK hooks。纵观这些文档(和左侧栏中链接的其他CCK文章),看起来应该有一个直接的解决方案来解决您的问题,但可能需要进行一些挖掘。

作为一个潜在的“速战速决”,你可以尝试维持目前的做法,并调整验证提交的值,有点像这样:

function addSR_form_service_request_node_form_alter(&$form, $form_state) { 
    $form['field_sr_account'] = array(
    '#weight' => '-50', 
    '#type' => 'select', 
    '#title' => 'Select which account', 
    '#options' => addSR_getMultiple() 
); 

    // Add custom validation handler  
    $form['#validate'][] = 'addSR_validate_function'; 
} 

function addSR_validate_function (&$form, &$form_state) { 
    // Assemble result array as expected by CCK submit handler 
    $result = array(); 
    $result[0] = array(); 
    $result[0]['value'] = $form_state['values']['field_sr_account']; 
    // Set this value in the form results 
    form_set_value($form['field_sr_account'], $result, $form_state); 
} 

注意:这是未经测试的代码,我没有这个想法是否可行,因为CCK也会在验证阶段做一些事情。干净的方式肯定会首先理解CCK表单处理工作流程,然后相应地处理它。

+0

@Henrik欧宝 - 感谢您的回复。 'one'和'two'实际上是来自SQL查询的结果。如果我知道它不是问题,我尽量不发布SQL,因为它通常会引发比解决方案更多的问题。就提交处理程序而言,我将它们全部删除,当HTML中显示的值为'10515'时,提交的值为'1'。我知道这是第一个数字,因为当我选择以另一个数字开头的另一个值时,它只提交该数字的第一个数字。 – tpow 2010-03-03 16:25:28

+0

@cinqoTimo - 这听起来很奇怪,而且迄今为止我还没有遇到过这样的行为。我现在试着通过在表单提交后立即检查'$ _POST'数组来确保正确的值被浏览器发布(即在提交处理程序被调用之前第一次重建表单时)。如果正如我所期望的那样,正确的值得到了发布,那么我会尝试用调试器逐步完成进一步的处理逻辑,希望找到其他逻辑截断该领域的地方。看起来像一个非常奇怪的错误:/ – 2010-03-03 17:25:20

+0

@cinqoTimo:'field_sr_account'是一个CCK字段?如果是这样,它是哪种类型,并且是否配置了多个值? – 2010-03-03 17:33:22