Думаю, что многие владельцы интернет-магазинов, сделанных на Virtuemart, часто сталкивались с рутинными задачами, отнимающими просто огромное количество времени. Например, обновление цен, смена категории, валюты, производителя большого количество товаров и.т.п. Беда Virtuemart в том, что такие действия довольно часто нельзя выполнить сразу над набором товаров – редактировать приходится каждый отдельно. В этой статье я расскажу о том, как быстро получить уйму полезной информации, а также совершить некоторые действия над товарами напрямую через базу данных.
Содержание
Начнем с того, что многое из описанного в этой статье, можно сделать с помощью компонента CSV Imprived, но есть несколько НО:
- CSV Improved платный
- Он требует даже большего изучения и подготовки, чем способ, описанный мной здесь
- Он требует использования Excel-таблиц или аналогов
- Он позволяет делать далеко не все действия, которые можно сделать напрямую через базу данных
Изначально CSV Imprived создан для экспорта/импорта товаров Virtuemart и с этим он отлично справляется, но перед нами сегодня стоит немного другая задачка, которую мы постараемся решить другими средствами.
Предупреждение(!)
(!) Прежде чем выполнять действия, описанные ниже, обязательно создайте резервную копию базы данных!
(!) Не проводите эксперименты на действующих проектах!
(!) Выполняйте запросы на действующих проектах только имея резервную копию базы данных и точно понимая, что вы делаете!
PhpMyAdmin – веб-интерфейс администрирования базы данных
В заголовке этого абзаца содержится много страшных непонятных слов, поэтому ниже я приведу немного информации для новичков. Я когда-то все это уже писал, но в этой статье не помешает повториться.
Итак, несколько фактов о Virtuemart:
- База данных Virtuemart представляет собой набор таблиц, в которых хранятся данные о товарах, производителях, заказах, а также обо всем остальном, что изменяется в магазине с течением времени.
- База данных Virtuemart является составной частью базы данных Joomla. Это означает, что при установке Virtuemart добавляет свои таблицы к таблицам Joomla.
- База данных Virtuemart имеет префикс vm_. О том, что это рассказывается ниже.
Для просмотра таблиц базы данных и управления ими нужен веб-интерфейс (все это, конечно, можно делать путем программирования, но для людей, малознакомых с ним, такая задачка окажется крайне сложной). Таким интерфейсом является PhpMyAdmin.
Что представляет из себя PhpMyAdmin? Это такой же скрипт, как и Joomla, т.е. набор php-файлов, позволяющий легко и удобно управлять базой данных.
Где найти и как запустить PhpMyAdmin? PhpMyAdmin есть на любом php-хостинге. Сегодня это стандарт. Найти его вы сможете в панели управления хостингом в разделе управления базами данных. Если вы работаете на Dender’е(локальном веб-сервере), то PhpMyAdmin доступен по адресу: http://localhost/Tools/phpmyadmin/ . Denwer при этом, естественно, должен быть запущен.
В зависимости от используемой версии внешний вид интерфейса PhpMyAdmin может немного меняться. Ниже на рисунках мы будем рассматривать версию 3.2.3, которая встроена в Denwer.
Вот главное окно PhpMyAdmin:
Слева мы видим доступный список баз данных. Если кликнуть по одной из баз, то откроется страница со следующим содержимым:
Теперь мы видим слева и справа список таблиц текущей базы данных. Кликнув по одной из таблиц слева, мы увидим следующее:
Здесь нас интересуют три вкладки, показанные вверху окна:
1) Browse:
На вкладке Browse можно увидеть часть содержимого таблицы. По умолчанию показывается 30 строк. Сверху можно увидеть названия колонок(полей) таблицы.
2) Structure:
Вкладка Structure показывает структуру выбрано таблицы, а именно поля, которые в ней содержатся, и конфигурацию этих полей.
3) SQL:
Вкладка SQL содержит форму ввода SQL-запроса к базе данных.
Используя три этих вкладки, мы сможем получать всю необходимую информацию о магазине, а также решать множество задач.
Создание резервной копии базы данных
Прежде чем перейти непосредственно к работе с базой данных, разберем то, как создавать ее резервные копии. В ходе дальнейших экспериментов по незнанию легко можно повредить базу или удались из нее важную информацию.
Резервная копия делается легко и быстро:
1) Кликаем слева по базе, которую хотим сохранить:
2) На вкладках справа жмем ссылку Export
3) В открывшемся окне выделяем все таблицы(если они не выделены), ставим галочку Save as file и жмем кнопку Go.
После этого браузер выдаст запрос на сохранение файла, содержащего базу данных.
Просто, не правда ли?
Аналогичным способом происходит и восстановление резервной копии базы. Жмем ссылку Import, выбираем файл, жмем кнопку Go.
Прежде, чем приступать к дальнейшим действиям, советую попробовать экспортировать базу, а затем импортировать ее обратно.
Если вы всё-таки не создали резервную копию и по каким-то причинам удалили файл с базой данных, то вам может помочь прога восстановление удаленных файлов.
Работа с SQL-запросами
После того, как мы сделали резервную копию базы данных и научились ее восстанавливать, можно перейти к работе с SQL-запросами. Базовые конструкции языка SQL достаточно просты и не должны вызвать затруднений.
Прежде всего нам нужно научиться выбирать данные. Я уже писал об этом. Приведу цитату из одной моей статьи:
---------------------------------------------
Итак, наша цель – выбрать из базы данных определенные данные. Для того, чтобы сделать это, нужно ответить на 3 основных вопроса:
- Что выбирать? (SELECT)
- Из чего выбирать? (FROM)
- Как выбирать? (WHERE)
В скобочках я написал основные операторы SQL, ответственные за каждый из вопросов.
Теперь подробнее.
1) Как известно, база данных Joomla – это набор таблиц. У каждой таблицы есть столбцы и строки, при этом в столбцах указывается переменная, а в строках – ее значения.
Вот пример:
Таблица: birthday
ФИО |
Год рождения |
Иванов Иван Иванович |
1977 |
Петров Петр Петрович |
1988 |
Сидоров Сидр Сидорович |
1999 |
Чтобы выбрать конкретную запись, нам нужно выбрать правильный столбик и задать условие выбора строки. Т.е., например, сказать: «Выбери ФИО того человека, который родился в 1988 году».
В SQL за «выбери» отвечает SELECT, а за «который родился» – WHERE. Кроме того, т.к. в Joomla таблица не одна, а много, нам нужно указать в запросе название таблицы( за это отвечает оператор FROM).
Таким образом, наш SQL-запрос будет иметь следующий вид:
1 |
SELECT ФИО FROM birthday WHERE Год рождения = '1988'
|
Результатом выполнения этого запроса будет «Петров Петр Петрович»
---------------------------------------------
Если требуется не просто выбрать данные, а еще и совершить над ними какие-то действия, можно использовать оператор UPDATE. Вообще, по языку SQL в Интернете очень много учебников и руководств. Не думаю, что его изучение в контексте данной статьи, хорошая идея. Здесь мы говорим про Virtuemart и пора бы уже поговорить непосредственно о нем.
Как я упоминал выше, все таблицы, относящиеся к Virtuemart, имеют префикс vm_. Префикс таблиц Virtuemart идет после префикса таблиц Joomla и если префикс таблиц Joomla стандартный, то перед названием таблицы Virtuemart вы будете видеть следующее:
jos_vm_. Что-то я увлекся умным словом «префикс» и совсем забыл напомнить для чего он, собственно, нужен. Расширения для Joomla разрабатывают программисты всего мира. Многие из этих расширений имеют свои таблицы базы данных, которые при установке добавляются к таблицам Joomla. Если бы не префикс, то наверняка нашлись бы разработчики, назвавшие таблицы своих баз одинаково. При установке двух таких расширений, естественно, ничего хорошего бы не получилось. Для того, чтобы не было таких «накладок», используется префикс базы данных и расширений. Вероятность совпадения названий таблиц префикс не исключает(ведь в мире могут найтись разработчики, которые назовут одинаково не только таблицы, но и префиксы), но значительно ее уменьшает.
Зная префикс Virtuemart, вы легко сможете увидеть в базе данных все таблицы, которые к нему относятся. Именно с ними нам и предстоит работать. Названия таблиц, а также столбцов в таблицах созданы так, чтобы каждый, прочитав их, смог догадаться какие данные в них содержаться. Например очевидно, что таблица jos_vm_product содержит данные о товарах магазина. А столбец product_name этой таблицы содержит названия товаров. Немного знаний английского языка и вы легко сможете ориентироваться в таблицах. Если же с английским совсем плохо, то просто посмотрите обзор таблиц. По данным, содержащимся в ячейках, обычно легко понять, что храниться в таблице/столбце таблицы.
Примеры некоторых SQL-запросов
Для того, чтобы освоиться было проще, ниже я привожу SQL-запросы, решающие некоторые задачи по работе с Virtuemart.
Примечание
Префикс таблиц Joomla может быть не только jos_. Если префикс таблиц Joomla в вашей базе данных отличается от стандартного, то чтобы правильно выполнить запрос нужно изменить в нем префикс jos_ на тот, который используется у вас.
Теперь непосредственно запросы:
1. Массовое обновление данных о товарах
Иногда требуется изменить какое-то постоянное значение, которое имеется у всех товаров. Например, очень частая проблема – неверное указание единицы измерения веса товара. Как известно, способы доставки работают только если единица веса задана, как kg, но не кг. Если вы узнаете об этом уже после того, как наполнили магазин тысячей товаров, то открывать каждый из них и вручную исправлять вес совсем не хочется. В этом случае поможет заклинание запрос:
1 2 |
UPDATE `jos_vm_product` |
После выполнения запроса вы можете увидеть, что все значения колонки product_weight_uom таблицы jos_vm_product стали равны kg.
Аналогичным образом можно задать единицы измерения длины, ширины, высоты товара, и другие однотипные данные.
2. Обновление цен
Еще одна частая задачка. Предположим, что необходимо увеличить все цены товара на определенный коэффициент, например, в соответствии с инфляцией. Предположим, что нужно поднять цены на 10%. Используем следующий запрос:
1 2 |
UPDATE `jos_vm_product_price` |
После выполнения этого запроса все цены увеличатся на 10%.
3. Смена категории
Задача заключается в том, чтобы перенести все товары одной категории в другую. Для того, чтобы сделать это нам нужно знать две вещи:
- Из какой категории переносить товары
- В какую категорию переносить товары
Каждая категория в Virtuemart имеет уникальный идентификатор(id). Каждый товар Virtuemart также имеет идентификатор. Каждый идентификатор товара связан с идентификатором категории, в которой этот товар находится.
Предположим, что нам нужно перенести все товары из категории с id=9 в категорию с id=12. Узнать ID соответствующей категории можно в админке Virtuemart. В списке категорий, в последней колонке указан как раз этот ID. Запрос будет следующий:
1 2 3 |
UPDATE `jos_vm_product_category_xref` |
Здесь мы не только выбрали колонку для обновления, но также взяли из нее только те значения, которые равны 9.
4. Скидка определенной категории товаров
Иногда нужно сделать скидку на товары определенной категории. Чтобы не назначать скидку для каждого товара категории отдельно, мы используем SQL-запрос. Для его создания нужно посмотреть каким образом в Virtuemart хранятся скидки. Для скидок в базе данных существует отдельная таблица jos_vm_product_discount. Также каждой скидке при создании присваивается уникальный идентификатор(id). Алгоритм наших действий следующий:
- Переходим в Virtuemart –> Товары –> Список скидок на товары.
- Создаем нужную нам скидку.
- Открывает таблицу jos_vm_product_discount, находим в ней нашу скидку и запоминаем ее id(пусть это будет 1).
- Находим категорию товаров, в которой будет применяться скидка, в списке категорий и запоминаем ее id(пусть это будет 9).
- Выполняем следующий SQL-запрос:
1 2 3 |
UPDATE `jos_vm_product` |
После выполнения этого запроса всем товарам категории c id=9 будет задана скидка с id=1.
5. Изменить валюту для всех товаров
Если требуется изменить валюту сразу для всех товаров магазина на рубли, выполняем запрос:
1 2 |
UPDATE `jos_vm_product_price` |
6. Изменить шаблон страницы категории
Если у вас сотня категорий и вам требуется изменить у каждой из них шаблон browse_1 на, например, browse_2, то вручную вам придется открывать каждую из категорий и делать это. SQL-запрос же сделает это за доли секунд:
1 2 |
UPDATE `jos_vm_category` |
7. Изменить шаблон flypage категории
Случай аналогичен предыдущему, только требуется изменить шаблон страницы товара flypage.tpl на flypage_images.tpl:
1 2 |
UPDATE `jos_vm_category` |
На этом остановлюсь. Понимая язык SQL даже на базовом уровне, вы можете делать за минуту работу, которая при использовании админки заняла бы у вас час. Если вы написали SQL-запрос для решения еще какой-нибудь задачи, пожалуйста, поделитесь им в комментариях(для вставки запроса используйте тег [CODE][/CODE]).
------------
В связи с 6-летием хостинг-компания Inferno Solutions предлагает администрируемый сервер в Германии Core2Quad Q9550 4x2.83 Ghz + 8GB RAM + 2x500GB HDD + 5000Gb bw + 100Mbit - по СУПЕР цене 99$! Помощь в переезде прилагается.
SQL-запрос:
-- -- Дамп данных таблицы Ошибка
Ответ MySQL:
#1062 - Duplicate entry '1' for key 'PRIMARY' "
В чем причина?
Чтобы можно было автоматически опубликовать все товары? А то иногда это очень важно
UPDATE `jos_vm_product`
SET `product_publish`= 'Y'
Например: имеем товар - холодильники. Производители - Самсунг, Норд, Снайге и т.д.
Нужно изменить цену холодильников производителя Норд не зацепив остальных производителей.
я пробовал составить такой запрос на основе изменения цены категории товара, указывая id категории и id производителя, но не получилось. На форумах тоже не нашел подсказки.
SET product_thumb_image =(
SELECT DISTINCT
jos_vm_category.category_thumb_image
FROM
jos_vm_category ,
jos_vm_product_category_xref
WHERE
jos_vm_product_category_xref.category_id = jos_vm_category.category_id
AND jos_vm_product_category_xref.product_id=jos_vm_product.product_id
AND jos_vm_product.product_thumb_image is NULL
)
UPDATE ИМЯ_ТАБЛИЦЫ SET ИМЯ_ПОЛЯ = REPLACE(ИМЯ_ПОЛЯ, "строка для замены", "чем заменяем")
Попробовал заменить все содержимое текста с ru-RU.com_virtuemart.ini скопировал и вставил в en-GB.com_virtuemart.ini - теперь товары и категории на месте!
Но проблема с установленными модулями - их надписи отображаются на сайте очень коряво (как-бы просто англ. название модулей отображает на сайте с нижними черточками,типа "_ _").
Как с помощью SQL-запросов перенести все категории и товары в русскую версию или чтоб они появились при переключении на русский язык??? Спасибо!
Так всетаки придется все вручную вбивать? А не подскажите как это сделать ?
csv improved + Open оffice всем в помощь
1) не могу найти выход, как убрать на этой странице "http://www.mebel-interio.com/furniture" надписи: "Joomla Fashion Store
We offer a full range of services from interior design to the build and management projects."
уже все перерыл, но безуспешно.
ща попробую через Ttlcmd
Joomla Fashion Store
We offer a full range of services from interior design to the build and management projects.
1) эти несколько тысяч товаров должны иметь одинаковый сопутствующий товар?
2) эти несколько тысяч товаров объединяет какой-то общий признак(например, общая категория)?
WHERE product_scu='общий атрибут'. В этом случае будут затронуты только строки, для которых выполняется это условие
Будьте любезны - помогите с составлением запроса для изменения наличия всех товаров в виртуемарт.
Поле - product_in_stock
Сейчас в наличии - 0. А нужно - 1000.
1) В админке, в менеджере валют, найдите валюту, которую необходимо установить и запишите ее ID.
2) Сделайте резервную копию базы данных.
3) В PHPMyAdmin выполните SQL-запрос:
А подскажите как составить запрос на VM2 правильно, чтобы изменить валюту в поле цена только в отдельных категориях товаров, а не везде?
Вот так?:
WHERE `category_id`='id категории где нужно изменить валюту в поле цена'
UPDATE `g4vem_virtuemart_product_prices`
SET `product_currency`= ID_требуемой_валюты
UPDATE `имя БД_virtuemart_product_prices`
SET `product_currency`= ID_валюты
WHERE `virtuemart_product_id`IN(IDтовара1, IDтовара2,...)
Лимита значений для одновременной замены не знаю, у меня было ок 200
Что именно вам требуется? Опишите подробно. Я предложу вариант.
#__{vm}_product
Спасибо
это префикс таблиц БД Joomla, который вы указываете при установке Joomla. Для каждого сайта он будет свой, потому в запросах указывается так. Если делаете запрос напрямую в базу не через Joomla, то нужно указывать ваш уникальный префикс.
тоже самое, но для таблиц VM.
Не могли бы Вы подсказать - как добавить категорию товара в уведомлении о заказе?
Вопрос решен, если каждый товат - только в своей категории.
Однако... Если товар указан в нескольких категориях - он дублируется в заказе, столько раз, в скольких категориях этот товар присутствует. Кратно повторяется количество и цена!
- Товар 1 Цена
Категория А
- Товар 1 Цена
Категория В
Цена вычисляется дважды:
Промежуточный итог - складывает все повторы.
Итого: правильная сумма, без дублей повторов.
Как оставить в заказе обе категории, но без дублирования товара, а категории - просто перечислением?
Или, просто убрать дубли, получить в заказе ту Категорию, в которой выбран товар.
Решение - в запросе нужно использовать left join на категории. Как правильно прописать код?
Подробнее - на дружественном форуме.
http://joomlaforum.ru/index.php/topic,216036.0.html
Ссылку можете удалить, она только для Вас.
В базе данных также ничего менять не нужно, но это с тем условием, что все ссылки, которые у вас добавлены в статьях(в том числе и на картинки), имеют относительные адреса.
Если в базе все-таки есть абсолютные адреса, то экспортируйте дамп базы данных, откройте его через Notepad++ или другой продвинутый редактор и поиском/заменой по файлу замените все вхождения старого домена на новый. После этого импортируйте дамп обратно.