Перекрываем стандартные настройки JoomShopping правильно

Далеко не все настройки JoomShopping можно изменить в административной части сайта. Часть из них просто записана в файл по пути:
[домен]/components/com_jshopping/lib/default_config.php
Например, это список полей для сортировки товаров в категориях или имя файла изображения, которое используется по умолчанию, если основное изображение у категории, товара и т.д. не выбрано.
Конечно, можно просто изменить значение нужной переменной прямо в файле default_config.php и эти изменения сразу будут применены на сайте, но это явно не лучшее решение. Изменять системные файлы расширений или ядра CMS не лучшая практика. К тому же файл с настройками меняется и дополняется разработчиками JoomShopping довольно часто. В результате в одном из ближайших обновлений default_config.php будет перезаписан, а внесенные изменения будут утеряны. Как же изменить значения каких-либо стандартных настроек JoomShoppind без риска их потери?
Для начала обратимся к коду самого компонента JoomShopping и попробуем найти подключение конфигурационного файла default_config.php
. Поиски приводят в файл:
[домен]/components/com_jshopping/lib/factory.php
у которого есть статический метод getConfig()
, часть которого приведена ниже:
include(dirname(__FILE__)."/default_config.php"); if (file_exists(dirname(__FILE__)."/user_config.php")){ include(dirname(__FILE__)."/user_config.php"); }
Как видно, после подключения default_config.php
, функция getConfig()
проверяет наличие файла user_config.php
в той же директории, что и default_config.php
. Если такой файл найден, то осуществляется его подключение. Файл user_config.php
не входит в состав компонента JoomShopping именно для того, чтобы можно было создать его самостоятельно и не беспокоиться о том, что в каком-то обновлении этот файл будет перезаписан разработчиками JoomShopping.
В результате нужно создать файл:
[домен]/components/com_jshopping/lib/user_config.php
в котором можно смело изменить любые стандартные настройки JoomShopping.
Приведем несколько примеров перекрытия настроек JoomShopping, о которых упоминали выше. Часто возникает необходимость изменить настройку с именем noimage
, поскольку это имя файла изображения, которое используется, если в административной части сайта для категории, товара и т.д. изображения не выбраны. Особенно если учесть, что эта настройка по умолчанию имеет значение noimage.gif
, а этот формат не самый распространенный формат изображений для сайтов, поскольку уступает по качеству png и jpg.
Чтобы изменить значение этой настройки нужно добавить в файл user_config.php
строку:
$config->noimage = 'noimage.png';
При этом нужно разместить файл изображения noimage.png в следующих папках:
[домен]/components/com_jshopping/files/img_categories
[домен]/components/com_jshopping/files/img_manufs
[домен]/components/com_jshopping/files/img_products
[домен]/components/com_jshopping/files/img_vendors
Это изображение будет показано при отсутствии основного для категорий, производителей, товаров и поставщиков соответственно. В результате можно даже сделать разные изображения noimage.png
для категорий товаров и т.д. Например, с разными размерами, поскольку размеры изображений для категорий и списка товаров могут отличаться.
Еще один пример с изменение полей для сортировки товаров. Для отображения поля сортировки товаров на странице со списком товаров (например, страница категории, производителя, списка всех товаров JoomShopping и т.д.) нужно в настройках административной части JoomShopping установить флажок в разделе Товар напротив пункта Возможность сортировки товаров. При этом в верхней части шаблона появляется элемент управления полем и направлением сортировки. Набор этих полей определен именно в файле default_config.php
.
Если точнее, то есть два списка полей сортировки и два списка значений этих полей. На странице какой-любо категории товаров используется массив названий полей sorting_products_name_select
и массив их значений из sorting_products_field_select
. Для всех остальных страниц со списками товаров используются названия из sorting_products_name_s_select
и значения для сортировки из sorting_products_field_s_select
.
Это значит, что при выводе в шаблоне элемента select для выбора пользователем сортировки товаров, его значения в конечном счете берутся из конфига default_config.php
. В конфиге эта переменная имеет имя sorting_products_name_select
для страницы категории и sorting_products_name_s_select
для других страниц сайта со списком товаров и их сортировкой (например, для списка всех товаров или списка товаров конкретного производителя). Как видим в конфиге, значением этих переменных является массив. Например:
$config->sorting_products_name_select = array( 1=>_JSHOP_SORT_ALPH, 2=>_JSHOP_SORT_PRICE, 3=>_JSHOP_SORT_DATE, 5=>_JSHOP_SORT_RATING, 6=>_JSHOP_SORT_POPULAR, 4=>_JSHOP_SORT_MANUAL );
Массив состоит из индексов и языковых констант, которые в шаблоне будут выведены в соответствии с текущим языком сайта.
В результате пользователь выбирает один из вариантов сортировки. В сессии запоминается специальная переменная order
, в которой хранится индекс выбранного значения из массива. Например, если выбрать _JSHOP_SORT_DATE
, то в order запишется число 3.
А в процессе выборки списка товаров для отображения в шаблоне JoomShopping использует значение переменной order
для получения названия поля таблицы #__jshopping_products
. Для примера со страницей категории:
$config->sorting_products_field_select = array( 1=>'name', 2=>'prod.product_price', 3=>'prod.product_date_added', 5=>'prod.average_rating', 6=>'prod.hits', 4=>'pr_cat.product_ordering' );
А значит для значения 3 поле будет 'prod.product_date_added'
. Именно это поле подставляется в запрос в качестве значения для сортировки товаров.
Это дает нам возможность изменить эти списки в файле user_config.php
любым удобным образом. Можно убрать лишние поля, добавить новые или изменить их значения. При этом мы может без труда сортировать товары по любому из полей таблицы #__jshopping_products
. Например, по количеству товара на складе (prod.product_quantity
) или по количеству отзывов о товаре (prod.reviews_count
).
Конечно же, можно использовать в качестве полей для сортировки и такие, которые не находятся в таблице #__jshopping_products
. Однако для правильного решения такой задачи потребуется сделать отдельный плагин, что выходит за рамки темы данной статьи. Но для тех, кому очень захочется разобраться с этим вопросом, отметим с чего начать. Плагин желательно разместить в группе jshopping
(папка plugins/jshopping
) и добавить в него метод:
public function onBuildQueryOrderListProduct($order, $orderby, &$adv_from, &$order_query, $order_original) { ... }
в котором можно изменить запрос $order_query
и таблицы, из которых берутся поля $adv_from
.
Метки: Joomla!, JoomShopping