Доброго времени суток, уважаемый читатель. Встала передо мной задача - залить на сайт OpenCart около 4000 информационных страниц. Содержимое страниц генерировалось по шаблону, поэтому представим, что данные, которые нужно добавить, у нас уже есть в наличии. В случае, если контент страниц статичный - принцип остается тот же самый.

Переводить свое время на ручное добавление такого количества страниц у меня желания не было абсолютно, и с вопросом о существовании модуля импорта для OpenCart я вышел в Интернет. На сайте уже был установлен модуль для импорта/экспорта товаров, категорий, фильтров и опций, однако ничего подобного для информационных страниц я не нашел. Тем не менее, в итоге получилось придумать чуть более муторное, но вполне себе рабочее решение, которым я с Вами и хочу поделиться.
Немного теории
Если вы знаете, как устроена CMS - смело листайте к следующему заголовку. Новичкам же будет очень полезно. Все данные сайта на OpenCart - инфо страницы, категории, товары, настройки хранятся в базе данных. Когда пользователь заходит на сайт, заказывает товары, оставляет комментарии и выполняет другие действия - специальные скрипты генерируют SQL запросы к базе данных. Когда Вы что-то меняете в админке сайта - происходит ровно то же самое. SQL запросы могут быть на чтение, добавление, изменение или удаление записей в таблицах.
Соответственно, мы можем сгенерировать запросы сами, если будем знать, что именно "спрашивать". Но будте внимательны - даже самое простое действие может затрагивать сразу несколько таблиц. В самой CMS и модулях разработчики тщательно проверяют корректность работы системы на тестовых данных, прежде чем выпустить в релиз. Поэтому если решите химичить с базой данных - обязательно делайте резервную копию и обдумывайте и проверяйте свои действия. Подсказка - все запросы можно вытащить из файлов админки, где эти запросы генерируются, или из лога SQL запросов - это значительно снизит вероятность ошибок.
Каждая страница имеет свой ID - уникальный числовой идентификатор. ID не может повторяться для страниц одного типа в рамках одного сайта. То есть категории имеют свои ID, товары - свои, информационные страницы - свои и так далее. Информация по одной странице может храниться в базе в разных таблицах, но везде обязательно указан ID, с помощью которого данные сопоставляются во время выполнения запроса. Например, когда Вы редактируете товар с ID=101 в админке - скрипты генерируют запрос "В Таблице1 поменяй Значение1 у товара с ID = 101, а в Таблице8 поменяй Значение5 у товара с ID = 101". Очень упрощенный пример, но, надеюсь, общий принцип работы понятен.
SQL запрос добавления страниц
Сам запрос к БД, добавляющий информационные страницы, я нашел в файле /admin/model/catalog/information.php, в функции addInformation.

