Dupliquer un champ CCK sur un type de contenu en programmation

Dupliquer un champ CCK sur un type de contenu en programmation

22 Mar 2010 |  Drupal

Aujourd’hui j’ai eu besoin de dupliquer un champ CCK existant, d’un type de contenu à un autre. Chose facile lorsque l’on passe par l’administration, quelques petits clics et hop le tour est joué, mais comment fait-on en programmation ?

Imaginez un type de contenu ‘Articles’ composé des champs traditionnels title et body et de mon champ extra ainsi qu’un deuxième type de contenu ‘Actualités’. Nous allons donc voir comment récupérer ce champ du premier contenu pour l’intégrer au deuxième.

Tout d’abord il nous faut récupérer le champ. Pour cela nous allons utiliser la fonction content_fields() de CCK en lui passant le nom du champ à récupérer et le contenu sur lequel le trouver.

$cck_field_copy = content_fields('field_articles_extra', 'articles');  

Note : le nom du champ cck se trouve dans l’onglet ‘Gérer les champs’ sur l’interface d’administration de votre type de contenu. C’est le nom machine que vous avez saisi lors de la création.

Voici ce que contient mon champ field_articles_extra :

array (
  'field_name' => 'field_articles_extra',
  'type_name' => 'articles',
  '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,
    ), 
  ),
  'widget_active' => '1',
  'type' => 'text',
  'required' => '0',
  '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' => '',
  'allowed_values_php' => '',
  'widget' => 
  array (
    'rows' => 5,
    'size' => '60',
    'default_value' => 
    array (
      0 => 
      array (
        'value' => '',
        '_error_element' => 'default_value_widget][field_articles_extra][0][value',
      ),
    ),
    'default_value_php' => NULL,
    'label' => 'Extra',
    'weight' => '31',
    'description' => '',
    'type' => 'text_textfield',
    'module' => 'text',
  ),
)

Maintenant que nous avons notre champ, nous allons l’adapter pour notre nouveau type de contenu en changent le nom du champ et le nom du type de contenu auquel il appartient :

// Modification de la variable pour le contenu weblinks
$cck_field_copy['field_name'] = 'field_actualites_extra';
$cck_field_copy['type_name'] = 'actualites';    

Notre champ est prêt, il suffit maintenant d’utiliser les fonctions du module CCK pour insérer ce champ à notre contenu Actualités.

// Chargement des dépendances CCK pour ajouter le champ.
module_load_include('inc', 'content', 'includes/content.crud');  
// Ajout du champ slug au contenu weblinks.  
content_field_instance_create($slug_cck_field);

L’ajout de ce nouveau champ ne doit être fait qu’une seule fois et avant de commencer à créer des contenus, pour cela le meilleur endroit est le fichier .install dans le hook_install()

/**
 * Implements hook_install().
 *
 * Ajout du champ CCK slug au contenu weblinks.
 */
function MyModule_install() {
  // Copie du champ CCK extra sur le contenu articles.
  $cck_field_copy = content_fields('field_articles_extra', 'articles');  

  // Modification de la variable pour le contenu Actualités
  $cck_field_copy['field_name'] = 'field_actualites_extra';
  $cck_field_copy['type_name'] = 'actualites';

  // Chargement des dépendances CCK pour ajouter le champ.
  module_load_include('inc', 'content', 'includes/content.crud');
  
  // Ajout du champ extra au contenu Actualités.  
  content_field_instance_create($cck_field_copy);
}

Nous venons d’installer notre champ, mais il faut aussi penser à créer la procédure de désinstallation.

/**
 * Implements hook_uninstall().
 *
 * Ajout du champ CCK slug au contenu weblinks.
 */
function MyModule_uninstall() {
  // Chargement des dépendances CCK pour supprimer le champ.
  module_load_include('inc', 'content', 'includes/content.crud');

  // Suppression du champ extra du contenu Actualités.
  content_field_instance_delete('$cck_field_copy', 'actualites');

}

Pour tester il ne vous reste plus qu’à installer votre module. Si celui-ci est déjà installé désactivez le et désinstallez le avant. Votre champ est maintenant sur votre contenu

Merci à Opi et Inade pour les différents liens qui m’ont donnés.

Julien Dubreuil

Vous avez une idée, un projet web à réaliser ?

Ensemble, mettons en oeuvre sa réussite. Je vous accompagne dans vos projets, depuis l'élaboration du cahier des charges jusqu'à la mise en production. Pour plus d'information n'hésitez pas à me contacter.

Contactez-moi