Главная Новости

Перенос данных OpenCart с версии 1.5.5.1 на 2.0.2.0


Опубликовано: 02.09.2018

видео Перенос данных OpenCart с версии 1.5.5.1 на 2.0.2.0

Как правильно перенести сайт с одного домена на другой? Просто о сложном

Пишу очередную шпаргалку скорее для себя самого на случай повторения ситуации или задачи. Пишу - пока ещё помню что и как я делал... ????



Итак, исходные данные задачи: имеется работающий магазин на OpenCart 1.5.5.1, решено перенести на VPS-хостинг, при этом доменное имя сохраняется, а вот версия магазина должна быть уже 2.0.2.0.

С одной стороны, казалось-бы задача несложная, так-как домен и адрес магазина по сути не меняются. А с другой - всё осложняется тем, что каждая последующая ветка OpenCart имеет несколько отличную структуру базы данных, чем предыдущая. Поэтому просто скопировать базу данных не получится...


Экспорт и импорт товаров в Opencart | HOSTiQ

Почему я не использовал специальный модуль

В каталоге дополнений OpenCart я нашёл модуль, который вроде-бы осуществляет такой перенос данных. Но модуль платный, стоит около $100...

По началу я собирался воспользоваться этим модулем и уже запросил у руководства выделение средств на его покупку. Но вот характер у меня вредный, иногда сам не рад - в тот момент, когда руководство дало согласие на выделение указанной суммы, меня вдруг посетила мысль: «Что-ж я, дурнее паровоза, что-ли?». И я дал «Отбой». После чего пришлось включать собственные мозги... Как говорится - дурная голова ногам покоя не даёт. ????


Где в OpenCart хранится html код и как его менять

Определяемся с задачей

Что нам по сути нужно и важно? Из всей базы данных мне нужно было сохранить базу клиентов и историю их заказов. Что-бы во-первых, не пострадала статистика магазина, во-вторых, не потерять этих самых клиентов, в-третьих, чтобы они могли заходить в новый магазин под своими логинами и паролями и в-четвёртых - могли видеть историю своих покупок.

Все остальные данные я настраивал в новом магазине заново. Например, можно было перенести ещё и статусы заказов, но в старом магазине я просто перевёл их все с английского на русский, а там их штук 15, если не больше, из которых реально использовались только 3 - 4. Поэтому в новом варианте я сразу удалил все лишние статусы и оставил только используемые.

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

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

Все эти таблицы я скопировал себе на компьютер при помощи SQL-запросов через PhpMyAdmin. Об этом чуть ниже...

Вот, сделал некую справочную таблицу по этому поводу:

Таблица Описание sql-файл
customer Данные клиентов customer.sql
customer_ip С каких IP заходили customer_ip.sql
order Заказы order.sql
order_history История заказов order_history.sql
order_product Товары в заказах order_product.sql
order_status Статусы, присвоенные конкретным заказам order_status.sql
order_total Итоговые данные по заказам order_total.sql

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

Практический перенос данных

Давайте уже от слов перейдём к делу и для начала получим эти самые SQL-фалы на свой компьютер.

Как говорят иногда после показа некоторых видеороликов - не советуем повторять это дома... ???? Особено, если Вы незнакомы с PhpMyAdmin и не понимаете, что такое SQL-запрос.

Получение SQL-файлов

Для начала запускаем PhpMyAdmin на хосте старого магазина и выбираем нужную базу данных...

Затем выбираем нужную таблицу - её данные должны отобразиться в центре.

После чего кликаем на вкладке «Экспорт»

 

Здесь ничего не меняем и просто кликаем на кнопку «Ок».

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

Появится вот такое окно и нам ничего больше не остаётся, как сохранить этот файл себе на компьютер.

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

Как видите - ничего сложного тут нет.

Готовим данные к переносу

Получить SQL-фалы на свой компьютер - это только первый шаг. В таком виде, как они есть, они нам не пригодятся - в них много излишней информации. Поэтому, сначала нам необходимо их некоторым образом модифицировать. И делать это мы будем при помощи, конечно-же, NotePad++.

Открываем полученный файл (всё на примере того-же customer.sql) и удаляем из него всё с самого начала и до строк 52 - 54, они выделены в конце кода. Эти строки и всё, что ниже их должно остаться.

