web-dev-qa-db-fra.com

Ajouter un champ par programme à une entité personnalisée

Je définis une nouvelle entité en suivant les étapes liées ici: http://www.istos.it/en/blog/drupal-entities/drupal-entities-part-3-programming-hello-drupal-entity

Ma question est de savoir comment ajouter par programmation un champ à l'entité lorsque je le définis. J'ai lu quelques liens mais je n'arrive pas à le faire fonctionner.

Mon code:

function generador_examenes_entity_info() {
  $return['question_section'] = array(
    'label' => 'Apartado',
    'controller class' => 'SectionController',
    'base table' => 'question_section',
    'uri callback' => 'section_uri',
    'fieldable' => TRUE,
    'entity_keys' => array(
      'id' => 'sid',
    ),
    'static cache' => TRUE,
    'bundles' => array(
      'question_section'=> array(
        'label' => 'Question Section',
        'admin' => array(
          'path' => 'admin/structure/question-section/manage',
          'access arguments' => array('administer'),
        ),
      ),
    ),
    'view modes' => array(
      'full' => array(
        'label' => t('Full Content'),
        'custom settings' => FALSE,
      )
    ),
    'access callback' => 'section_access',
  );
  return $return;
}

Merci

5
xger86x

Vous devrez définir un champ et une instance de champ dans le fichier .install de votre module. La fonction peut être soit hook_enable () ou hook_install () . Le champ fournira le nom du champ et certains paramètres par défaut. L'instance de champ peut être considérée comme le lien entre le champ et l'entité sur laquelle vous souhaitez placer le champ.

Le format des paramètres diffère selon le type de champ (un champ de texte a une longueur maximale, un champ de référence d'entité peut définir le ou les faisceaux sélectionnables, etc.). Les paramètres disponibles sont souvent expliqués dans l'implémentation hook_field_info du module. Pour les champs principaux, ceux-ci peuvent être trouvés sur la page suivante: 7 fonctions implémentent hook_field_info () . Pour les champs non principaux, les paramètres sont également susceptibles d'être expliqués dans l'implémentation hook_field_info, par exemple entityreference_field_info () .

Le processus Drupal suit lors de l'enregistrement d'un champ est le suivant:

Le champ est d'abord enregistré dans l'API du champ, avec ses paramètres par défaut (les paramètres définis dans hook_field_info ()). Mais votre module peut les remplacer dans le tableau des paramètres de votre fonction field_create_field. Pour que le champ avec votre nom ait par défaut vos paramètres. D'autres valeurs telles que la cardinalité (combien de valeurs le champ peut contenir) et la traduisibilité peuvent également être définies. Voir les informations détaillées sur field_create_field () pour toutes les valeurs.

De là, le champ est attaché à l'entité et il est regroupé au moyen d'une instance de champ. Cette instance définit quel champ doit être attaché à quelle entité et à quel bundle. Ici, les paramètres peuvent être remplacés une fois de plus pour cette implémentation de champs spécifiques sur cette entité spécifique. Vous pouvez également sélectionner le widget ici; la façon dont le champ doit être sélectionné. Les modules définissent leurs widgets dans hook_field_widget_info () , les widgets disponibles pour les champs principaux peuvent être trouvés ici: 7 fonctions implémentent hook_field_widget_info () . Pour un champ de texte, vous utiliseriez le widget text_textfield, pour une image, vous pouvez utiliser image_image, pour un module non central, vous devrez rechercher vous-même les widgets disponibles dans l'implémentation hook_field_widget_info (). Pour une liste complète de toutes les propriétés que vous pouvez définir sur les instances de champ, voir field_create_instance () .

Exemple de champ d'image

function mymodule_enable() {
  // Check if our field is not already created.
  if (!field_info_field('my_image')) {
    $field = array(
      'field_name' => 'my_image',
      'type' => 'image',
      'locked' => TRUE, // Settings can not be changed
      'settings' => array(
        'no_ui' => TRUE, // Field is not visible in field UI and can only be instantiated programmatically.
      ),
    );
    field_create_field($field);

    // Create the instance on the bundle.
    $instance = array(
      'field_name' => 'my_image',
      'entity_type' => 'my_entity',
      'bundle' => 'my_entity_bundle', // If your entity does not have bundles, this is the same as the entity type.
      'label' => 'Featured image',
      'required' => TRUE, // Field must have a value.
      'widget' => array(
        'type' => 'image_image',
      ),
    );
    field_create_instance($instance);
  }
}

Exemple de référence d'entité

function mymodule_enable() {

  // Create an entityreference field.
  $field = array(
    'field_name' => 'my_entityreference',
    'type' => 'entityreference',
    'settings' => array(
      'target_type' => 'my_other_entitytype',
    ),
    'cardinality' => 1, // Field may only have one value.
    'translatable' => FALSE,
  );
  field_create_field($field);

  $instance = array(
    'field_name' => 'my_entityreference',
    'entity_type' => 'my_entitytype',
    'bundle' => 'my_entitytype_bundle',
    'label' => 'Reference to my_other_entitytype',
    'required' => TRUE,
    'widget' => array(
      'type' => 'options_select',
    ),
  );
  field_create_instance($instance);
}
16
Neograph734