Virtuemart 2: Оптимизация Category

На данный момент в разработке интернет-магазин Virtuemart2 с интеграцией . Решил посмотреть на запросы виртмала и ужаснулся. Грандиозная утечка в БД. Как можно ради того что бы узнать Media изображение категории дополнительно обращаться к базе данных? Я в шоке. Это же все делается в том же запросе категорий. Капец, до сих пор успокоиться не могу.

Логики разработчиков если честно не прослеживаю. Может конечно это функционал на будущее развитие проекта, но мне все равно не понятно для чего это. В общем в магазине порядком 150 категорий и что бы вытянуть для них картинки движок дополнительно делает 150 запросов к БД. ЗАЧЕМ? В общем поплевав в монитор решил убить (оптимизировать) это чудо.

Открываем administrator/components/com_virtuemart/models/category.php ищем функцию getChildCategoryList примерно 120 строка
$query запрос

$query = 'SELECT L.* FROM `#__virtuemart_categories_'.VMLANG.'` as L
			JOIN `#__virtuemart_categories` as C using (`virtuemart_category_id`)';
$query .= ' LEFT JOIN `#__virtuemart_category_categories` as CC on C.`virtuemart_category_id` = CC.`category_child_id`';
$query .= 'WHERE CC.`category_parent_id` = ' . (int)$virtuemart_category_id . ' ';
$query .= 'AND C.`virtuemart_vendor_id` = ' . (int)$vendorId . ' ';
$query .= 'AND C.`published` = 1 ';
$query .= ' ORDER BY C.`ordering`, L.`'.$selectedOrdering.'` '.$orderDir;

меняем на

$query = 'SELECT L.*, M.virtuemart_media_id as virtuemart_media_id FROM `#__virtuemart_categories_'.VMLANG.'` as L
			JOIN `#__virtuemart_categories` as C using (`virtuemart_category_id`)';
$query .= ' LEFT JOIN `#__virtuemart_category_categories` as CC on C.`virtuemart_category_id` = CC.`category_child_id`';
$query .= ' LEFT JOIN `#__virtuemart_category_medias` as M on M.`virtuemart_category_id` = C.`virtuemart_category_id`';
$query .= 'WHERE CC.`category_parent_id` = ' . (int)$virtuemart_category_id . ' ';
$query .= 'AND C.`virtuemart_vendor_id` = ' . (int)$vendorId . ' ';
$query .= 'AND C.`published` = 1 ';
$query .= ' ORDER BY C.`ordering`, L.`'.$selectedOrdering.'` '.$orderDir;

и удаляем конструкцию foreach для перебора массива

if(!empty($childList)){
	if(!class_exists('TableCategory_medias'))require(JPATH_VM_ADMINISTRATOR.DS.'tables'.DS.'category_medias.php');
	foreach($childList as $child){
		$xrefTable = new TableCategory_medias($db);
 		//$xrefTable = $this->getTable('category_medias');
		$child->virtuemart_media_id = $xrefTable->load($child->virtuemart_category_id);
	}
}  

Ну вот как то так уменьшил количество запросов к базе данных вдвое!

  • Все конечно замечательно, но перестал отображаться каталог и главная страница магазина (((
  • потому что статья краденная
  • job
    да что ты говоришь. покажи источник
  • https://www.nulled.cc/threads/244883/
  • job
    Я не против, если мои заметки помогают другим. Посмотри дату поста. а это так для убедительности (оригинальные тексты яндекс вебмастера) https://yadi.sk/i/pNldLNSskN7vt Кстати да, надо вернуться к схеме добавления в оригинальные тексты яндекса. Спасибо, что напомнил )))
  • пожалуйста, только не работает не на localhost не на самом сайте. на локал 404 ошибка, на сайте как пишет человек снизу
  • job
    ну если человек не понимает что делает, зачем вообще туда лезть? Это заметка для тех кто понимает, что изменяя запрос, меняется объект вывода, что за собой тянет много зависимостей. Описывать дальнейшие действия не вижу смысла. Любой программист который задался вопросом оптимизации поймет что делать дальше. Если действительно нужна помощь, в таком древнем виртмале, напиши в скайп (jobgomel) помогу с этим вопросом.