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()
.
Никогда не перенумеровывайте хуки обновления!
Детальнее о релизах и нумерации версий в Друпале можно прочесть:
- http://drupal.org/handbook/version-info
- http://drupal.org/node/93999 (Обзор ветвей CVS и тегов для модулей Друпала)
- http://drupal.org/handbook/cvs/releases
mymodule.install
, находящемся в одной директории с файлом модуля mymodule.module
. Друпал реализует свои собственные обновления как хуки модуля system
. Эти обновления находятся в файле database/updates.inc
.
Параметры
&$sandbox
Ассоциативный массив, передаваемый между вызовами многопроходного обновления. Функция обновления может использовать его для того, чтобы хранить состояние текущего обновления.
Возвращаемое значение
Массив результатов выполнения функций update_sql()
. Функция обновления может прервать текущую цепочку обновлений, если в возвращаемый массив $ret
добавит элемент следующего вида:
$ret['#abort'] = array('success' => FALSE, 'query' => 'Описание ошибки');
$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;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии