Тонкости и проблемы при апгрейде Drupal с 6 на 7 версию

Сразу скажу, что с апгрейдом Drupal я намучился и потратил на это не один час. Увы, система сделано очень крисов и требует массовых патчей для корректного обновления. Основные проблемы с обновлением SQL таблиц для используемых модулей.

Вот последовательность, которую я рекомендую. Она получена методом проб и ошибок.

  1. Для всех модулей, которые вы будете продолжать использовать, скачайте новые версии для Drupal 7.
  2. Отключите все модули, кроме Core. Удалите модули через админ панель, которые вы не будете использовать, чтобы почистились SQL таблицы (например, FCKeditor). После удаления модуля, удалите его папку.
  3. Создайте файл php.ini, положите в корень сайта и добавьте в него следующие строки:
    1
    2
    3
    4
    
    [PHP]
    mbstring.http_input = pass
    mbstring.http_output = pass
    date.timezone = Europe/Moscow
  4. Удалите все папки, кроме /sites/ и загрузите папки из новой версии Drupal.
  5. В папку /modules/ обратно загрузите системные модули ping и upload из Drupal 6 (иначе обновление будет ругаться, что модули пропали, а в базе они есть). После обновления их нужно удалить через web интерфейс.
  6. Отредактироать файл /includes/bootstrap.inc. найти функцию function drupal_get_user_timezone () и отредактировать её следующим образом:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    function 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;
    }
  7. Отредактировать файл /modules/field/modules/text/text.install. Перед функцией function text_update_7000 () добавить:
    /**
    * Implements hook_update_dependencies().
    */
    function text_update_dependencies() {
     $dependencies['text'][7000] = array(
    // Text update 7000 uses field API functions, so must run after
    // Field API has been enabled.
     'system' => 7020,
    );
     return $dependencies;
    }

    а в конце файла добавить:

    require_once DRUPAL_ROOT . '/modules/field/field.install';
  8. Если вы используете модуль l10n (translation), то отредактируйте файл /sites/all/modules/l10n_update/l10n_update.install, найдя функцию l10n_update_update_7210 () и добавив в нее строку:
    function l10n_update_update_7210() {
      module_load_include('module', 'l10n_update');
      l10n_update_ensure_htaccess();
    }
  9. Отредактировать файл модуля /sites/all/modules/wysiwyg/wysiwyg.install. Найдите в нем функцию function 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();
    }
  10. Запустите /update.php и выполните все обновления.
  11. Скорее всего, не все пройдет гладко. Проанализируйте все появившиеся PDOException и посмотрите, какой модуль их вызвал. Дело в том, что при появление такого исключения, процесс обновления прерывается и не до ходит до конца. Поэтому, временно удалите папку с соответствующим модулем, добейтесь обновления ядра системы и модулей относящихся с Core.
  12. После обновления ядра и основных модулей, верните необходимые модули версии, которая совместима с Drupal 7 и запустите update.php еще раз.
  13. Запускайте update.php до тех пор, пока не обновите все модули.
  14. Чтобы устранить ошибку, которая отображается, когда вы заходите в раздел модули: 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'

Приведенный рецепт решает следующие ошибки:

[Посещений: 37, из них сегодня: 1]

Понравилась публикация? Почему нет? Оставь коммент ниже или подпишись на feed и получай список новых статей автоматически через feeder.