-- phpMyAdmin SQL Dump -- version 4.0.8 -- http://www.phpmyadmin.net -- -- Хост: localhost -- Время создания: Июн 08 2015 г., 09:24 -- Версия сервера: 5.5.35-cll -- Версия PHP: 5.3.17 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- База данных: `ddwshop_ok` -- -- -------------------------------------------------------- -- -- Структура таблицы `customer` -- CREATE TABLE IF NOT EXISTS `customer` ( `customer_id` int(11) NOT NULL AUTO_INCREMENT, `store_id` int(11) NOT NULL DEFAULT '0', `firstname` varchar(32) NOT NULL, `lastname` varchar(32) NOT NULL, `email` varchar(96) NOT NULL, `telephone` varchar(32) NOT NULL, `fax` varchar(32) NOT NULL, `password` varchar(40) NOT NULL, `salt` varchar(9) NOT NULL, `cart` text, `wishlist` text, `newsletter` tinyint(1) NOT NULL DEFAULT '0', `address_id` int(11) NOT NULL DEFAULT '0', `customer_group_id` int(11) NOT NULL, `ip` varchar(40) NOT NULL DEFAULT '0', `status` tinyint(1) NOT NULL, `approved` tinyint(1) NOT NULL, `token` varchar(255) NOT NULL, `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`customer_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=173 ; -- -- Дамп данных таблицы `customer` --

Номера строк могут быть и другими, но тут ключевыми словами, своеобразной зацепкой является фраза: «Дамп данных таблицы... »

Теперь пролистываем файл в самый низ и там, под данными клиентов, удаляем вот такие (или подобные) строки:

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

По итогу, у нас должно остаться вот это:

-- -- Дамп данных таблицы `customer` -- INSERT INTO `customer` (`customer_id`, `store_id`, `firstname`, `lastname`, `email`, `telephone`, `fax`, `password`, `salt`, `cart`, `wishlist`, `newsletter`, `address_id`, `customer_group_id`, `ip`, `status`, `approved`, `token`, `date_added`) VALUES (1, 0, 'Александр', 'Каратаев', '[email protected]', '293-ХХ-ХХ', '', '50d45586424685242df2958fb3782e76aac38c48', '59cb9e002', 'a:0:{}', 'a:3:{i:0;s:4:"3340";i:1;s:3:"239";i:2;s:4:"1872";}', 1, 1, 1, 'ХХ.ХХ.ХХ.ХХХ', 1, 1, '', '2013-02-12 15:14:37'), --- тут куча данных по другим клиентам (172, 0, 'Иван', 'Пупкин', '[email protected]', '8707XXXXXXX', '', '89a6b6b85481b5a1801c5f82717eb0266b734864', 'f68626671', 'a:1:{i:9373;i:1;}', 'a:33:{i:0;s:4:"9373";i:1;s:4:"9374";i:2;s:4:"9459";i:3;s:4:"9463";i:4;s:4:"9465";i:5;s:4:"9487";i:6;s:5:"12164";i:7;s:4:"9488";i:8;s:4:"9496";i:9;s:4:"9490";i:10;s:4:"9503";i:11;s:4:"9493";i:12;s:4:"9499";i:13;s:4:"9494";i:14;s:4:"9492";i:15;s:4:"9497";i:16;s:4:"9500";i:17;s:4:"9501";i:18;s:4:"9408";i:19;s:4:"9410";i:20;s:4:"9411";i:21;s:4:"9688";i:22;s:4:"9692";i:23;s:4:"9693";i:24;s:4:"9537";i:25;s:5:"12229";i:26;s:4:"9565";i:27;s:4:"9567";i:28;s:4:"9568";i:29;s:4:"9573";i:30;s:4:"9694";i:31;s:4:"7769";i:32;s:4:"7662";}', 0, 186, 1, 'ХХ.ХХ.ХХ.Х', 1, 1, '', '2015-06-03 14:45:11');

Естественно, что цифры даже в закодированных паролях я случайным образом изменил, а в каких-то данных вместо цифр проставил «Х»... Ну так... На всякий случай...

И, наконец, последним шагом подготовки этого файла является замена имени самой таблицы. Дело в том, что в старом магазине таблица называлась «customer», а в новом она называется по другому - «ok_customer».

Эту замену надо произвести в команде INSERT. Просто меняем там старое имя на новое.

Было: INSERT INTO `customer`

Стало: INSERT INTO `ok_customer`

При этом надо учесть, что таких команд по файлу может быть несколько - зависит от объёма данных. Замену нужно сделать во всех таких командах.

Всё, файл готов для переноса информации в новый магазин. Точно так-же поступаем и со всеми остальными sql-файлами. Кому-то это может показаться сложным, но на самом деле это не так. Главное уловить суть - убрать из файла всё, что не касается вставки данных в таблицу.

