Тэг ‘virtuemart’

vmcchk=1 - Virtuemart добавляет в конце URL vmcchk

В очередной раз порадовал Virtuemart - интернет магазин на Joomla. В этот раз красивые SEO-адреса были подпорчены непонятной припиской vmcchk=1 . Как и предпологалось из названия - это дело “рук” vm - virtuemart

Добавление этой переменной связано с проверкой Cookie у web-клиента (браузера т.е.). Чтобы убрать злостный vmcchk в конце УРЛ-ов следует подредактировать файл /classes/ps_session.php около 63 строки - проще всего закомментировать (в начале строки добавить // - двойной слэш)

if( @$_REQUEST['option'] == 'com_virtuemart' && USE_AS_CATALOGUE == '' ) {
$this->doCookieCheck(); // Introduced to check if the user-agent accepts cookies
}

Кроме того, не помешает для склейки страниц-дублей сделать 301 редирект на страницу без vmcchk

ps Что самое интересное, на форуме разработчиков склоняются к тому, чтобы убрать эту проверку, однако vmcchk до сих пор присутствует в URL-ах )))

Опубликовано Июнь 10, 2011 | автор: levik  |  Нет комментариев »

virtuemart при добавлении товара белый экран-пустая страница

При входе в форму добавления товара virtuemart радует белым экраном ( в браузер выводится пустой html-документ). Обычно является это признаком fatal error в PHP. Заглядываем в LOG-файл - действительно:

[error] PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 49 bytes) in …/includes/database.php on line 491

Итак, при выводе “пустой” страницы добавления товара скрипту не хватает памяти (32 МБ, конечно не так уж много, но куда??). Что самое интересное, при редактировании товара (страница та же, только установлен параметр product_id) ошибка не возникает. И ещё, раньше такого вроде не было.

В database.php на 491 строке ничего особо интересного нет - подсказка, что выводится LIST (чего - не совсем ясно)… Элементы “складируются” в массив.. и на очередном не хватает памяти.

Предварительная диагностика подсказывает, что “глюк” из-за большого количества товаров (~22 тыс). Протестировал с “обрезанной” до 7 тыс товаров - всё работает. И правда, в товарах проблема.

Смотрим в сторону файла с формой добавления/редактирования товара
administrator/components/com_virtuemart/html/product.product_form.php

Но как связана страница добавления/редактирования одного товара с количеством товаров? Точно! Есть ведь связанные товары.. Большой multiselect связанных товаров и правда содержит все записи.. однако он выводится и при редактировании товаров.. Странно.. но всякое бывает - проверяем (закомментировать строчку с выводом мультиселекта).. Ан нет.. не влияет.

Ладно.. пробуем по-другому ищем product_id (ведь для имеющегося товара все в порядке.. белый экран только при добавлении Нового товара). Из “сомнительных” (cомнительное в смысле без проверки на “корректность” product_id) мест использования этой переменной видим такое:

$db_items = $ps_product->items_sql($product_id);

После которого идет вывод формы с подстановкой значений.

Проверяем совсем наглым образом - убираем эту строку и последующие, и открываем страницу добавления товара - Открывается! :) Добавляем строку (без продолжения) - ошибка.

перейти к решению проблемы пустого экрана

Опубликовано Сентябрь 15, 2010 | автор: levik  |  Комментарий (1) »

open_basedir restriction in effect

Столкнулся с необычным проявлением ошибки open basedir restriction:

Warning: open_basedir restriction in effect.
File /path/to/file is not within the allowed path(s):
(/path/to/dir1:/path/to/dir2) in /path/to/dir/filename.php on line 385

Сообщение такого рода возникает при попытке обратиться к файлу, который расположен за пределами “разрешенных” для php каталогов. Настройки хостинга обычно не препятствуют открытию файлов в пределах “домашнего” каталога пользователя или корневого каталога сайта. Значение переменной php_value open_basedir изменяется в httpd.conf или в php.ini. В .htaccess значение open_basedir изменить нельзя!!!

Часто сообщение open_basedir restriction вызвано неправильной обработкой загруженных при помощи php файлов - использование функции copy, unlink, rename вместо правильного move_uploaded_file. Об особенностях использования функции move_uploaded_file более подробно можно прочитать тут

Однако, как оказалось, такая ошибка может возникать ещё и при использовании функции tempnam(string $dir, string $prefix), которая должна создавать временный файл в каталоге $dir, если же каталог не существует, то пытается создать этот файл во временном каталоге системы. Стоит также проверить каталог $dir на запись - в моем случае именно права на доступ к каталогу стали причиной ошибки open basedir restriction.

