Изменить схему при создании нового поля


Я хочу создать модуль, который при установке и создании нового поля в типе контента должен изменять схему другого модуля.

Я пытаюсь использовать hook_storage_create_field, чтобы реагировать на создание нового поля, но оно не запущено.

function mymodule_field_storage_create_field($field) {
  exit(var_dump($schema));
  $schema = _field_sql_storage_schema($field);
}

Я неправильно использую крючок? или в моем модуле что-то неисправно?

Обновление

Что я пытаюсь сделать, так это создать новый модуль, который расширяет Модуль связи до работайте как парсер Facebook.

Поэтому, когда пользователи добавляют новую ссылку, предварительный просмотр покажет предварительный просмотр, подобный этому Синтаксический анализатор Redsun Функциональность уже создана и адаптирована в Drupal, но по-прежнему возникают проблемы с расширением схемы ссылок, чтобы иметь дополнительные поля для изображений и полей тела.

В поле ссылки добавлен новый виджет под названием "ссылка с анализатором", и он запустит наши дополнительные коды для сохранения и проверки ссылки.

Author: saadlulu, 2012-09-26

2 answers

Hook_field_storage_create_field и hook_field_create вызываются, когда пользователь создает новое поле, т.е. из "Управление полями", "Добавить новое поле". В моих тестах hook_field_create вызывался, как и ожидалось, но hook_field_storage_create_field не вызывался. Я не стал вдаваться в причины этого, потому что (а) вы могли бы использовать hook_field_create здесь так же, как и hook_field_storage_create, и (б) на самом деле это не тот подход, который вам следует использовать для реализации нужной вам функциональности. Если вы собирались изменить схему для поля ссылки, вы сделали бы это один раз, когда ваш модуль был установлен, в hook_install. Однако ваш вариант использования намного сложнее, чем стандартное поведение поля ссылки; вам было бы лучше создать свой собственный тип поля и выполнить все управление хранением полей в одном месте. Возможно, вам захочется посмотреть источник существующих полей, для которых требуется сложное хранилище данных, например поле даты.

 1
Author: greg_1_anderson, 2012-09-26 19:44:06

Чтобы изменить схему, вы можете использовать hook_schema_alter, если это новое поле, вам нужно создать такое поле в hook_install или hook_update_X (если оно уже установлено). Например,

/**
 * Adds new field to the existing user schema.
 *
 * Implements hook_schema_alter().
 */
function foo_user_schema_alter(&$schema) {
  // Add field to existing schema.
  $schema['users']['fields']['migrated'] = array(
    'type' => 'int',
    'not null' => TRUE,
    'default' => 0,
    'description' => 'Timestamp for when user was migrated.',
  );
}

/**
 * Implements hook_install().
 */
function foo_user_install() {
  $schema = drupal_get_schema('users');
  db_add_field('users', 'migrated', $schema['fields']['migrated']);
}

/**
 * Implements hook_uninstall().
 */
function foo_user_uninstall() {
  db_drop_field('users', 'migrated');
}

/**
 * Adds migrated field for user schema.
 */
function foo_user_update_7101() {
  foo_user_install();
}
 0
Author: kenorb, 2016-08-09 16:19:07