Готовим базу нового магазина к приёму данных

Помните, я говорил, что в разных версиях OpenCart есть различия в структуре некоторых таблиц?

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

Подобные ошибки могут появиться по нескольким таблицам.

Причина - несоответствие структуры таблиц.

Поэтому мы не будем нарываться на это безобразие, а заранее устраним причину.

Запускаем всё тот-же PhpMyAdmin, но уже на хосте нового магазина.

Как и в первом случае выбираем нашу базу, но вкладку теперь используем другую - «SQL».

Сам SQL-запрос я покажу ниже.

Не забываем нажать кнопку «Ок».

А вот и нужный нам SQL-запрос. Он одним махом устраняет несоответствия по всем таблицам, которые мы затрагиваем переносом данных.

ALTER TABLE `ok_order` ADD `payment_company_id` VARCHAR( 32 ) NOT NULL AFTER `payment_company` ; ALTER TABLE `ok_order` ADD `payment_tax_id` VARCHAR( 32 ) NOT NULL AFTER `payment_code` ; ALTER TABLE `ok_order_total` ADD `text` VARCHAR( 255 ) NOT NULL AFTER `title` ;

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

Теперь уже ничто не препятствует нам перенести данные.

Импорт данных в новый магазин

Импорт, в принципе, можно осуществить двумя способами. Оба они предполагают использование всё того-же PhpMyAdmin, естественно, что на новом хосте.

Способ первый, точно такой-же, которым мы устраняли несоответствия в таблицах. Только в поле SQL-запроса нужно поочерёдно вставлять весь код из каждого подготовленного нами sql-файла, не забывая каждый раз нажимать кнопку «Ок». Способ второй. В PhpMyAdmin выбираем не вкладку «SQL», а вкладку «Импорт».

Этот способ мне кажется более удобным.

Выбираем нашу базу, жмём «Импорт», Выбираем поочерёдно подготовленные sql-файлы и нажимаем кнопку «Ок».

Лично я использовал второй способ.

Прибираем за собой

Хороший тон в программировании - если какая либо функция что-то создавала, открывала и т.д, то по завершению работы она должна всё за собой убрать.

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

Теперь, после того, как импорт завершён, эти поля нужно убрать из таблиц. В принципе, ничего страшного не произойдёт, если мы их оставим, на работе магазина это никак не скажется. Но зачем нам лишний мусор? Намусорил - убери!

Это мы сейчас и сделает тем-же самым способом, которым добавляли поля, только сам SQL-запрос, естественно, будет несколько иным.

Вот он:

ALTER TABLE `ok_order` DROP `payment_company_id` ALTER TABLE `ok_order` DROP `payment_tax_id` ALTER TABLE `ok_order_total` DROP `text`

Как и в случае с добавлением полей всё делаем одним SQL-запросом.

На этом наша задача выполнена. Магазин полностью готов. Он без потерь подхватил эстафету старого OpenCart 1.5.5.1 и сходу включился в работу как ни в чём ни бывало.

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

Заключение

Как и все статьи, что я публиковал на тему OpenCart - написаны в большей степени для себя в качестве некоей шпаргалки на будущее. Ведь со временем всё забывается.

В частности вот эту самую статью я планировал написать давно, что называется - по горячим следам. Да всё руки как-то не доходили.

А ведь представленный здесь окончательный и вылизанный вариант рождался путём проб и получения кучи ошибок на каждом этапе. Многое достигалось методом научного и не очень тыка. Благо был тестовый магазин, на котором и проводились все эти эксперименты. К рабочему магазину был применён уже окончательный вариант, описанный в статье.

Но время шло и какие-то нюансы уже начали меркнуть в моём мутнеющем сознании, занятом к тому-же совершенно другими задачами, иными проектами вообще никак не связанными с OpenCart. Хорошо ещё в своё время я сообразил сделать несколько скриншотов и сохранить какие-то коды. И как знать? Может подобная задача возникнет когда-то в будущем...

Я прекрасно понимаю, что моим читателям эта статья будет совершенно не интересна - вы, дорогие мои, не работаете с OpenCart, а если вдруг кто-то и работает, то очень сомнительно, что ему надо куда-то переносить какие-то данные. Поэтому, соответственно не жду здесь никаких комментариев.

Тем не менее, если вдруг кто-то в поисках решения забредёт на мой блог и статья окажется ему полезной - я буду только рад.

На этом всё. Удачи Вам и до встречи на наших блогах.

rss