Я попытался ответить, как я это делаю, в другом вопросе. Я тоже выложу это здесь
Я думаю, что здесь хорошая стратегия - использовать API профиля установки. С помощью API профиля установки вы можете делать большинство вещей, которые делают инструменты администратора Drupal. Большинство основных форм просто устанавливают переменные в таблице переменных. Чтобы иметь возможность разумно изменять версию содержимого базы данных, не являющегося содержимым, то есть конфигурации, целесообразно использовать функции обновления.
На моем сайте есть модуль "ec", который мало что делает, кроме того, что файл ec.install содержит функции обновления, например. ec_update_6001 ()
Ваша основная функция установки может позаботиться о фактическом запуске обновлений при любых новых установках, которые вы делаете, чтобы обновить свои модули.
function ec_install() {
$ret = array();
$num = 0;
while (1) {
$version = 6000 + $num;
$funcname = 'ec_update_' . $version;
if (function_exists($funcname)) {
$ret[] = $funcname();
$num++;
} else {
break;
}
}
return $ret;
}
Теперь следуют несколько примеров функции обновления из нашего фактического файла.
// Create editor role and set permissions for comment module
function ec_update_6000() {
install_include(array('user'));
$editor_rid = install_add_role('editor');
install_add_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
install_add_permissions(DRUPAL_AUTHENTICATED_RID, array('access comments', 'post comments', 'post comments without approval'));
install_add_permissions($editor_rid, array('administer comments', 'administer nodes'));
return array();
}
// Enable the pirc theme.
function ec_update_6001() {
install_include(array('system'));
// TODO: line below is not working due to a bug in Install Profile API. See http://drupal.org/node/316789.
install_enable_theme('pirc');
return array();
}
// Add the content types for article and mtblog
function ec_update_6002() {
install_include(array('node'));
$props = array(
'description' => 'Historical Movable Type blog entries',
);
install_create_content_type('mtblog', 'MT Blog entry', $props);
$props = array(
'description' => 'Article',
);
install_create_content_type('article', 'Article', $props);
return array();
}
По сути, это в основном решает проблему управления версиями баз данных и кода Drupal. Мы широко его используем. Это позволяет нам продвигать новый код, который изменяет конфигурацию базы данных, без необходимости повторно импортировать базу данных или вносить оперативные изменения. Это также означает, что мы можем правильно тестировать выпуски, не опасаясь скрытых изменений в базе данных.
Наконец, cck и views поддерживают этот подход. См. Этот фрагмент кода
// Enable CCK modules, add CCK types for Articles in prep for first stage of migration,
// enable body for article, enable migration modules.
function ec_update_6023() {
$ret = array();
drupal_install_modules(array('content', 'content_copy', 'text', 'number', 'optionwidgets'));
install_include(array('content', 'content_copy'));
install_content_copy_import_from_file(drupal_get_path('module', 'ec') . '/' . 'article.type', 'article');
$sql = "UPDATE {node_type} SET body_label='Body', has_body=1
WHERE type = 'article'";
$ret[] = update_sql($sql);
return $ret;
}
person
Stewart Robinson
schedule
06.01.2009