Доброго времени суток, уважаемый читатель. Встала передо мной задача - залить на сайт 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.

Как выглядит запрос в php файле

Точно такой же запрос автоматически генерируют скрипты, когда Вы создаете новую информационную страницу и сохраняете ее в админке.

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 в корневом каталоге сайта найти данные о подключении к БД, где будет указан и префикс таблиц.

Где посмотреть префикс таблиц OpenCart в phpMyAdmin

Далее нужно заполнить необходимые данные в запросе (Excel шаблон в конце статьи).

Затем авторизоваться в PHPMyAdmin, открыть базу данных сайта и перейти во вкладку SQL. Скопируйте созданный запрос в поле ввода, внимательно проверьте корректность введенных данных, вспомните, что хорошо смеется тот, кто сделал бэкап (это к тому, что неплохо бы сделать бэкап сначала) и нажмите кнопку "Вперед" или сочетание клавиш "Ctrl+Enter". Если все сделалано правильно, запрос к базе должен выполниться без ошибок, а на сайте — появиться новая страница.

Если нужно залить много страниц, заранее подготовьте все запросы и выполните за 1 раз. При этом внимательно проверьте, чтобы в конце каждого запроса стоял знак ";", иначе PHPMyAdmin не сможет корректно их обработать и выдаст ошибку, а часть страниц придется затем удалять вручную из таблиц базы данных, поскольку данные о них запишутся не во все таблицы и удалить их из админки не получится (проверено на личном опыте) - еще один важный момент, почему не надо забывать о бэкапах.

Шаблон генерации запросов в Excel

Я был бы не я, если бы при генерации тысяч однотипных запросов не сделал шаблон в Excel. В конце концов, и данные редактировать в табличном виде значительно проще, и шаблон при необходимости можно быстренько скорректировать - скачать шаблон.

Шаблон для генерации sql запроса в Excel

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

Пример сгенерированного SQL запроса

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