Ajouter une propriété à une entité sur Drupal 7

Soumis par GoZ le mer 09/04/2014 - 21:53

Ajouter une propriété à une entité sur Drupal 7

Je souhaitais pouvoir ajouter une propriété à une entité. Certainement fatigué au moment où j'ai pensé qu'il était indispensable de faire cela, j'ai bossé dessus une paire d'heures avant de me rendre compte, au moment où tout fonctionnait... que je n'en avais pas besoin finalement...

Histoire que ce ne soit pas perdu, je vais tout de même récapituler ce qu'il faut faire ici.

Je vais donc commencer par ce qu'il me manquait, il faut avant tout créer son nouveau champ dans la table de définition de l'entité (pour ma part, je l'avais ajouté en direct comme un sale, mais pour vous, on va la faire propre), et surtout dire à drupal que ce nouveau champ existe, et donc le rajouter au schéma de notre table d'entité.

Dans monmodule.install :



/**
 * Implements hook_schema_alter().
 */
function MONMODULE_schema_alter(&$schema) {
  // Add field to existing schema.
  // Hey Drupal, prend donc mon nouveau champ !
  $schema['entityform_type']['fields']['monmodule_type'] = array(
    'type' => 'varchar',
    'length' => 255,
    'not null' => TRUE,
    'default' => 0,
    'description' => 'Type pour MON MODULE.',
  );
}

/**
 * Implements hook_install().
 *
 */
function MONMODULE_install() {
  // On ajoute le nouveau champ à la base de données
  $schema = drupal_get_schema('entityform_type');
  db_add_field('entityform_type', 'monmodule_type', $schema['fields']['monmodule_type']);
}


/**
 * Implements hook_uninstall().
 */
function monmodule_uninstall() {
  // Bien sur, on prévoit de le supprimer a la desinstallation
  db_drop_field('entityform_type', 'monmodule_type');
}

Nouveau champ donc pour notre propriété de l'entité entityform_type dans sa table, et tout le monde est au courant.
Maintenant, il faut définir cette nouvelle propriété. Dans mon cas, il s'agit d'une liste. Je l'ai mise en dure mais on peut imaginer qu'elle est nourrie par une variable ou ce que vous voulez. Soyez imaginatifs ;).

Dans monmodule.module


/**
 * Implements hook_entity_property_info_alter().
 *
 *
 */
function MONMODULE_entity_property_info_alter(&$info) {
  $properties = &$info['entityform_type']['properties'];

  $properties['monmodule_type'] = array(
    'label' => t("Type MONMODULE"),
    'description' => t("Type MONMODULE tout ça tout ça."),
    'type' => 'list',
    'getter callback' => 'entity_property_monmodule_type_get_properties',
    'setter callback' => 'entity_property_verbatim_set',
    'sanitize' => 'check_plain',
    'schema field' => 'monmodule_type',
  );

}

/**
 * Implements hook_form_alter().
 */
function MONMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'entityform_type_form') {
    $form['erqs_type'] = array(
      '#type' => 'fieldset',
      '#title' => t('Configuration MONMODULE'),
      '#collapsible' => TRUE,
      '#group' => 'additional_settings',
      '#weight' => 10,
      'erqs_type' => array(
        '#type' => 'select',
        '#title' => t('Type MONMODULE'),
        '#description' => t('Selectionner le type MONMODULE'),
        '#default_value' => '',
        '#options' => entity_property_monmodule_type_get_properties(),
      )
    );
  }
}


function entity_property_monmodule_type_get_properties($item  = array()) {
  return array('first' => 'First', 'second' => 'Second');
}

On peut désormais choisir entre les propriétés First et Second lors de la création de notre entityform.