hook_update_N

Хочешь помочь с переводом? Это очень просто и быстро. Лишь зарегистрируйся, и можешь тут же начать переводить.

developer/hooks/install.php, строка 256

Версии
5
hook_update_N()
6
hook_update_N(&$sandbox = NULL)

Производит обновление таблиц БД, необходимое для единичного обновления модуля.

Для каждого обновления модуля, требующего изменений в схеме базы, создайте отдельный хук hook_update_N(), который будет вызываться из update.php. Обновления схемы БД нумеруются последовательно, в соответствии с той версией Друпала, с которой совместим данный модуль.

Обновления схемы БД должны соответствовать Schema API: http://drupal.org/node/150215

Число N в названии хука hook_update_N() состоит из 3 частей:

  • 1 цифра — основной номер версии ядра Друпала, с которым совместим модуль;
  • 1 цифра для основной версии модуля (т.е., '1' для версий модуля 5.x-1.* и '2' для версий 5.x-2.*);
  • 2 оставшиеся цифры увеличиваются на 1 для каждого последующего обновления, начиная с 00.
Вторая цифра должна быть равна нулю для обновлений, необходимых при переносе модуля на новую основную версию Друпала.

Примеры:

mymodule_update_5200()
Это первое обновление, необходимое для работы модуля mymodule версии 5.x-2.*.
mymodule_update_6000()
Это обновление, необходимое для обновления всех версий модуля mymodule до Drupal 6.
mymodule_update_6100()
Это первое обновление, необходимое для работы модуля mymodule версии 6.x-1.*.
mymodule_update_6200()
Это первое обновление, необходимое для работы модуля mymodule версии 6.x-2.*. Пользователи могут обновить модуль сразу с версии 5.x-2.* до версии 6.x-2.*, в этом случае будут применены все обновления БД с номерами 60XX и 62XX, но не будут задействованы обновления 61XX, потому что они специфичны только для ветки 6.x-1.x.
Есть смысл удалять из модуля хуки обновлений для очень старых версий Друпала (более чем на две основные версии отличающихся от последней стабильной версии). Друпалу можно сообщить об этих удалениях с помощью хука hook_update_last_removed().

Никогда не перенумеровывайте хуки обновления!

Детальнее о релизах и нумерации версий в Друпале можно прочесть:

Реализации этого хука должны быть в файле mymodule.install, находящемся в одной директории с файлом модуля mymodule.module. Друпал реализует свои собственные обновления как хуки модуля system. Эти обновления находятся в файле database/updates.inc.

Параметры

&$sandbox Ассоциативный массив, передаваемый между вызовами многопроходного обновления. Функция обновления может использовать его для того, чтобы хранить состояние текущего обновления.

Возвращаемое значение

Массив результатов выполнения функций update_sql(). Функция обновления может прервать текущую цепочку обновлений, если в возвращаемый массив $ret добавит элемент следующего вида:

$ret['#abort'] = array('success' => FALSE, 'query' => 'Описание ошибки');
В этом случае версия схемы не будет обновлена, текущий и все последующие обновления все так же будут отображаться на странице update.php как ожидающие применения. Многопроходные обновления также должны вернуть элемент $ret['#finished'] для того чтобы сообщить API обработки пакетных заданий о своем прогрессе.

Связанные темы

Код

<?php
function hook_update_N(&$sandbox = NULL) {
  // For most updates, the following is sufficient.
  $ret = array();
  db_add_field($ret, 'mytable1', 'newcol', array('type' => 'int', 'not null' => TRUE));
  return $ret;
  
  // However, for more complex operations that may take a long time, 
  // you may hook into Batch API as in the following example.
  $ret = array();
  
  // Update 3 users at a time to have an exclamation point after their names.
  // (They're really happy that we can do batch API in this hook!)
  if (!isset($sandbox['progress'])) {
    $sandbox['progress'] = 0;
    $sandbox['current_uid'] = 0;
    // We'll -1 to disregard the uid 0...
    $sandbox['max'] = db_result(db_query('SELECT COUNT(DISTINCT uid) FROM {users}')) - 1;
  }
  
  $users = db_query_range("SELECT uid, name FROM {users} WHERE uid > %d ORDER BY uid ASC", $sandbox['current_uid'], 0, 3);
  while ($user = db_fetch_object($users)) {
    $user->name .= '!';
    $ret[] = update_sql("UPDATE {users} SET name = '$user->name' WHERE uid = $user->uid");
    
    $sandbox['progress']++;
    $sandbox['current_uid'] = $user->uid;
  }

  $ret['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
  
  return $ret;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вход в систему