Jeśli znalazłeś:
Kod PHP:
echo shopFunctionsF::renderVmSubLayout($this->productsLayout,array('products'=>$this->products,'currency'=>$this->currency,'products_per_row'=>$this->perRow,'showRating'=>$this->showRating)); 
To znaczy że szablon szuka sublayots z których VM korzysta do wygenerowania widoku pojedynczego produktu w widoku kategorii.

Sublayots - to bardzo fajna sprawa w VMie. Działa to w taki sposób że, jak zmodyfikujesz sobie przycisk 'Dodaj do koszyka', albo wyświetlanie cen produktu. To wystarczy dokonać takiej modyfikacji w jednym miejscu, sublayots odpowiedzialnym za przycisk 'Dodaj do koszyka' albo za ceny. Jeśli szablon i nadpisywanie trzyma się tej konwencji, to zmieniając w jednym miejscu 'Dodaj do koszyka' zmieni Ci się to w każdym produkcie, w widoku kategorii, w modułach itd.

Powyższy kod PHP wczytuje sublayouts z:
Kod:
components\com_virtuemart\sublayouts\products.php
U mnie ten plik wygląda następiująco:
Kod PHP:
<?php
/**
 * sublayout products
 *
 * @package    VirtueMart
 * @author Max Milbers
 * @link http://www.virtuemart.net
 * @copyright Copyright (c) 2014 VirtueMart Team. All rights reserved.
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL2, see LICENSE.php
 * @version $Id: cart.php 7682 2014-02-26 17:07:20Z Milbo $
 */

defined('_JEXEC') or die('Restricted access');
$products_per_row = empty($viewData['products_per_row'])? 1:$viewData['products_per_row'] ;
$currency $viewData['currency'];
$showRating $viewData['showRating'];
$verticalseparator " vertical-separator";
echo 
shopFunctionsF::renderVmSubLayout('askrecomjs');

$ItemidStr '';
$Itemid shopFunctionsF::getLastVisitedItemId();
if(!empty(
$Itemid)){
   
$ItemidStr '&Itemid='.$Itemid;
}


foreach (
$viewData['products'] as $type => $products ) {

   
$rowsHeight shopFunctionsF::calculateProductRowsHeights($products,$currency,$products_per_row);

   if(!empty(
$type) and count($products)>0){
      
$productTitle vmText::_('COM_VIRTUEMART_'.strtoupper($type).'_PRODUCT'); ?>
<div class="<?php echo $type ?>-view">
  <h4><?php echo $productTitle ?></h4>
      <?php // Start the Output
    
} else if(count($viewData['products'])>and count($products)>0){
    
$productTitle vmText::_('COM_VIRTUEMART_'.strtoupper($type).'_PRODUCT'); ?>
<div class="<?php echo $type ?>-view">
  <h4><?php echo $productTitle ?></h4><?php
    
}

   
// Calculating Products Per Row
   
$cellwidth ' width'.floor 100 $products_per_row );

   
$BrowseTotalProducts count($products);

   
$col 1;
   
$nb 1;
   
