Новости Joomla

Компания JetBrains рассказала о своей поддержке Joomla

Компания JetBrains рассказала о своей поддержке Joomla

Компания JetBrains рассказала о своей поддержке Joomla.JetBrains - один из мировых лидеров в разработке программного обеспечения для разработчиков. Её программные продукты - это IDE - профессиональные среды разработки, которые отличаются от простого блокнота/редактора с плагинами набором всевозможных инструментов для разработчиков, глубоким анализом кодовой базы, подсказками по ней и по языку программирования, отладкой ошибок и многим-многим другим. Одним из самых известных продуктов компании является IDE PHP Storm, который можно назвать отраслевым стандартом PHP-разработчика. В статье How PhpStorm Helps Maintain PHP Open-Source Projects: Interviews and Real-World Examples в блоге компании описываются Open Source проекты, которым JetBrains оказывает поддержку (это могут быть бесплатные лицензии для разработчиков для некоммерческих проектов). В список попали:- PHPUnit - фреймворк для unit-тестирования в PHP- Doctrine DBAL - библиотека для PHP, которая предоставляет лёгкий и гибкий слой для коммуникации с базой данных. Она поддерживает различные базы данных через единый и согласованный API.- CodeIgniter — популярный MVC-фреймворк для разработки на PHP- 👩‍💻 Joomla! - наша любимая CMS.Эти названия (кроме "Joomla") чаще всего не слышат вебмастера и разработчики обычных сайтов и интернет-магазинов. Но эти названия хорошо знакомы PHP-разработчикам, которые создают сложные и высоконагруженные проекты и микросервисы. То, что Joomla оказалась в одном ряду с такими программными инструментами - делает ей честь. 🙏 За ссылку спасибо участнику нашего сообщества Ринату Кажетову (@rkazhet). @joomlafeed#joomla #community

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

👩‍💻 Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1. Это релиз, в который включены уже проверенные изменения, но ещё очень многие исправления и улучшения ждут своей очереди. Joomla следит за качеством и безопасностью своего кода и каждое изменение должно быть успешно протестировано как минимум ещё двумя участниками сообщества. Разработка Joomla ведётся на платформе GitHub.Филипп Уолтон (Philip Walton) - один из разработчиков, кто активно вносит свой вклад в ядро Joomla. Он уже несколько месяцев посвящает свои послеполуденные часы пятницы работе с Joomla и предлагает присоединиться к нему. 📆 Пятница, 30 мая 2025, с 15:00 до 17:00 по UTC (Лондон) - с 18:00 до 20:00 по Москве.В чате Google Meet Филипп готов помочь с тестированием тем, кто будет делать это в первый раз. А так же он подготовил список лёгких Pull Request, которые можно протестировать довольно быстро. Чем больше тестов будет проведено сейчас, тем меньше ошибок вылезет потом. На данный момент 148 (уже 147 на момент написания заметки) PR на GitHub Joomla ждут тестирования.👩‍💻 Open to all. All together.Также вам поможет сделать первые шаги это видео.GitHub JoomlaДа, это вечер пятницы. Но тестирование занимает порой минут 15, а доброе дело сделано. Просто убедитесь, что разработчик чего-то не пропустил и всё работает как ожидается.#joomla #joomla6 #community

0 Пользователей и 1 Гость просматривают эту тему.
  • 6 Ответов
  • 3088 Просмотров
*

neGODnic

  • Захожу иногда
  • 140
  • 4 / 0
Появилась проблема сама по себе... не могу понять из-за чего. Модуль SJ Search Pro for VirtueMart работает через AJAX выводит сразу же товары на леты по 1 из совпадения ключа в поиске.
Суть такова: вводишь в поиск "ST-F" и он выдает сразу по 3 одинаковых ссылки, причем полностью одинаковых: картинки, цены и ссылки на товар.
Через 3 товара, выдает само собой следующий результат и тоже 3 штуки. Получается 6 ссылок из 2х товаров, что вообще не в какие ворота не лезет.

Из глобального, обновлял версию VM с 3,0,16 до 3,0,18, но не сделал бекап, грешу на это. Но может и что-то еще повлияло.
Помогите разобраться.
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
В обще это конечно код желательно посмотреть ...
Для начала Отключите КЕШ.
*

neGODnic

  • Захожу иногда
  • 140
  • 4 / 0
