Настройка компонента VirtueMart через index.php в Joomla: подробные примеры

Раздел: CMS -> Расширения Joomla

Как добавить собственные стили и скрипты только на страницах магазина VirtueMart?

Основной способ – модификация файла index.php активного шаблона Joomla. В этот файл добавляется проверка активного компонента, после чего подгружаются нужные ресурсы. Это позволяет избежать загрузки лишних файлов на других страницах сайта.


<?
defined('_JEXEC') or die;
$app = JFactory::getApplication();
$option = $app->input->get('option', '', 'CMD');
if ($option == 'com_virtuemart') {
    $doc = JFactory::getDocument();
    $doc->addStyleSheet(JURI::root() . 'templates/' . $app->getTemplate() . '/css/vm-custom.css');
    $doc->addScript(JURI::root() . 'templates/' . $app->getTemplate() . '/js/vm-custom.js');
}
?>

Index php virtuemart (настройка virtuemart в joomla через index.php)

Пояснение: код проверяет параметр option в URL. Если он равен com_virtuemart, то к документу добавляются CSS и JS файлы из папки текущего шаблона. Файлы должны быть предварительно созданы.

Типичные ошибки:

  • Путь к файлам указан неверно – проверьте наличие папок и самих файлов.
  • Забыто определение JEXEC – сайт может выдать ошибку.
  • Код размещён после вывода DOCTYPE – это нарушает стандарты. Его нужно вставлять в самом начале файла, до тега <html>.
  • Проверка не учитывает страницы модулей, которые могут выводиться на всех страницах. В таком случае следует расширить условие.

Как не редактировать index.php, а добиться того же эффекта с помощью плагина Joomla?

Альтернатива – создание системного плагина, который срабатывает на событие onBeforeCompileHead. Внутри плагина проверяется компонент, и добавляются ресурсы. Такой подход не требует изменений в шаблоне и сохраняет модификации при смене шаблона.


<?
class plgSystemVmLoad extends JPlugin
{
    public function onBeforeCompileHead()
    {
        $app = JFactory::getApplication();
        if ($app->input->get('option') !== 'com_virtuemart') return;
        $doc = JFactory::getDocument();
        $doc->addStyleSheet('templates/' . $app->getTemplate() . '/css/vm-custom.css');
    }
}
?>

Этот код размещается в файле плагина. После установки и включения плагина он будет работать на всех страницах магазина.

Проблемы: плагин может конфликтовать с кэшированием. Рекомендуется проверить работу с включенным кэшем страниц.

Как изменить глобальные настройки VirtueMart через index.php компонента?

Можно внести правки непосредственно в файл components/com_virtuemart/index.php. Однако это опасно: обновления расширения перезапишут изменения. Такой вариант подходит для отладки или временного решения, когда нужно установить определённые переменные до загрузки компонента.


<?
// В самом начале файла index.php компонента
defined('_JEXEC') or die;
// Принудительная установка значения конфигурации
VmConfig::set('enable_sef', 0);
?>

После обновления VirtueMart эти правки будут утеряны.

Ошибка: вызов VmConfig::set() до полной инициализации может привести к фатальной ошибке. Используйте только в крайнем случае.

Как через index.php шаблона управлять выводом модулей только в магазине?

Метод: добавить условие вокруг вызова модулей в файле шаблона. Например, скрыть модуль на страницах VirtueMart.


<?
defined('_JEXEC') or die;
$app = JFactory::getApplication();
$option = $app->input->get('option', '', 'CMD');
if ($option == 'com_virtuemart') :
    // выводим модуль только в магазине
    echo JModuleHelper::renderModule('mod_custom', array('style' => 'xhtml'));
endif;
?>

Такой же подход применим для показа разных модулей в разных разделах.

Ошибка: если модуль использует тот же компонент, но ID не совпадает – проверяйте также задачу (task) или вид (view).

Расширенные примеры кода для настройки VirtueMart через index.php

Ниже представлены менее распространённые, но полезные варианты использования index.php для тонкой настройки магазина.

Пример 1: Загрузка разных CSS в зависимости от представления (view) VirtueMart

Код проверяет не только компонент, но и параметр view:

Пример

<?
$app = JFactory::getApplication();
$option = $app->input->get('option', '', 'CMD');
$view = $app->input->get('view', '', 'CMD');
if ($option == 'com_virtuemart') {
    $doc = JFactory::getDocument();
    if ($view == 'category') {
        $doc->addStyleSheet('templates/' . $app->getTemplate() . '/css/vm-category.css');
    } elseif ($view == 'productdetails') {
        $doc->addStyleSheet('templates/' . $app->getTemplate() . '/css/vm-product.css');
    }
}
?>

Результат: на страницах категорий подгружается один CSS, на страницах товаров – другой.

Пример 2: Динамическое добавление мета-тегов для страниц товаров

Можно установить мета-описание из данных товара, если он уже загружен:

Пример

<?
$app = JFactory::getApplication();
$input = $app->input;
if ($input->get('option') == 'com_virtuemart' && $input->get('view') == 'productdetails') {
    $productId = $input->getInt('virtuemart_product_id', 0);
    if ($productId) {
        $product = VmModel::getModel('product')->getProduct($productId);
        if ($product && !empty($product->metadesc)) {
            $doc = JFactory::getDocument();
            $doc->setMetaData('description', $product->metadesc);
        }
    }
}
?>

Этот код устанавливает мета-описание страницы из данных товара. Результат – уникальный мета-тег для каждого продукта.

Пример 3: Переопределение стандартного шаблона VirtueMart через index.php

Иногда требуется временно заменить макет магазина. Можно задать альтернативный шаблон, установив переменную:

Пример

<?
// В index.php шаблона до вывода компонента
$app = JFactory::getApplication();
if ($app->input->get('option') == 'com_virtuemart') {
    // указываем папку с альтернативными шаблонами
    VmConfig::set('tpl_template', 'my_custom_vm_template');
}
?>

При этом в папке шаблона Joomla должна быть директория html/com_virtuemart/my_custom_vm_template с переопределёнными файлами.

Пример 4: Отладка – вывод всех параметров запроса на страницах магазина

Для быстрой отладки можно вывести массив параметров в консоль браузера или прямо на страницу:

Пример

<?
$app = JFactory::getApplication();
if ($app->input->get('option') == 'com_virtuemart') {
    $params = $app->input->getArray();
    echo '';
}
?>

Результат: скрытый блок с отладочной информацией, доступный через инспектор.

Пример 5: Использование JText для локализации строк в скриптах, добавляемых через index.php

Если нужно передать переведённые строки в JavaScript, можно воспользоваться JText::script():

Пример

<?
$app = JFactory::getApplication();
if ($app->input->get('option') == 'com_virtuemart') {
    JText::script('COM_VIRTUEMART_ADD_TO_CART');
    $doc = JFactory::getDocument();
    $doc->addScriptDeclaration("var addToCartText = Joomla.JText._('COM_VIRTUEMART_ADD_TO_CART');");
}
?>

Теперь внутри любого JavaScript-скрипта можно использовать переменную addToCartText с локализованным текстом.

Настройка VirtueMart в Joomla через index.php - comments

En
Index php virtuemart (php)