需要Drupal多个自定义字段,如果字段为空则通过验证
Drupal multiple custom field required, pass validation if field is empty
我构建了一个包含多个值的自定义字段。我必须将此字段设置为必填字段。但是如果至少有一个字段被填充而最后一个为空,我想通过验证。
但我的问题是 Drupal 警告我最后一个(空)字段是必需的。我认为 hook_field_is_empty()
解决了问题,但是,即使 return 为真,也无法验证表单。
非常感谢您的帮助。
实施:
function MYMODULE_field_widget_form(...) {
$element['address']+=[
...
'#required' => $instance['required'],
];
...
}
function MYMODULE_field_is_empty($item, $field) {
if (empty($item['address']) && empty($item['other'])) {
return true ;
}
return false ;
}
为了解决这个问题,我将我的字段设置为不需要(在节点字段的定义中)。然后,我使用 hook_form_alter()
在 #validate
中添加了一个回调。在该回调中,我测试是否至少定义了一个字段,如果定义了 none,则调用 form_set_error()
。
这是有道理的,因为不是字段本身可以知道节点的所有数据。但是,有点不对劲,因为无法根据需要标记此字段(例如星号)。
<?php
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($formid == ...) { // a specific case
array_unshift($form['#validate'], '_MYMODULE_validate_form') ;
}
}
function _MYMODULE_validate_form(&$form, &$form_state) {
if (empty($form_state['values']['field_geo'][LANGUAGE_NONE][0]['address'])) {
form_set_error('field_geo', t('You have to define at least one address.')) ;
}
}
?>
我构建了一个包含多个值的自定义字段。我必须将此字段设置为必填字段。但是如果至少有一个字段被填充而最后一个为空,我想通过验证。
但我的问题是 Drupal 警告我最后一个(空)字段是必需的。我认为 hook_field_is_empty()
解决了问题,但是,即使 return 为真,也无法验证表单。
非常感谢您的帮助。
实施:
function MYMODULE_field_widget_form(...) {
$element['address']+=[
...
'#required' => $instance['required'],
];
...
}
function MYMODULE_field_is_empty($item, $field) {
if (empty($item['address']) && empty($item['other'])) {
return true ;
}
return false ;
}
为了解决这个问题,我将我的字段设置为不需要(在节点字段的定义中)。然后,我使用 hook_form_alter()
在 #validate
中添加了一个回调。在该回调中,我测试是否至少定义了一个字段,如果定义了 none,则调用 form_set_error()
。
这是有道理的,因为不是字段本身可以知道节点的所有数据。但是,有点不对劲,因为无法根据需要标记此字段(例如星号)。
<?php
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($formid == ...) { // a specific case
array_unshift($form['#validate'], '_MYMODULE_validate_form') ;
}
}
function _MYMODULE_validate_form(&$form, &$form_state) {
if (empty($form_state['values']['field_geo'][LANGUAGE_NONE][0]['address'])) {
form_set_error('field_geo', t('You have to define at least one address.')) ;
}
}
?>