xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Как добавить новое поле в существующую таблицу БД

Опубликовано в

Урезанный, но рабочий пример из модуля FileField Paths, который добавляет в таблицу files новое поле origname:

/**
 * Implements hook_schema_alter().
 */
function filefield_paths_schema_alter(&$schema) {
  $schema['files']['fields']['origname'] = array(
    'description' => 'Original name of the file.',
    'type' => 'varchar',
    'length' => 255,
    'not null' => TRUE,
    'default' => '',
  );
}
 
/**
 * Implements hook_install().
 */
function filefield_paths_install() {
  db_add_field($ret = array(), 'files', 'origname', array(
    'description' => 'Original name of the file.',
    'type' => 'varchar',
    'length' => 255,
    'not null' => TRUE,
    'default' => '',
  ));
}
 
/**
 * Implements hook_uninstall().
 */
function filefield_paths_uninstall() {
  db_drop_field($ret = array(), 'files', 'origname');
}

Код находится в файле filefield_paths.install.

А вот более универсальный вариант для добавления нескольких полей:

/**
 * Implements hook_schema_alter()
 */
function mymodule_schema_alter(&$schema) {
  if (isset($schema['table_name'])) {
    $schema['table_name']['fields']['field_1'] = array(
      'type' => 'varchar',
      'length' => 100,
      'not null' => TRUE,
      'default' => '',
    );
    $schema['table_name']['fields']['field_2'] = array(
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'size' => 'tiny',
      'default' => 0,
    );
  }
}
 
/**
 * Implements hook_install()
 */
function mymodule_install() {
  $schema = array('table_name' => array());
  mymodule_schema_alter($schema);
  foreach ($schema['table_name']['fields'] as $field => $spec) {
    db_add_field($ret = array(), 'table_name', $field, $spec);
  }
}
 
/**
 * Implements hook_uninstall()
 */
function mymodule_uninstall() {
  $schema = array('table_name' => array());
  mymodule_schema_alter($schema);
  foreach ($schema['table_name']['fields'] as $field => $spec) {
    db_drop_field($ret = array(), 'table_name', $field);
  }
}
Написанное актуально для Drupal 6.x
Похожие записи

Комментарии RSS

для Drupal 7 очень было бы здорово, черкнуть, спасибо

У меня почему-то не работает. Хочу добавить поле service в таблицу comments. Создал свой модуль, как написано в одном из ваших уроков. Код такой:

<?php
/**
 * Implements hook_schema_alter().
 */
function mymodule_schema_alter(&$schema) {
  $schema['comments']['fields']['service'] = array(
    'type' => 'int',
    'not null' => TRUE,
    'default' => 0,
    'description' => 'Service to which the comment is related.'
  );
}
 
/**
 * Implements hook_install().
 */
function mymodule_install() {
  db_add_field($ret = array(), 'comments', 'service', array(
    'type' => 'int',
    'not null' => TRUE,
    'default' => 0,
    'description' => 'Service to which the comment is related.'
  ));
}
 
/**
 * Implements hook_uninstall().
 */
function mymodule_uninstall() {
  db_drop_field($ret = array(), 'comments', 'service');
}
?>

Не подскажете, в чем дело может быть?

Уже понял. Во-первых, нужно было всё это писать в файле mymodule.install, во-вторых, в конце не нужно ?>. Может, поможет кому)

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании