drupal7动态生成cck field select option

使用drupal开发,有时我们需要对添加cck filed的select的option进行动态设置,而不是直接在配置里面直接配置。这里提供一个方案。 比如我需要对tag这个taxonomy添加一个cck field name:test field type:list(text) widget:select list 动态生成options。 在自定义的module里面使用 hook_form_alter

function my_form_alter(&form,$form_state,$form_id){
    if($form_id == 'taxonomy_form_term'){
        $options = array(            
            'tt' => 'tt',            
            'hh' => 'hh'
        );        
        $form['field_test']['und']['#options'] = $options;
    }
}

这里要注意的一点是,如果你要动态生成option的话,那么配置里面的Allowed values list设置项必须为空。不然的话,添加term的时候提交表单失败,并且提示:

test: illegal value.

这是因为drupal后台对option进行了验证,防止前端的option值被非法修改,处理函数在

modules\field\modules\list\list.module

文件里面,如下:

/**
 * Implements hook_field_validate().
 *
 * Possible error codes:
 * - 'list_illegal_value': The value is not part of the list of allowed values.
 */
 function list_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {  
  $allowed_values = list_allowed_values($field, $instance, $entity_type, $entity);
  foreach ($items as $delta => $item) {
    if (!empty($item['value'])) {
      if (!empty($allowed_values) && !isset($allowed_values[$item['value']])) {        
        $errors[$field['field_name']][$langcode][$delta][] = array(          
          'error' => 'list_illegal_value',          
          'message' => t('%name: illegal value.', array('%name' => $instance['label'])),
        );
      }
    }
  }
}

所以,动态设置options的时候Allowed values list必须留空。