Итак, встала перед нами следующая проблема: компания торгует четырьмя группами товаров (назовем их условно "Группа 1, 2, 3, 4"), и у каждого клиента на каждую группу может быть своя индивидуальная скидка, в то время как VirtueMart 1.1.7a поддерживает только единую скидку на весь товар в магазине.
Что было сделано и допилино:
Через панель администрирования и пункта меню "Настройки" - "Управление полями, заполняемыми пользователем" добавляем четыре новых поля: discount_group_1, 2, 3, 4, тип — text. Префикс "vm" им присвоится автоматически.
Добавляем через phpMyAdmin в таблицу jos_vm_product поле product_group_id, тип varchar(1), где у каждого товара будет храниться код группы, к которой он принадлежит. Тут небольшая ремарка, каким образом это поле заполняется у нас. Выгрузка данных происходит в автоматическом или ручном режиме из 1С:Предприятие 8.1 с помощью самописной обработки в файл форма csv. Именно эта обработка, помимо основных данных о товаре, проверяет также, к какой группе он принадлежит, и выгружает в файл код этой группы (1, 2, 3 или 4). Файл автоматически отправляется по FTP на сайт, где по расписанию CRON выполняет скрипт загрузки или обновления данных в таблице товаров. Если наполнение и редактирование этой таблицы у вас происходит вручную, то нет никаких проблем добавить в админку возможность выводить/править и это дополнительное поле (гугл в помощь, как это сделать =) ).
Создаем отдельный скрипт, который перед выводом цены товара будет проверять его группу, а также скидку клиента на эту группу, если она есть. Вот его текст:
<?php
function check_discount ($product_id, $price){
//Вызываем встроенную функцию проверки залогинен ли пользователь
$user =& JFactory::getUser();
if ($user->guest) {
// Пользователь не залогигнен, просто возвращаем базовую цену товара
return $price;
} else {
// Пользователь залогинен, погнали проверять группы и скидки
// Получаем код группы, к которой принадлежит товар
$product_group_id = ps_product::get_field($product_id, "product_group_id");
// Делаем запрос к таблице с данными пользователя
$db = new ps_DB;
$q = "SELECT * FROM #__{vm}_user_info WHERE user_id='". $user->id . "'";
$db->query($q);
$db->next_record();
//Присваиваем переменным значения полей со скидками
$discount_group_1 = $db->f("vm_discount_group_1");
$discount_group_2 = $db->f("vm_discount_group_2");
$discount_group_3 = $db->f("vm_discount_group_3");
$discount_group_4 = $db->f("vm_discount_group_4");
// Проверяем, к какой группе принадлежит товар, и в соответствии с этим присваиваем переменной $skidka размер скидки по этой группе
switch ($product_group_id){
case 1:
$skidka = $discount_group_1;
break;
case 2:
$skidka = $discount_group_2;
break;
case 3:
$skidka = $discount_group_3;
break;
case 4:
$skidka = $discount_group_4;
break;
default:
$skidka = 0;
break;
}
// Теперь проверяем значение поля скидки, если в начале стоит "+", то наоборот делаем наценку на товар (бывает и такое, например, манагер клиента сидит на отстеге =) )
if (strstr($skidka, "+")){
str_replace("+", "", $skidka);
if (is_numeric($price)){
$price = round($price * (1 + $skidka / 100));
} else {
$price['product_price'] = round($price['product_price'] * (1 + $skidka / 100));
}
} else {
if (is_numeric($price)){
$price = round($price * (1 - $skidka / 100));
} else {
$price['product_price'] = round($price['product_price'] * (1 - $skidka / 100));
}
}
// Готово! Возвращаем пересчитанную со скидкой и округленную до рубля цену
return $price;
}
}
?>
Записываем этот скрипт под именем check_discount.php и кидаем в каталог administrator/components/com_virtuemart/classes/
Допиливаем под наши нужды функции в файле ps_product.php, который лежит в том же каталоге:
Ищем функцию get_price, которая возвращает цену товара, начинается она вот так:
function get_price($product_id, $check_multiple_prices=false, $overrideShopperGroup='' ) {
Сразу после этой строчки прописываем файл с нашей функцей проверки скидки:
require_once(CLASSPATH . 'check_discount.php' );
Идем в самый конец функции get_price, где она возвращает цену вот этой строчкой:
Добавляем перед ней вызов нашей функции проверки скидки:
$price = check_discount($product_id, $price);
Теперь нужно запретить пользователю возможность редактировать дополнительные поля со скидками, которые мы создали. В каталоге /administrator/components/com_virtuemart/html/ открываем файл account.billing.php, и ищем следующий блок:
// Handle NO_REGISTRATION
$skip_fields = array();
if ( VM_REGISTRATION_TYPE == 'NO_REGISTRATION' || VM_REGISTRATION_TYPE == 'OPTIONAL_REGISTRATION' && empty($d['register_account'])) {
global $default;
$default['email'] = $db->f('user_email');
$skip_fields = array( 'username', 'password', 'password2', );
}
Добавляем сразу после него:
//убираем показ этих полей независимо от настроек регистрации
$skip_fields = array( 'vm_discount_group_1', 'vm_discount_group_2', 'vm_discount_group_3', 'vm_discount_group_4' );
Бингонах! )))