Тэг ‘virtuemart’

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  |  Нет комментариев »

Импорт 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  |  Нет комментариев »

Импорт 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  |  Комментарии (2) »

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 );

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

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