我在模块中创建了几个自定义元素,非常适合在单个表单字段中对多个控件进行分组。
但是,我现在需要添加一个包含下拉列表的内容。我们的想法是有一个国家/地区代码的下拉列表,以及电话号码的文本字段。
在提交表单之前,它正确显示并且看起来很好,这会导致错误“检测到非法选择。请联系站点管理员。”这似乎表明Drupal没有将选项识别为选择控件的一部分。
这是我的代码:
function my_module_element_info() {
$types = array(
'phone' => array(
'#input' => TRUE,
'#process' => array('my_module_phone_process'),
'#element_validate' => array('my_module_phone_validate'),
'#autocomplete_path' => FALSE,
'#theme_wrappers' => array('my_module_inline_form_element'),
),
);
return $types;
}
function my_module_phone_process($element, &$form_state, $complete_form) {
$element['#tree'] = TRUE;
$element['prefix'] = array(
'#type' => 'select',
'#value' => $element['#value']['prefix'] ,
'#options' => $element['#options'],
'#required' => $element['#required'],
);
$element['number'] = array(
'#type' => 'textfield',
'#size' => 20,
'#maxlength' => 40,
'#value' => $element['#value']['number'],
'#required' => $element['#required'],
);
if (isset($element['#attributes'])) {
$element['prefix']['#attributes'] = $element['#attributes'];
$element['number']['#attributes'] = $element['#attributes'];
}
$element['prefix']['#attributes']['class'][] = 'form-phone-prefix';
$element['number']['#attributes']['class'][] = 'form-phone-number';
if (isset($element['#ajax'])) {
$element['prefix']['#ajax'] = $element['#ajax'];
$element['number']['#ajax'] = $element['#ajax'];
}
return $element;
}
function my_module_phone_validate($element) {
if (!preg_match('/^[0-9 ]+$/', $element['#value']['number'])) {
form_error($element['number'], t('Phone number may contain only digits and spaces.'));
}
return $element;
}
非常感谢任何帮助实现这项工作。
感谢您的光临。
詹姆斯
答案 0 :(得分:0)
您可以将以下属性添加到导致此错误的元素。
'#validated' => TRUE,
答案 1 :(得分:0)
这个问题暂时搁置在后面,但我本周又回到了它。
我想我现在明白错误的原因了。如果元素具有“#options”属性,则其行为应与select控件类似,并且应提交其中一个选项。由于字段本身是其他控件的容器,因此没有直接输入,没有匹配“#options”中的条目的已发布值,因此Drupal将其标记为无效的表单提交。
经过大量的反复试验,我找到了一些非常简单的事情。 “#options”用于填充子控件,但是一旦填充了它,就不再需要父控件了。所以我在元素中添加了一个“#after_build”函数,用它来删除“#options”,它运行得很好。
function common_pricing_phone_after_build($element, &$form_state) {
unset($element['#options']);
return $element;
}