Creación de campos CCK de forma programada

Por: MaxMendez --

Como parte de mi trabajo diario me encontre con la necesidad de crear un campo CCK para un tipo de contenido durante la implementación de un hook_updateN(), estará tarea llevarla a cabo no es del todo sencilla, debido a la complejidad estructural que tiene la definición de un campo CCK, es por esto que me en el camino a logra mi objetivo encontre la siguiente manera de generar esta estructura de forma fácil.

Y que puede ser más sencillo que utilizar la interfaz gráfica del módulo CCK, utilizando la misma para definir la configuración del campo que se necesita es luego posible exportar la misma a código y aplicar la misma a la lógica que necesitemos.

 

Paso 1: Definir el campo o campos que requerimos desde la interfaz gráfica.

Paso 2: Mediante de Devel o código temporal hacer uso de la función var_export de PHP  y la función content_fields de la siguiente manera:

var_export(content_fields('field_name', 'content_type_name'));

El resultado de este código será similar al siguiente:

array(
    'field_name' => 'field_name',
    'type_name' => 'coupon',
    'display_settings' => 
    array (
      'label' => 
      array (
        'format' => 'above',
        'exclude' => 0,
      ),
      'teaser' => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      'full' => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      4 => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      2 => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      3 => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      'token' => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
    ),
    'widget_active' => '1',
    'type' => 'text',
    'required' => '1',
    'multiple' => '0',
    'db_storage' => '1',
    'module' => 'text',
    'active' => '1',
    'locked' => '0',
    'columns' => 
    array (
      'value' => 
      array (
        'type' => 'text',
        'size' => 'big',
        'not null' => false,
        'sortable' => true,
        'views' => true,
      ),
    ),
    'text_processing' => '0',
    'max_length' => '',
    'allowed_values' => 'N|No
  S|Si',
    'allowed_values_php' => '',
    'widget' => 
    array (
      'default_value' => 
      array (
        0 => 
        array (
          'value' => 'N',
        ),
      ),
      'default_value_php' => NULL,
      'label' => 'Field Label',
      'weight' => '31',
      'description' => '',
      'type' => 'optionwidgets_select',
      'module' => 'optionwidgets',
    ),
  )

Paso 3: Implementar el hook_update_N que requerimos y hacer uso de la función content_field_instance_create, un ejemplo de sería el siguiente:

function mi_modulo_update_6216() {
  $field_definition = array(
    'field_name' => 'field_name',
    'type_name' => 'coupon',
    'display_settings' => 
    array (
      'label' => 
      array (
        'format' => 'above',
        'exclude' => 0,
      ),
      'teaser' => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      'full' => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      4 => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      2 => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      3 => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      'token' => 
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
    ),
    'widget_active' => '1',
    'type' => 'text',
    'required' => '1',
    'multiple' => '0',
    'db_storage' => '1',
    'module' => 'text',
    'active' => '1',
    'locked' => '0',
    'columns' => 
    array (
      'value' => 
      array (
        'type' => 'text',
        'size' => 'big',
        'not null' => false,
        'sortable' => true,
        'views' => true,
      ),
    ),
    'text_processing' => '0',
    'max_length' => '',
    'allowed_values' => 'N|No
  S|Si',
    'allowed_values_php' => '',
    'widget' => 
    array (
      'default_value' => 
      array (
        0 => 
        array (
          'value' => 'N',
        ),
      ),
      'default_value_php' => NULL,
      'label' => 'Mi Campo',
      'weight' => '31',
      'description' => '',
      'type' => 'optionwidgets_select',
      'module' => 'optionwidgets',
    ),
  );
  module_load_include('inc', 'content', 'includes/content.crud');
  foreach (array('mi_tipo_de_contenido') as $type) {
    $field['type_name'] = $type;
    content_field_instance_create($field_definition);
  }
}

Finalmente de esta forma tenemos de forma programada la creación de campos para nuestros tipos de contenido y facilitar las instalaciones o pases a otros entornos.