Кэш отключен везде.
В общем вроде нашел куда копать. В штатной поставке идет фаил /modules/mod_sj_vm_search_pro/core/helper.php но он не видит таблицы ru_ru нашел хак и добавил след. строки в него.
Добавил код для понимая русского языка строка 30 $search_name = urldecode($search_name);   
Заменил таблицу для поиска строка 39 с #__virtuemart_products_en_gb на #__virtuemart_products_ru_ru

И суть в том что если я ввожу в поиск наименование товаров из КвикСтарта то они выводятся по 1 шт. А вот если из выгруженных то по 3.

Добавил товару из квиксарт в наименование общий параметр для поиска 123... и в моих товарах он есть... В Аяксе выводит 1 товар из квикстарта, и созданные по 3... Все.. Ступор!
Код
<?php
/**
 * @package SJ Search Pro for VirtueMart
 * @version 2.0.0
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 * @copyright (c) 2014 YouTech Company. All Rights Reserved.
 * @author YouTech Company http://www.smartaddons.com
 */
defined ('_JEXEC') or die;

ini_set ('xdebug.var_display_max_depth',20);
ini_set ('xdebug.var_display_max_children',1024);
ini_set ('xdebug.var_display_max_data',4096);
require_once dirname(__FILE__).'/helper_base.php';
require_once dirname (__FILE__).'/vmloader.php';
class VmSearchProHelper extends SjVmSearchProBaseHelper
{
protected $_params;
protected $_module;
protected $categories = null;
public function getList(){
$categories = array();
if ($this->vm_require()) {
$categories = $this->getCategories();
}
return $categories;
}
public function _autocomplete($search_category_id,$search_name, $params)
{
$search_name = urldecode($search_name);
VmConfig::loadJLang('com_virtuemart', true);
VmConfig::loadConfig();

$list = array();
$limitation = (int)$params->get('limit',8);
$source_group = null;
$catids = ($search_category_id == 0 ? 0 : $search_category_id);

$query = ' * , pp.product_price FROM `#__virtuemart_products_ru_ru` p LEFT JOIN #__virtuemart_product_prices pp ON p.virtuemart_product_id = pp.virtuemart_product_id';

if($search_category_id != 0)
{
$query .= " LEFT JOIN `#__virtuemart_product_categories` pc ON (p.virtuemart_product_id = pc.virtuemart_product_id) WHERE pc.virtuemart_category_id = ".$search_category_id." AND p.product_name LIKE '%".$search_name."%'";
}else{
$query .= " WHERE p.product_name LIKE '%".$search_name."%'";
}
//$source_group = null;
$productModel = VmModel::getModel('Product');
//$productModel = new VirtuemartModelProductExtend();
$items = $productModel->exeSortSearchListQuery (0,$query,'','','','','',$limitation);
if($limitation == 0){
$productModel->_noLimit = true;
}
else{
$productModel->_noLimit = false;

}
//$productModel->addImages($items,1);
$ratingModel = VmModel::getModel('ratings');
$small_image_config = array(
'type' => $params->get('imgcfg_type'),
'width' => $params->get('imgcfg_width'),
'height' => $params->get('imgcfg_height'),
'quality' => 90,
'function' => ($params->get('imgcfg_function') == 'none')? null : 'resize',
'function_mode' => ($params->get('imgcfg_function') == 'none')? null : substr($params->get('imgcfg_function'), 7),
'transparency' => $params->get('imgcfg_transparency', 1)? true : false,
'background' => $params->get('imgcfg_background')
);
if (!class_exists('CurrencyDisplay'))
require(VMPATH_ADMIN . DS . 'helpers' . DS . 'currencydisplay.php');
$currency = CurrencyDisplay::getInstance( );
foreach($items as $item){

$virtuemart_product_id = $item->virtuemart_product_id;
$quantity = 1;
$product_info = $productModel->getProduct($virtuemart_product_id,TRUE,TRUE,TRUE,$quantity);
$productModel->addImages($product_info);
$item_img = VmSearchProHelper::getVmImage($product_info, $params);
$image = VmSearchProHelper::imageTag($item_img, $small_image_config);
$salesPrice = "";
$discountAmount = "";
if (!empty($product_info->prices['salesPrice'])) {
$salesPrice = $currency->createPriceDiv ('salesPrice', JText::_("SALES_PRICE"), $product_info->prices, false, false, 1.0);
}
if (!empty($product_info->prices['discountAmount'])) {
$discountAmount = $currency->createPriceDiv('discountAmount', JText::_("DISCOUNT_AMOUNT"), $product_info->prices, false, false, 1.0);
}
$list[] = array(
'name' => $item->product_name,
'product_id' => $item->virtuemart_product_id,
'salesPrice' => $salesPrice,
'discountAmount' => $discountAmount,
'image' => $image,
'link' => JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=' . $product_info->virtuemart_category_id.'&virtuemart_product_id=' . $product_info->virtuemart_product_id.'&keyword='.$search_name.''),
'category_name' => $product_info->category_name,

);
}
die (json_encode ($list));
}
protected function vm_require()
{
if (!class_exists('VmConfig')) {
if (file_exists(JPATH_ADMINISTRATOR . '/components/com_virtuemart/helpers/config.php')) {
require JPATH_ADMINISTRATOR . '/components/com_virtuemart/helpers/config.php';
} else {
$this->error = 'Could not find VmConfig helper';
return false;
}
}
if (!class_exists('VmModel')) {
if (defined('JPATH_VM_ADMINISTRATOR') && file_exists(JPATH_VM_ADMINISTRATOR . '/helpers/vmmodel.php')) {
require JPATH_VM_ADMINISTRATOR . '/helpers/vmmodel.php';
} else {
$this->error = 'Could not find VmModel helper';
return false;
}
}
if (defined('JPATH_VM_ADMINISTRATOR')) {
JTable::addIncludePath(JPATH_VM_ADMINISTRATOR . '/tables');
}
return true;
}
protected function getCategories()
{
if (is_null($this->categories)) {
$this->categories = array();
VmConfig::loadJLang('com_virtuemart', true);
VmConfig::loadConfig();
$categoryModel = VmModel::getModel('category');
$categoryModel->_noLimit = true;
$categories = $categoryModel->getCategories(true, false, false, "", true);
if (!count($categories)) return $this->categories;
$_categories = array();
$_children = array();
foreach ($categories as $i => $category) {
$_categories[$category->virtuemart_category_id] = &$categories[$i];
}
foreach ($categories as $i => $category) {
$cid = $category->virtuemart_category_id;
$pid = $category->category_parent_id;
if (isset($_categories[$pid])) {
if (!isset($_children[$pid])) {
$_children[$pid] = array();
}
$_children[$pid][$cid] = $cid;
}
}
if (!count($_categories)) return $this->categories;

$__categories = array();
$__levels = array();
foreach ($_categories as $cid => $category) {
$pid = $category->category_parent_id;
if (!isset($_categories[$pid])) {
$queue = array($cid);
$_categories[$cid]->level = 1;
while (count($queue) > 0) {
$qid = array_shift($queue);
$__categories[$qid] = &$_categories[$qid];
if (isset($_children[$qid])) {
foreach ($_children[$qid] as $child) {
$_categories[$child]->level = $_categories[$qid]->level + 1;
array_push($queue, $child);
}
}
}
}
}
$this->categories = $__categories;
}
return $this->categories;
}


}
if (!class_exists('VirtuemartModelProductExtend') && class_exists('VirtueMartModelProduct')) {
    class VirtuemartModelProductExtend extends VirtueMartModelProduct
    {
        function sortSearchListQuery($onlyPublished = TRUE, $virtuemart_category_id = FALSE, $group = FALSE, $nbrReturnProducts = FALSE, $langFields = Array())
        {
            $app = JFactory::getApplication();
            $groupBy = ' group by p.`virtuemart_product_id` ';
            $joinCategory = FALSE;
            $joinMf = FALSE;
            $joinPrice = FALSE;
            $joinCustom = FALSE;
            $joinShopper = FALSE;
            $joinChildren = FALSE;
            $joinLang = TRUE;
            $orderBy = ' ';

            $where = array();
            $useCore = TRUE;
            if ($useCore) {
                $isSite = $app->isSite();
                if ($onlyPublished) {
                    $where[] = ' p.`published`="1" ';
                }
                if ($isSite and !VmConfig::get('use_as_catalog', 0)) {
                    if (VmConfig::get('stockhandle', 'none') == 'disableit_children') {
                        $where[] = ' (p.`product_in_stock` - p.`product_ordered` >"0" OR children.`product_in_stock` - children.`product_ordered` > "0") ';
                        $joinChildren = TRUE;
                    } else if (VmConfig::get('stockhandle', 'none') == 'disableit') {
                        $where[] = ' p.`product_in_stock` - p.`product_ordered` >"0" ';
                    }
                }

                if ($virtuemart_category_id !== false) {
                    $joinCategory = TRUE;

                    if (is_string($virtuemart_category_id) && preg_match('/[\s|,]+/', $virtuemart_category_id)) {
                        $virtuemart_category_id = preg_split('/[\s|,]+/', $virtuemart_category_id);
                    }
                    if (!is_array($virtuemart_category_id)) {
                        settype($virtuemart_category_id, 'array');
                    }

                    $where[] = ' `pc`.`virtuemart_category_id` IN (' . implode(',', $virtuemart_category_id). ')';

                }

                if ($isSite and !VmConfig::get('show_uncat_child_products', TRUE)) {
                    $joinCategory = TRUE;
                    $where[] = ' `pc`.`virtuemart_category_id` > 0 ';
                }

                if ($this->product_parent_id) {
                    $where[] = ' p.`product_parent_id` = ' . $this->product_parent_id;
                }

                if ($isSite) {
                    $usermodel = VmModel::getModel('user');
                    $currentVMuser = $usermodel->getUser();
                    $virtuemart_shoppergroup_ids = (array)$currentVMuser->shopper_groups;

                    if (is_array($virtuemart_shoppergroup_ids)) {
                        $sgrgroups = array();
                        foreach ($virtuemart_shoppergroup_ids as $key => $virtuemart_shoppergroup_id) {
                            $sgrgroups[] = 's.`virtuemart_shoppergroup_id`= "' . (int)$virtuemart_shoppergroup_id . '" ';
                        }
                        $sgrgroups[] = 's.`virtuemart_shoppergroup_id` IS NULL ';
                        $where[] = " ( " . implode(' OR ', $sgrgroups). " ) ";

                        $joinShopper = TRUE;
                    }
                }

                if ($this->virtuemart_manufacturer_id) {
                    $joinMf = TRUE;
                    $where[] = ' `#__virtuemart_product_manufacturers`.`virtuemart_manufacturer_id` = ' . $this->virtuemart_manufacturer_id;
                }

                switch ($this->specail_product) {
                    case 'hide':
                        $where[] = ' p.`product_special`="0" ';
                        break;

                    case 'only':
                        $where[] = ' p.`product_special`="1" ';
                        break;

                    case 'show':
                    default:
                        break;
                }

                $this->filter_order_Dir = $this->ordering_direction;

                if ($this->filter_order) {
                    switch ($this->filter_order) {
                        default:
                        case 'id':
                            $orderBy = ' ORDER BY p.`virtuemart_product_id` ';
                            break;
                        case 'ordering':
                            $orderBy = ' ORDER BY `pc`.`ordering` ';
                            $joinCategory = TRUE;
                            break;
                        case 'product_name':
                            $orderBy = ' ORDER BY l.`product_name` ';
                            $joinPrice = TRUE;
                            break;
                        case 'product_price':
                            $orderBy = ' ORDER BY pp.`product_price` ';
                            $joinPrice = TRUE;
                            break;
                        case 'created_on':
                            $orderBy = ' ORDER BY p.`created_on` ';
                            break;
                        case 'latest':
                            $orderBy = 'ORDER BY p.`modified_on`';
                            break;
                        case 'topten':
                            $orderBy = ' ORDER BY p.`product_sales` ';
                            $where[] = 'pp.`product_price`>"0.0" ';
                            break;
                    }
                    $joinPrice = TRUE;
                }
                if ($group) {
                    $groupBy = 'group by p.`virtuemart_product_id` ';
                }
            }

            if ($joinLang) {
                $select = ' l.`virtuemart_product_id` FROM `#__virtuemart_products_' . VMLANG . '` as l';
                $joinedTables = ' JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`)';
            } else {
                $select = ' p.`virtuemart_product_id` FROM `#__virtuemart_products` as p';
                $joinedTables = '';
            }

            if ($joinCategory == TRUE) {
                $joinedTables .= ' LEFT JOIN `#__virtuemart_product_categories` as pc ON p.`virtuemart_product_id` = `pc`.`virtuemart_product_id`
LEFT JOIN `#__virtuemart_categories_' . VMLANG . '` as c ON c.`virtuemart_category_id` = `pc`.`virtuemart_category_id`';
            }
            if ($joinMf == TRUE) {
                $joinedTables .= ' LEFT JOIN `#__virtuemart_product_manufacturers` ON p.`virtuemart_product_id` = `#__virtuemart_product_manufacturers`.`virtuemart_product_id`
LEFT JOIN `#__virtuemart_manufacturers_' . VMLANG . '` as m ON m.`virtuemart_manufacturer_id` = `#__virtuemart_product_manufacturers`.`virtuemart_manufacturer_id` ';
            }

            if ($joinPrice == TRUE) {
                $joinedTables .= ' LEFT JOIN `#__virtuemart_product_prices` as pp ON p.`virtuemart_product_id` = pp.`virtuemart_product_id` ';
            }
            if ($this->searchcustoms) {
                $joinedTables .= ' LEFT JOIN `#__virtuemart_product_customfields` as pf ON p.`virtuemart_product_id` = pf.`virtuemart_product_id` ';
            }
            if ($this->searchplugin !== 0) {
                if (!empty($PluginJoinTables)) {
                    $plgName = $PluginJoinTables[0];
                    $joinedTables .= ' LEFT JOIN `#__virtuemart_product_custom_plg_' . $plgName . '` as ' . $plgName . ' ON ' . $plgName . '.`virtuemart_product_id` = p.`virtuemart_product_id` ';
                }
            }
            if ($joinShopper == TRUE) {
                $joinedTables .= ' LEFT JOIN `#__virtuemart_product_shoppergroups` ON p.`virtuemart_product_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_product_id`
LEFT  OUTER JOIN `#__virtuemart_shoppergroups` as s ON s.`virtuemart_shoppergroup_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_shoppergroup_id`';
            }

            if ($joinChildren) {
                $joinedTables .= ' LEFT OUTER JOIN `#__virtuemart_products` children ON p.`virtuemart_product_id` = children.`product_parent_id` ';
            }

            if (count($where) > 0) {
                $whereString = ' WHERE (' . implode(' AND ', $where). ') ';
            } else {
                $whereString = '';
            }

            //$this->orderByString = $orderBy;
            $product_ids = $this->_exeSortSearchListQuery(2, $select, $joinedTables, $whereString, $groupBy, $orderBy, $this->filter_order_Dir, $nbrReturnProducts);
            return $product_ids;

        }

        public function _exeSortSearchListQuery($object, $select, $joinedTables, $whereString = '', $groupBy = '', $orderBy = '', $filter_order_Dir = '', $nbrReturnProducts = false){

            $db = JFactory::getDbo();
            //and the where conditions
            $joinedTables .="\n".$whereString."\n".$groupBy."\n".$orderBy.' '.$filter_order_Dir ;
            //$joinedTables .= $whereString .$groupBy .$orderBy .$filter_order_Dir ;
            // $joinedTables .= $whereString .$groupBy .$orderBy;

            if($nbrReturnProducts){
                $limitStart = 0;
                $limit = $nbrReturnProducts;
                $this->_withCount = false;
            } else if($this->_noLimit){
                $this->_withCount = false;
                $limitStart = 0;
                $limit = 0;
            } else {
                $limits = $this->setPaginationLimits();
                $limitStart = $limits[0];
                $limit = $limits[1];
            }

            if($this->_withCount){
                $q = 'SELECT SQL_CALC_FOUND_ROWS '.$select.$joinedTables;
            } else {
                $q = 'SELECT '.$select.$joinedTables;
            }
            $app = JFactory::getApplication();
            //$page = $app->input->getInt('page',1);
            $_count = $nbrReturnProducts;
            $start = $app->input->getInt('ajax_reslisting_start',0);
            $limitStart = $start;
            $limit = $_count;
            if($this->_noLimit or empty($limit)){
                $db->setQuery($q);
            } else {
                $db->setQuery($q,$limitStart,$limit);
            }

            if($object == 2){
                $this->ids = $db->loadColumn();
            } else if($object == 1 ){
                $this->ids = $db->loadAssocList();
            } else {
                $this->ids = $db->loadObjectList();
            }
            if($err=$db->getErrorMsg()){
                vmError('exeSortSearchListQuery '.$err);
            }
            //vmdebug('my $limitStart '.$limitStart.'  $limit '.$limit.' q '.$db->getQuery() );

            if($this->_withCount){

                $db->setQuery('SELECT FOUND_ROWS()');
                $count = $db->loadResult();

                if($count == false){
                    $count = 0;
                }
                $this->_total = $count;
                if($limitStart>=$count){
                    if(empty($limit)){
                        $limit = 1.0;
                    }
                    $limitStart = floor($count/$limit);
                    $db->setQuery($q,$limitStart,$limit);
                    if($object == 2){
                        $this->ids = $db->loadColumn();
                    } else if($object == 1 ){
                        $this->ids = $db->loadAssocList();
                    } else {
                        $this->ids = $db->loadObjectList();
                    }
                }
// $this->getPagination(true);

            } else {
                $this->_withCount = true;
            }

            //print_r( $db->_sql );
            // vmdebug('my $list',$list);
            if(empty($this->ids)){
                $errors = $db->getErrorMsg();
                if( !empty( $errors)){
                    vmdebug('exeSortSearchListQuery error in class '.get_class($this).' sql:',$db->getErrorMsg());
                }
                if($object == 2 or $object == 1){
                    $this->ids = array();
                }
            }
            // vmTime('exeSortSearchListQuery SQL_CALC_FOUND_ROWS','exe');

            return $this->ids;

        }

    }
}