Точно такой же запрос автоматически генерируют скрипты, когда Вы создаете новую информационную страницу и сохраняете ее в админке.
INSERT INTO oc_information SET sort_order = '', bottom = '', status = '';
INSERT INTO oc_information_description SET information_id = '', language_id = '', title = '', description = '', meta_title = '', meta_h1 = '', meta_description = '', meta_keyword = '';
INSERT INTO oc_information_to_store SET information_id = '', store_id = '';
INSERT INTO oc_information_to_layout SET information_id = '', store_id = '', layout_id = '';
INSERT INTO oc_url_alias SET query = '', keyword = '';
Кто разбирается в SQL, сразу поймет - ничего хитрого тут нет. Нужно только знать, в какой таблице какие данные хранятся. Кто пока с SQL не сталкивался или знает поверхностно - давайте кратенько разберем, что к чему.
В приведенном выше коде последовательно идут 5 запросов на добавление строк в определенные таблицы базы данных. Каждый из запросов работает примерно по такому принципу:
INSERT INTO `Название_Таблицы` SET `Поле1` = 'Значение1', `Поле2` = 'Значение2';
INSERT INTO - это SQL запрос на запись строк в таблицу базы данных. Что касается самих таблиц, в начале идет префикс, после него, через нижнее подчеркивание - название. По умолчанию в OpenCart префикс таблиц "oc", однако для повышения безопасности (например, защиты от SQL-инъекций), его рекомендуется менять на случайно сгенерированную комбинацию цифр и чисел. Мы разберем пример импорта со стандартным префиксом, чтобы не усложнять. Соответственно, нужно посмотреть префикс для конкретного сайта, иначе импорт не сработает.
Теперь давайте разберем, в какие таблицы запрос добавляет записи о новой информационной странице.
- oc_information - основная таблица, содержащая поля для управления страницей:
- information_id - уникальный идентификатор страницы;
- bottom - отображать ли страницу в подвале;
- top - отображать ли страницу в шапке;
- top2 - отображать ли страницу в меню;
- sort_order - порядок сортировки по умолчанию;
- status - статус отображения страницы на сайте;
- oc_information_description - таблица с описаниями:
- information_id - уникальный идентификатор страницы;
- language_id - язык описаний страницы;
- title - основное название страницы в системе;
- description - содержимое (описание) страницы;
- meta_title - содержимое тега Title;
- meta_h1 - содержимое тега H1;
- meta_description - содержимое мета-тега Description;
- meta_keyword - содержимое мета-тега Keyword;
- oc_information_to_store - таблица соответствия страницы и магазина.
- information_id - уникальный идентификатор страницы;
- store_id - уникальный идентификатор магазина;
- oc_information_to_layout - таблица соответствия страницы и шаблона.
- information_id - уникальный идентификатор страницы;
- store_id - уникальный идентификатор магазина;
- layout_id - уникальный идентификатор шаблона;
- oc_url_alias - таблица с ЧПУ.
- url_alias_id - идентификатор перенаправления;
- query - запрос для перенаправления, для информационных страниц в виде information_id=11, вместо 11 - id страницы;
- keyword - адрес перенаправления, если на сайте используются ЧПУ - то, собственно, ЧПУ.
Не забывайте, что нужно заменить префикс таблиц "oc_" на актуальный для конкретного сайта. Можете либо через PHPMyAdmin зайти и посмотреть префиксы таблиц в базе, либо в конце файла config.php в корневом каталоге сайта найти данные о подключении к БД, где будет указан и префикс таблиц.

Далее нужно заполнить необходимые данные в запросе (Excel шаблон в конце статьи).
Затем авторизоваться в PHPMyAdmin, открыть базу данных сайта и перейти во вкладку SQL. Скопируйте созданный запрос в поле ввода, внимательно проверьте корректность введенных данных, вспомните, что хорошо смеется тот, кто сделал бэкап (это к тому, что неплохо бы сделать бэкап сначала) и нажмите кнопку "Вперед" или сочетание клавиш "Ctrl+Enter". Если все сделалано правильно, запрос к базе должен выполниться без ошибок, а на сайте — появиться новая страница.
Если нужно залить много страниц, заранее подготовьте все запросы и выполните за 1 раз. При этом внимательно проверьте, чтобы в конце каждого запроса стоял знак ";", иначе PHPMyAdmin не сможет корректно их обработать и выдаст ошибку, а часть страниц придется затем удалять вручную из таблиц базы данных, поскольку данные о них запишутся не во все таблицы и удалить их из админки не получится (проверено на личном опыте) - еще один важный момент, почему не надо забывать о бэкапах.
Шаблон генерации запросов в Excel
Я был бы не я, если бы при генерации тысяч однотипных запросов не сделал шаблон в Excel. В конце концов, и данные редактировать в табличном виде значительно проще, и шаблон при необходимости можно быстренько скорректировать - скачать шаблон.

Для использования заполните все поля, и в последнем столбце получите сгенерированный запрос. Важно чтобы в базе данных не было статей с таким id - возьмите наибольшее значение +1.

Если Вам понравилась статья - можете оставить комментарий или поделиться ей. Спасибо за прочтение!
Комментарии (0)