Drupal → Добавить определённому типу сущности новое свойство

03.01.2018

Пример добавления терминам таксономии нового текстового свойства myproperty, которое будет хранится в таблице taxonomy_term_data:

modulename.install:

/**
 * Implements hook_schema_alter().
 */
function modulename_schema_alter(&$schema) {
  $entity_table = 'taxonomy_term_data';
  $property_name = 'myproperty';

  if (isset($schema[$entity_table]) && !isset($schema[$entity_table]['fields'][$property_name])) {
    $schema[$entity_table]['fields'][$property_name] = array(
      'type' => 'varchar',
      'length' => 255,
      'not null' => TRUE,
      'default' => '',
    );
  }
}

/**
 * Implements hook_enable().
 */
function modulename_enable() {
  $entity_table = 'taxonomy_term_data';
  $entity_schema = drupal_get_schema($entity_table, TRUE);
  $property_name = 'myproperty';

  if (isset($entity_schema['fields'][$property_name]) && !db_field_exists($entity_table, $property_name)) {
    db_add_field($entity_table, $property_name, $entity_schema['fields'][$property_name]);
  }
}

/**
 * Implements hook_uninstall().
 */
function modulename_uninstall() {
  $entity_table = 'taxonomy_term_data';
  $entity_schema = drupal_get_schema($entity_table, TRUE);
  $property_name = 'myproperty';

  if (isset($entity_schema['fields'][$property_name]) && db_field_exists($entity_table, $property_name)) {
    db_drop_field($entity_table, $property_name);
  }
}

modulename.info:

...
dependencies[] = taxonomy

После этого можно сохранять и получать значение нового свойства:

// Write
$term = taxonomy_term_load(123);
$term->myproperty = 'test';
taxonomy_term_save($term);

// Read
$term = taxonomy_term_load(123);
debug($term->myproperty);

Замечание 1: в .info файл надо добавить зависимость от модуля, создающего сущность, в данном случае taxonomy, чтобы хук modulename_enable() вызвался в самом конце.

Замечание 2: в hook_schema_alter нельзя вызывать entity_get_info(), поэтому надо хардкодить название таблицы.

Написанное актуально для
Drupal 7
Похожие записи

Добавить комментарий