Понял в чем проблема! У товаров из Квикстарта по умолчанию одна цена. А в моих 3 цены. Вот он видимо все 3 цены и пытается показать, но т.к. цена для для группы своя, выводит одну цену у всех 3 товаров.
Если товар имеет несколько цен, то в поиске и будет выводится такое же кол-во копий товаров сколько у него и цен. Как исправить, что бы выводился только один товар, принадлежащей к той группе и с той ценой к которой относится покупатель?
Я так понимаю что нужно добавить дополнительный запрос на проверку к группе покупателей. Но не знаю как это сделать.

Помогите в решении! Очень нужно.
« Последнее редактирование: 19.10.2016, 13:14:23 от neGODnic »
*

dj_serg

  • Захожу иногда
  • 98
  • 2 / 0
У меня тоже проблема с этим модулем, только он у меня не ищет, в выдаче получаю список категорий  с картинками, кто знает ка решить проблему и как сдлеать чтоб результат выдавался сразу через AJAX
*

Litop

  • Захожу иногда
  • 52
  • 4 / 0
  • Joomla не использую! В Virtuemart не шарю!
... Поставить Universal AJAX Live Search  и радоваться. Я пока от smartaddons толковых модулей которые без *напильника* работают не встречал. В каждом конкретном случае нужно в код смотреть, что бы ошибки найти.
*