ps. обнаружил при работе с simple csv upload интернет-магазина на базе virtuemart

Опубликовано Февраль 5, 2010 | автор: levik  |  Комментарии (2) »

Virtuemart - скрываем пустые категории

При работе с интернет-магазином на базе Virtuemart после импорта из csv возможно появление пустых категорий, которые virtuemart не скрывает автоматически. Т.е. отображаются категории, в которых нет ни одного опубликованного товара (или вообще ни одного товара) - при заходе в такую категорию, естественно,  “ощущается пустота”.

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

В настройках Virtuemart (ни в глобальной конфигурации, ни в настройках категорий) пункта-галочки “скрывать пустые категории” (или отображать) я не нашел. Может плохо искал?

Как настроить virtuemart  чтобы он не показывал пустые категории?

Ничего более простого, как “опубликовывать только категории с товаром” я не придумал. Итак, проходим по категориям “снизу”, начиная с товаров, и .. опубликовываем их. Предварительно все категории распубликовываем. Если в магазине имеются умышленно скрытые категории (своеобразный склад временно неиспользуемых товаров), их можно просто добавить в исключения

Ближе к практике:

CREATE TEMPORARY TABLE `jos_tmp_category` (
`category_id` int(11) NOT NULL,
`lvl` int (2) not null,
PRIMARY KEY (`category_id`)
);

insert into `jos_tmp_category`
select distinct c.category_id, 1
FROM jos_vm_category c
INNER JOIN jos_vm_product_category_xref pc ON c.category_id = pc.category_id
INNER JOIN jos_vm_product p ON pc.product_id = p.product_id
WHERE p.product_publish = 'Y';

replace into `jos_tmp_category`
select distinct cc.category_parent_id, 2
FROM jos_vm_category_xref cc
inner join `jos_tmp_category` t
on t.category_id = cc.category_child_id and t.lvl=1;

replace into `jos_tmp_category`
select distinct cc.category_parent_id, 3
FROM jos_vm_category_xref cc
inner join `jos_tmp_category` t
on t.category_id = cc.category_child_id and t.lvl=2;

– …
– пока количество “затронутых” рядов перестанет изменяться

update jos_vm_category set category_publish='N';
update jos_vm_category set category_publish='Y'
where category_id in (select `category_id` from jos_tmp_category);

После таких запросов к базе virtuemart не будет отображать пустые категории (а если точнее, то пустые категории станут скрытыми). В универсальный хак-мод все это не переросло, а вот после “зашивания” в simple csv import сайт стал “скрывать категории” сразу после обновления товаров.

Опубликовано Ноябрь 4, 2009 | автор: levik  |  Комментарии (2) »

Импорт csv в virtuemart - Simple CSV (часть 2)

Не так давно публиковал заметку о реализации импорта csv в virtuemart

Когда потребовалось повторить установку “мода” Simple CSV - пока читал форум, забыл зачем пошел. :) На десяти страницах форума слишком много “воды” и повторяющихся вопросов. Решил собрать краткий ман-faq по мод-хаку  в одном месте. Может кому-нибудь окажется полезным.

Хак для версии virtuemart 1.0.*
Для более новых версий - см. CSVImproved http://joomlaforum.ru/index.php/topic,42648.msg407103.html#msg407103

http://joomlaforum.ru/index.php/topic,8340.msg87750.html#msg87750 - тут последняя (на дату написания поста) версия Simple CSV. Попутно стоит скачать примеры (на первой странице ветки), и учесть, что в файле параметров параметры надо называть не “Иглы;Размер иглы в СИ”, а просто “Размер иглы в СИ” - возможна ошибка при импорте. В секции товаров (!) в первой строке (заголовок) параметр должен называться  “Иглы;Размер иглы в СИ”.

В файле ps_simple_csv_aliases.php соответствия между заголовками импортируемого файла и полями в базе. Дополнительные поля могут не загружаться, так как в базу пишет функция Virtuemart’a - подправлять следует её.

Модифицировал галочку “проверять товары” (при включенной галочке - все товары, отсутствующие в загрузке “распубликовываются”) - сделал распубликование всех товаров перед загрузкой - запрос из нескольких тысяч in (,,,) почему-то не срабатывал..

Импорт атрибутов
В ps_simple_csv_aliases.php строчки
‘Атрибут’ => ‘attribute’,
‘Атрибут определенный нами’ => custom_attribute’,
на самом деле должны быть
‘Атрибут’ => ‘product_advanced_attribute’,
‘Атрибут определенный нами’ => ‘product_custom_attribute’,
Теперь буду мучать картинки =)

