У меня было подготовлено одно поле товар отсутствует (его я добавлял сам его нет в стандартном функционале vm как добавить дополнительное поле к товару читайте здесь) Назовем его “product_of”.

Задача: Сделать сортировку в списке товаров категории virtuemat-a таким образом что бы первыми выводились товары в наличии и по самой низкой цене. Соответственно товары которых нет выводятся последними.

Файлы:
administrator/components/com_virtuemart/html/shop.browse.php
administrator/components/com_virtuemart/html/shop_browse_queries.php
/administrator/components/com_virtuemart/virtuemart.cfg.php
/administrator/components/com_virtuemart/html/admin.show_cfg.php
components/com_virtuemart/themes/default/templates/browse/includes/browse_orderbyfields.tpl.php
administrator/components/com_virtuemart/languages/common/russian.php

В файле administrator/components/com_virtuemart/html/shop_browse_queries.php находим код

switch( $orderby ) {
	case 'product_list':
		$orderbyField = '`#__{vm}_product_category_xref`.`product_list`'; break;
	case 'product_name':
		$orderbyField = '`#__{vm}_product`.`product_name`'; break;
	case 'product_price':
		$orderbyField = '`#__{vm}_product_price`.`product_price`'; break;
	case 'product_sku':
		$orderbyField = '`#__{vm}_product`.`product_sku`'; break;
	case 'product_cdate':
		$orderbyField = '`#__{vm}_product`.`cdate`'; break;

И после него вставляем

case 'product_of':
		$orderbyField = '`#__{vm}_product`.`product_of`, `product_price`'; break;

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

В файле /administrator/components/com_virtuemart/virtuemart.cfg.php

Находим код

/* OrderByFields */
global $VM_BROWSE_ORDERBY_FIELDS;
$VM_BROWSE_ORDERBY_FIELDS = array( 'product_name','product_price','product_cdate');

И заменим его на

/* OrderByFields */
global $VM_BROWSE_ORDERBY_FIELDS;
$VM_BROWSE_ORDERBY_FIELDS = array( 'product_name','product_price','product_cdate','product_of' );

и после

define('VM_REGISTRATION_TYPE', 'NO_REGISTRATION');

Добавим

define('VM_BROWSE_ORDERBY_FIELD', 'product_of');

В файле /administrator/components/com_virtuemart/html/admin.show_cfg.php находим код

<input name="conf_VM_BROWSE_ORDERBY_FIELDS[]" type="checkbox" value="product_sku" <?php if (in_array( 'product_sku', $VM_BROWSE_ORDERBY_FIELDS )) echo "checked=\"checked\""; ?> id="conf_VM_BROWSE_ORDERBY_FIELDS4" />
                        <label for="conf_VM_BROWSE_ORDERBY_FIELDS4"><?php echo $VM_LANG->_('PHPSHOP_CART_SKU') ?></label>

После него добавляем

<input name="conf_VM_BROWSE_ORDERBY_FIELDS[]" type="checkbox" value="product_of" <?php if (in_array( 'product_of', $VM_BROWSE_ORDERBY_FIELDS )) echo "checked=\"checked\""; ?> id="conf_VM_BROWSE_ORDERBY_FIELDS4" />
                        <label for="conf_VM_BROWSE_ORDERBY_FIELDS4"><?php echo $VM_LANG->_('PHPSHOP_CART_OF') ?></label>

Находим код

<option value="product_cdate" <?php if (@VM_BROWSE_ORDERBY_FIELD == 'product_cdate') echo "selected=\"selected\""; ?>><?php echo $VM_LANG->_('PHPSHOP_LATEST') ?></option>

После него добавляем

<option value="product_of" <?php if (@VM_BROWSE_ORDERBY_FIELD == 'product_of') echo "selected=\"selected\""; ?>><?php echo $VM_LANG->_('PHPSHOP_CART_OF') ?></option>

В файле components/com_virtuemart/themes/default/templates/browse/includes/browse_orderbyfields.tpl.php находим код

// SORT BY PRODUCT CREATION DATE
if( in_array( 'product_cdate', $VM_BROWSE_ORDERBY_FIELDS)) { ?>
        <option value="product_cdate" <?php echo $orderby=="product_cdate" ? "selected=\"selected\"" : "";?>>
        <?php echo $VM_LANG->_('PHPSHOP_LATEST') ?></option>

        <?php
}
?>

После него добавим

<?php if( in_array( 'product_of', $VM_BROWSE_ORDERBY_FIELDS)) { ?>
        <option value="product_of" <?php echo $orderby=="product_of" ? "selected=\"selected\"" : "";?>>
        <?php echo 'Товар отстутсвует' ?></option>
<?php
}
?>

В файле administrator/components/com_virtuemart/languages/common/russian.php добавить

'PHPSHOP_CART_OF' => 'Товар отсутствует',