Сразу скажу, что с апгрейдом Drupal я намучился и потратил на это не один час. Увы, система сделано очень крисов и требует массовых патчей для корректного обновления. Основные проблемы с обновлением SQL таблиц для используемых модулей.
Вот последовательность, которую я рекомендую. Она получена методом проб и ошибок.
- Для всех модулей, которые вы будете продолжать использовать, скачайте новые версии для Drupal 7.
- Отключите все модули, кроме Core. Удалите модули через админ панель, которые вы не будете использовать, чтобы почистились SQL таблицы (например, FCKeditor). После удаления модуля, удалите его папку.
- Создайте файл php.ini, положите в корень сайта и добавьте в него следующие строки:
[PHP] mbstring.http_input = pass mbstring.http_output = pass date.timezone = Europe/Moscow
- Удалите все папки, кроме /sites/ и загрузите папки из новой версии Drupal.
- В папку /modules/ обратно загрузите системные модули ping и upload из Drupal 6 (иначе обновление будет ругаться, что модули пропали, а в базе они есть). После обновления их нужно удалить через web интерфейс.
- Отредактироать файл /includes/bootstrap.inc. найти функцию drupal_get_user_timezone() и отредактировать её следующим образом:
drupal_get_user_timezone() { global $user; if (variable_get('configurable_timezones', 1) && $user->uid && $user->timezone) { $timezone = $user->timezone; } else { // Ignore PHP strict notice if time zone has not yet been set in the php.ini // configuration. $timezone = variable_get('date_default_timezone', @date_default_timezone_get()); } // check timezone whether exists if(!array_search($timezone, DateTimeZone::listIdentifiers())) { $timezone = @date_default_timezone_get(); } return $timezone; }
- Отредактировать файл /modules/field/modules/text/text.install. Перед функцией text_update_7000() добавить:
/** * Implements hook_update_dependencies(). */ text_update_dependencies() { $dependencies['text'][7000] = array( // Text update 7000 uses field API s, so must run after // Field API has been enabled. 'system' => 7020, ); return $dependencies; }
а в конце файла добавить:
require_once DRUPAL_ROOT . '/modules/field/field.install';
- Если вы используете модуль l10n (translation), то отредактируйте файл /sites/all/modules/l10n_update/l10n_update.install, найдя функцию l10n_update_update_7210() и добавив в нее строку:
l10n_update_update_7210() { module_load_include('module', 'l10n_update'); l10n_update_ensure_htaccess(); }
- Отредактировать файл модуля /sites/all/modules/wysiwyg/wysiwyg.install. Найдите в нем функцию wysiwyg_update_7200() и удалите строки внутри блока else {}:
db_change_field('wysiwyg_user', 'format', 'format', array( 'description' => 'The {filter_format}.format of the text format.', 'type' => 'varchar', 'length' => 255, 'not null' => FALSE, ));
замените их на
db_drop_primary_key('wysiwyg_user'); db_drop_index('wysiwyg_user', 'uid'); db_change_field('wysiwyg_user', 'format', 'format', array( 'description' => 'The {filter_format}.format of the text format.', 'type' => 'varchar', 'length' => 255, 'not null' => FALSE, ), array( 'indexes' => array( 'uid' => array('uid'), 'format' => array('format'), ), 'foreign keys' => array( 'uid' => array( 'table' => 'users', 'columns' => array('uid' => 'uid'), ), 'format' => array( 'table' => 'filter_format', 'columns' => array('format' => 'format'), ), ), ) );
После этого обновление 7203 пройдет, но не 7204. Для того, чтобы решить проблему с обновление 7204, отредактируйте файл /sites/all/modules/wysiwyg/wysiwyg.module. В нем замени строку
entity_get_controller('wysiwyg_profile')->resetCache();
наif (module_exists('wysiwyg')) { // Skip this if the module is not enabled as entity_get_info() returns null. entity_get_controller('wysiwyg_profile')->resetCache(); }
- Запустите /update.php и выполните все обновления.
- Скорее всего, не все пройдет гладко. Проанализируйте все появившиеся PDOException и посмотрите, какой модуль их вызвал. Дело в том, что при появление такого исключения, процесс обновления прерывается и не до ходит до конца. Поэтому, временно удалите папку с соответствующим модулем, добейтесь обновления ядра системы и модулей относящихся с Core.
- После обновления ядра и основных модулей, верните необходимые модули версии, которая совместима с Drupal 7 и запустите update.php еще раз.
- Запускайте update.php до тех пор, пока не обновите все модули.
- Чтобы устранить ошибку, которая отображается, когда вы заходите в раздел модули: «
Notice: Undefined index: distribution_name in drupal_install_profile_distribution_name() (line 207 of /home/fms190/public_html/drupal/includes/install.inc).
»
Для этого войдите в редактор базы данных phpmyadmin и выполните SQL команду:UPDATE system SET status=1 WHERE name='standard'
Приведенный рецепт решает следующие ошибки:
- drupal notice: date_default_timezone_set(): timezone id ‘14400’ is invalid
- SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘…’ doesn‘t exist:
- PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘.blocked_ips’ doesn’t exist:
- view not found: 1146 Table ‘.block_node_type’ doesn’t exist: SELECT module, delta, type FROM {block_node_type}; Array ( ) in node_block_list_alter() (line 2513 of /home/fms190/public_html/drupal/modules/node/node.module)
- Fatal error: Call to undefined l10n_update_ensure_htaccess() in l10n_update_update_7010() (line 351 of (…)/l10n_update/l10n_update.install).
- Fatal error: Call to undefined _update_7000_field_read_fields() in /public_html/drupal/modules/field/modules/text/text.install on line 78
- An AJAX HTTP error occurred.
- «The following module is missing from the file system…»