А как залить товар в несколько категорий?
Указать путь к категориям через запятую, или точку с запятой или палку. Смотря какой у вас разделитель данных. Стоит быть внимательным - добавляйте категории без пробелов - возможно “дублирование”/создание “лишних” категорий.

Категории, содержащие запятую (точку с запятой или вертикальную черту) могут грузиться как несколько категорий. Для того, чтобы избежать подобного “разделения одной категории”, в строке ~805 файла ps_simple_csv.php следует убрать или закомментировать ненужный разделитель..
if( !is_array($paths) ) $paths = explode(’,', $paths);

  Разделяем превьюшки и основные изображения по разным папкам: создаем нужный каталог (например resized) для и в csv пишем “resized/image1.jpg” и т.д.

Разные цены, в зависимости от количества товара:
А можно ли сделать чтобы отображалось 3 цены товара? При этом магазин у меня работает как каталог, т.е указать например, что при покупке 100 игл цена 600р, а при покупке 500 игл цена 580р, а при покупке 1000 игл цена 550р. Как это мне можно сделать думаю, что это можэно сделать через “Параметры товара”, я прав???
В версии 4 и ниже - если нужны именно цены, то сделать это можно через цены, а если просто для информаци, то через параметры можно. Через цены пока можно лишь разом загружать цены для разных групп, для возможности загружать цены и для разного количества товара - проверить в файле ps_simple_csv_aliases.php строку №123 заменить на:

'/Цена для группы "(.+?)"(?:(?:.*?)(\d+)(?:.*?)(\d+))?/' =>
'product_prices|shopper_group_name|price_quantity_start|price_quantity_end',

Для версии бета-5 добавлена возможность добавлять “сложные цены” в следующем формате

Цена для группы “<название группы покупателей, сначала это обычно -default->”[[что угодно]<число от>[что угодно]<число до>]

Правильно: Цена для группы “-default-” количество от 3 до 7
Неправильно: Цена для группы “-default-” количество от 3
Правильно: Цена для группы “-default-” 3 - 7
Правильно: Цена для группы “-default-”, 3 7
Правильно: Цена для группы “-default-
Если до много - пишем что-то вроде 3-99999 - http://joomlaforum.ru/index.php/topic,8340.msg89584.html#msg89584 - тут с примером разбора.

При загрузке двух колонок  (артикул, цена) - т.е. выгрузка используется только для обновления цен на сайте, следует подправить 883 строку файла на

if( $csv_data['manufacturer_id'] ) {

Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes) in - ошибка возникает при нехватке памяти скрипту. Следует уменьшать либо количество товаров в файле, либо по возможности убрать “лишнее” - описания, которые не меняются и подобное.

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

define( 'RG_EMULATION', 0 ); в файле globals.php

Несколько изображений в virtuemart - http://forum.virtuemart.net/index.php?topic=18473

Настройка разделителей по умолчанию - в product.simple_csv_upload.php
<input type="radio" name="csv_delimiter" checked="checked" value=";" />

Замеченные глюки с ценой:
- указание цены с пробелами;
- в меню “Информация о магазине” не выставлена валюта “валюта = рубль” - может повлиять на импорт цен;
- добавить в файл импорта поле product_currency с содержимым руб. (видимо, альтернатива предыдущему решению)

Сохраняем связанные товары  http://joomlaforum.ru/index.php/topic,8340.msg170587.html#msg170587

        // Присваиваем значения выборке из базы
        foreach( $csv_data as $key => $value ) {
          //if($db_data[$key]) $db_data[$key] = $value;
          $db_data[$key] = $value;
        }
		/*##my Додаю для того, аби супутні товари не затирались. Старт ##200802281852*/
		$q  = "SELECT related_products FROM #__{vm}_product_relations ";
		$q .= " WHERE product_id='".$db_data['product_id']."'";
		$db->query($q);
		if( $db->num_rows() ) {$db_data_related_products[] = $db->loadResult();}
		$db_data["related_products"]=$db_data_related_products;
		/* Кінець ##200802281852 */

Если у Вас возникли проблемы с установкой Simple CSV и вы их решили (или не решили) - отписывайтесь в комментариях или на форуме. При появлении новой информации пост по возможности (и желанию) буду обновлять.

Опубликовано Сентябрь 25, 2009 | автор: levik  |  Комментарии (5) »

Импорт csv в virtuemart для больших файлов

Virtuemart + joomla - неплохой и “бесплатный” инструмент для организации интернет-магазина. Для синхронизации, например с 1с (что требуется довольно часто), в virtuemart используется инструмент импорт-экспорт через CSV. Все бы ничего - после определенной настройки данные импортируются, но при солидных объемах магазина - несколько тысяч товаров в csv-файле, даже без описаний, скрипт импорта выполняется несколько минут. Площадки виртуального хостинга же, частенько, имеют ограничение на это самое время выполнения скрипта. Вот и получаем

Попытки прописать в .htaccess  php_value max_execution_time 600 (увеличить максимально разрешенное время скрипта до 600 секунд) не всегда приводят к желаемому результату, потому как довольно часто такая возможность блокируется хостером. Доступ к php.ini предоставляется далеко не всеми хостерами. Вопросы о возможности увеличения этого времени “в частном” или “в общем” порядке, в лучшем случае обычно заканчиваются предложением приобрести VPS..

Как вариант решения проблемы импорта больших файлов - разбиение CSV-файла на части, и загрузка каждой части в отдельности. Естественно, не забываем про служебную информацию (обычно - первая строка csv-файла)Размер частей подбирается опытным путем :) Однако, мягко говоря, вариант далеко не идеальный.