$row 1;

   foreach ( 
$products as $product ) {
      if(!
is_object($product) or empty($product->link)) {
         
//vmdebug('$product',$product);
         
continue;
      }
      
// Show the horizontal seperator
      
if ($col == && $nb $products_per_row) { ?>
   <div class="horizontal-separator"></div>
      <?php }

      
// this is an indicator wether a row needs to be opened or not
      
if ($col == 1) { ?>
   <div class="row">
      <?php }

      
// Show the vertical seperator
      
if ($nb == $products_per_row or $nb $products_per_row == 0) {
         
$show_vertical_separator ' ';
      } else {
         
$show_vertical_separator $verticalseparator;
      }

    
// Show Products ?>
   <div class="product vm-col<?php echo ' vm-col-' $products_per_row $show_vertical_separator ?>">
      <div class="spacer product-container">
         <div class="vm-product-media-container">

               <a title="<?php echo $product->product_name ?>" href="<?php echo $product->link.$ItemidStr?>">
                  <?php
                  
echo $product->images[0]->displayMediaThumb('class="browseProductImage"'false);
                  
?>
               </a>

         </div>

         <div class="vm-product-rating-container">
            <?php echo shopFunctionsF::renderVmSubLayout('rating',array('showRating'=>$showRating'product'=>$product));
            if ( 
VmConfig::get ('display_stock'1)) { ?>
               <span class="vmicon vm2-<?php echo $product->stock->stock_level ?>" title="<?php echo $product->stock->stock_tip ?>"></span>
            <?php }
            echo 
shopFunctionsF::renderVmSubLayout('stockhandle',array('product'=>$product));
            
?>
         </div>


            <div class="vm-product-descr-container-<?php echo $rowsHeight[$row]['product_s_desc'?>">
               <h2><?php echo JHtml::link ($product->link.$ItemidStr$product->product_name); ?></h2>
               <?php if(!empty($rowsHeight[$row]['product_s_desc'])){
               
?>
               <p class="product_s_desc">
                  <?php // Product Short Description
                  
if (!empty($product->product_s_desc)) {
                     echo 
shopFunctionsF::limitStringByWord ($product->product_s_desc60' ...'?>
                  <?php ?>
               </p>
         <?php  ?>
            </div>


         <?php //echo $rowsHeight[$row]['price'] ?>
         <div class="vm3pr-<?php echo $rowsHeight[$row]['price'?>"> <?php
            
echo shopFunctionsF::renderVmSubLayout('prices',array('product'=>$product,'currency'=>$currency)); ?>
            <div class="clear"></div>
         </div>
         <?php //echo $rowsHeight[$row]['customs'] ?>
         <div class="vm3pr-<?php echo $rowsHeight[$row]['customfields'?>"> <?php
            
echo shopFunctionsF::renderVmSubLayout('addtocart',array('product'=>$product,'rowHeights'=>$rowsHeight[$row], 'position' => array('ontop''addtocart'))); ?>
         </div>

         <div class="vm-details-button">
            <?php // Product Details Button
            
$link = empty($product->link)? $product->canonical:$product->link;
            echo 
JHtml::link($link.$ItemidStr,vmText::'COM_VIRTUEMART_PRODUCT_DETAILS' ), array ('title' => $product->product_name'class' => 'product-details' ) );
            
//echo JHtml::link ( JRoute::_ ( 'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $product->virtuemart_product_id . '&virtuemart_category_id=' . $product->virtuemart_category_id , FALSE), vmText::_ ( 'COM_VIRTUEMART_PRODUCT_DETAILS' ), array ('title' => $product->product_name, 'class' => 'product-details' ) );
            
?>
         </div>

      </div>
   </div>

   <?php
    $nb 
++;

      
// Do we need to close the current row now?
      
if ($col == $products_per_row || $nb>$BrowseTotalProducts) { ?>
    <div class="clear"></div>
  </div>
      <?php
       $col 
1;
      
$row++;
    } else {
      
$col ++;
    }
  }

      if(!empty(
$type)and count($products)>0){
        
// Do we need a final closing row tag?
        //if ($col != 1) {
      
?>
    <div class="clear"></div>
  </div>
    <?php
    
// }
    
}
  }
A w miniatura z linkiem to kod:
Kod PHP:
<div class="vm-product-media-container">

      <a title="<?php echo $product->product_name ?>" href="<?php echo $product->link.$ItemidStr?>">
         <?php
         
echo $product->images[0]->displayMediaThumb('class="browseProductImage"'false);
         
?>
      </a>

</div>
Zobacz jak to u Ciebie wygląda, i kombinuj ;) Nie jest to aż tak strasznie skomplikowane - poradzisz sobie na pewno.
PS. Możesz podejrzeć oryginalne pliki VMa, bo oryginalnie miniatura kieruje na stronę produktu ;)