viper_demyan

  • Осваиваюсь на форуме
  • 18
  • 0 / 0
Если товар имеет несколько цен, то в поиске и будет выводится такое же кол-во копий товаров сколько у него и цен. Как исправить, что бы выводился только один товар, принадлежащей к той группе и с той ценой к которой относится покупатель?



Такая же штука. Только выставлена цена в зависимости от количества. Если три цены то один и тот же товар трижды показывает подряд. Как-то решили эту проблему? Ктото может подсказать как мож в php прописать чтоб брал только одну цену. Стандартную
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Скачать - Управление товарами в VirtueMart - в таблиц

Автор gartes

Ответов: 45
Просмотров: 12006
Последний ответ 17.05.2023, 14:53:27
от mansonfaust
Плагин поиска Virtuemat по настраиваемым полям

Автор SolopoV

Ответов: 3
Просмотров: 2126
Последний ответ 13.02.2023, 20:37:39
от sivers
как изменить цену всем товарам в VirtueMart 3 ?

Автор ShamilHan

Ответов: 5
Просмотров: 3933
Последний ответ 11.03.2022, 21:12:37
от Zeobr
AJAX поиск для VirtueMart 3.x (Скачать)

Автор gartes

Ответов: 19
Просмотров: 8802
Последний ответ 06.10.2021, 16:49:54
от skrepka22
Переменные VirtueMart или где макет страницы "Спасибо за заказ!"?

Автор indigo

Ответов: 21
Просмотров: 15205
Последний ответ 06.01.2021, 20:21:03
от Akeksandr