Поиски, как ни странно, показали, что такого рода проблемы не у меня одного, причем возникают они снова и снова. :) И, как ни странно, на многих форумах этот вопрос оставлен без ответа. При том, что решение, довольно изящное, разработано несколько лет назад пользователем tug на joomlaforum.ru

Модификация для нормальной загрузки через CSV - Simple CSV Import

Нормальная заливка это …:

* возможность заливать любые данные через CSV, т.е. товары, типы, параметры, категории, производителей, налоги, хуёги и пр.
* возможность прямо в csv указывать поля, которые нужно обрабатывать.
* когда в админке Вам нужно только указать файл и нажать “Upload”.
* возможность кастомизировать заливку и добавлять новые модули и не только для VirtueMart.

Особое внимание обратил на “только указать файл и нажать…”
Тех, кто торопится “в бой” - “поставить и забыть” - хочу предупредить, что на третьей странице лежит пятая бета-версия. Ставить лучше её. И, несмотря, на многостраничность темы, все же рекомендую ознакомиться.
Расписывать все прелести CSV-импорта от tug-а не буду. Стоит отметить, однако, что от старого доброго экспорта-импорта через csv отказываться не обязательно, они вполне могут существовать параллельно - своеобразный путь к отступлению…

upd.  Полезная информация по Simple CSV - краткая “выжимка” из 10 страниц топика на форуме. Если что упустил - поправляйте.

Опубликовано Май 13, 2009 | автор: levik  |  Комментарии (3) »

Virtuemart напильником

Волей судьбы пришлось бороться с Virtuemart’ом. Сразу хочу отметить, что бОльшая часть файлов находится в каталоге administrator/components/com_virtuemart/.

1. меню из каталога товаров стандартное (mod_virtuemart) слишком сильно грузит магазин. Альтернативный вариант решения - меню “ручками”. Т.е. делаем меню, пунктами которого становятся ссылки на категории нашего магазина.

2. главная страница магазина (html/shop.index.php), вывод категориий (classes/ps_product_category.php), шаблон вывода товаров в категории (html/templates/browse/browse_1.php - настраивается в административной части)

3. навигационная строка где-то тут:
$nav_list = $ps_product_category->get_navigation_list($category_id);
$mainframe->appendPathWay( $nav_list );

Seo и Virtuemart

В стандартной комплектации Virtuemart не предусмотрено размещение meta-keywords, meta description и title (автоматически подставляется в title название текущей категории).

Вариант с Joomla SEF и Virtuemart. Включить SEO, проверить наличие модуля apache mod_rewrite и переименовать htaccess.txt в .htaccess . Чтобы красивые адреса были и у страниц Virtuemart - следует скачать файл router.php с сайта Joomla Extentions и положить его в папку компонента Virtuemart.
http://joomlaplugins.net/joomla-extension-download/doc_details/1-search-engine-friendly-router.html
http://joomla-support.ru/thread15790.html

Хак VirtueMart + Meta тэги
http://joomlaforum.ru/index.php/topic,67328.0.html

VirtueMart SEO Plugin для ARTIO JoomSEF - вариант хороший, но платный. Есть мнение, что он стОит своих денег (все-таки плагин для магазина, для улучшения результатов торговли)

И, конечно же метод “костыля” работает…
administrator/components/com_virtuemart/html/shop.browse.php

Продолжение следует…

Чтобы убрать в ссылках строки вида component/virtuemart/10/2/ можно в главном меню создать пункт “Каталог” (например) и прописать к нему алиас catalog - вместо  component/virtuemart/ будет выводиться catalog

Опубликовано Октябрь 13, 2008 | автор: levik  |  Комментарий (1) »