Я думаю, что хорошей стратегией здесь является использование 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;
}