ExpressionEngine 1 для ExpressionEngine 2 Обновление с помощью поля файла nGen

Я собираюсь сделать ExpressionEngine v1 для ExpressionEngine v2 Upgrade с большим количеством данных, хранящихся в полях файла nGen.

Каковы шаги, которые необходимо предпринять для предварительного и пост-обновления, чтобы эти данные работали корректно с полем файла EE2 SafeCracker?

Ответ 1

После обновления до EE2 найдите каждое поле файла ex-nGen и измените его Тип поля на файл и запустите этот SQL-запрос:

UPDATE exp_channel_data
SET field_id_X = CONCAT('{filedir_Y}', field_id_X)
WHERE field_id_X != ''
AND field_id_X NOT LIKE '{filedir_%'

Замените "X" на свой идентификатор полей файла (вы можете получить его из exp_channel_fields) и Y с идентификатором предпочтения загрузки, в котором установлено поле файла nGen.

Если у вас установлена ​​матрица в EE1, обновите ее до Matrix 2/EE2 и сделайте то же самое для любых столбцов ex-nGen File, используя этот SQL-запрос:

UPDATE exp_matrix_data
SET col_id_X = CONCAT('{filedir_Y}', col_id_X)
WHERE col_id_X != ''
AND col_id_X NOT LIKE '{filedir_%'

Опять же, X == ваш идентификатор столбца Matrix (вы можете получить это из exp_matrix_cols), а Y == ваш идентификатор предпочтения загрузки.

(Кредит идет Rob Sanchez, конечно.)

Ответ 2

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

Для массива в левом столбце указывается каждый идентификатор поля, который вы изменили на предварительное обновление текста, и его необходимо изменить на обновление после публикации файла, а справа - это X of filedir_X для каталога загрузки файлов, который вы хотите прикрепляться к полю

// Insert file upload directories

$array = array(
    '16' => '1',
    '22' => '1',
    '121' => '3',
    '58' => '1',
    '67' => '1',
    '68' => '1',
    '71' => '1',
    '76' => '1',
    '78' => '1',
    '94' => '1',
    '99' => '1',
    '108' => '3',
    '109' => '3',
    '110' => '3',
    '139' => '1'
    );

foreach($array as $field_id => $dir_id) {

    $q_entries = $this->EE->db->query("SELECT entry_id, field_id_{$field_id} as 'field' from exp_channel_data where field_id_{$field_id} != '' order by entry_id asc");

        if ($q_entries->num_rows() > 0) {

            echo '<h3>field_id_'.$field_id.'</h3>';

            foreach($q_entries->result_array() as $entry) {

                echo $entry['entry_id'];

                $filename = trim('{filedir_'.$dir_id.'}'.$entry['field']);

                echo ' - '.$filename.'<br/>';

                $data = array(
                    'field_id_'.$field_id => $filename,
                    );
                $sql = $this->EE->db->update_string('exp_channel_data', $data, "entry_id = '{$entry['entry_id']}'");
                $this->EE->db->query($sql);

            }
        }

}

echo 'done';

Ответ 3

У меня есть целый пост в блоге об этом, основанный на моем опыте и потоке, на который ссылается Брэндон в своем ответе. Сообщение в блоге здесь.

Ответ 4

Я отправил кое-что в GitHub, который должен помочь кому-либо, кто сталкивается с этим процессом. Это код шаблона EE1 (ему нужно включить PHP на выходе или вводе), который показывает две вещи:

Во-первых, он отображает табличный обзор всех настраиваемых полей в системе. Это для справки, чтобы помочь, когда вы пытаетесь найти все экземпляры определенного типа полей. Он охватывает нормальные поля EE, полевые типы Fieldframe и даже столбцы Matrix.

Во-вторых, каждый раз, когда встречается поле файла nGen, шаблон генерирует код MySQL, который вам нужно использовать (после перехода на EE2), чтобы изменить данные в указанных полях в формате, требуемом исходным полем файла EE2. Эти запросы отображаются только, а не запускаются. Идея заключается в том, что вы где-то сохраняете запросы, запускаете обновление EE1- > EE2, а затем запускаете сохраненные запросы при готовности.

Разумеется, резервное копирование, резервное копирование, BACKUP. Код шаблона каким-либо образом не изменяет вашу базу данных сайта, и был протестирован и отображает то, что должно быть просто отлично. Однако, в то время как запросы MySQL, которые он создает (для копирования и запуска вручную позже), соответствуют тому, что Брэндон рекомендовал в своем ответе, мне еще предстоит проверить эти запросы в действии.

Ответ 5

Лучший способ сделать это - тщательно проработать и сделать резервные копии своей базы данных на каждом шаге. Ранее я написал сообщение в блоге, но подробно остановимся.

Шаг 1: перед запуском вашего обновления измените все типы полей ngen на текст, не беспокойтесь, данные не будут потеряны.

Шаг 2: Следующее обновление ExpressionEngine в соответствии с официальными документами, а затем вернитесь в каждое поле и измените их на первый тип файла сторон.

Следующий шаг включает в себя немного манипуляции с базой данных, но он просто копирует и вставляет, поэтому не беспокойтесь.

Шаг 3: Сделайте резервную копию своей базы данных, прежде чем приступить к выполнению на всякий случай.

Шаг 4: Следующий шаг зависит от того, было ли ваше исходное поле файла nGen в стандартном поле Channel или в поле Matrix.

Теперь перейдите в свою базу данных и замените "X" на свой идентификатор полей файла (вы можете получить это из exp_channel_fields), а Y с идентификатором предпочтения загрузки, в который было установлено поле файла nGen.

(Чтобы найти свой идентификатор предпочтения загрузки на панели управления, перейдите в раздел "Содержимое" > "Файлы" > "Настройки загрузки файлов". Выберите столбец идентификатора слева, который соответствует месту загрузки файла.)

4a: При обновлении стандартных полей канала используйте этот запрос

    UPDATE exp_channel_data
    SET field_id_X = CONCAT('{filedir_Y}', field_id_X)
    WHERE field_id_X != ''
    AND field_id_X NOT LIKE '{filedir_%'

4b: для матрицы поля вместо этого запускают этот запрос

    UPDATE exp_matrix_data
    SET col_id_X = CONCAT('{filedir_Y}', col_id_X)
    WHERE col_id_X != ''
    AND col_id_X NOT LIKE '{filedir_%'

X == Ваш идентификатор столбца Matrix (вы можете получить его из exp_matrix_cols), а Y == ваш идентификатор предпочтения загрузки.

Кредит Брэндону Келли и Робу Санчесу.

Кроме того, эту же процедуру можно использовать для других надстроек, которые не существуют в EE2. Преобразуйте в текст перед обновлением, а затем при необходимости переведите в новый эквивалентный тип поля. Для получения дополнительной помощи: Нажмите здесь