Ну тогда попробую описать как делал и что, если будет нипанятна - спрашивайте.
Итак. Задача №1 - добавить в таблицу
jos_vm_waiting_list необходимое пользователю количество товара.
Так как мне тут никто не ответил, как передать переменную в waiting_list - я это сделал через переменную сессии.
файл /administrator/components/com_virtuemart/classes/ps_cart.php
Меняем блок:
if( vmIsXHR() ) {
$GLOBALS['vm_mainframe']->scriptRedirect( $sess->url( 'index.php?page=shop.waiting_list&product_id='.$product_id, true, false ) );
} else {
vmRedirect( $sess->url( 'index.php?page=shop.waiting_list&product_id='.$product_id, true, false ) );
}
}
на:
if( vmIsXHR() ) {
$_SESSION['kolichestvo'] = $request['quantity'];
$GLOBALS['vm_mainframe']->scriptRedirect( $sess->url( 'index.php?page=shop.waiting_list&product_id='.$product_id, true, false ) );
} else {
$_SESSION['kolichestvo'] = $request['quantity'];
vmRedirect( $sess->url( 'index.php?page=shop.waiting_list&product_id='.$product_id, true, false ) );
}
}
Далее переходим в файл
zw_waiting_list.php в той-же директории
Меняем блок:
function add(&$d) {
global $auth;
$db = new ps_DB;
$q = "INSERT INTO #__{vm}_waiting_list (product_id, user_id, notify_email, pcs)";
$q .= " VALUES ('";
$q .= $d["product_id"] . "','";
$q .= $auth['user_id'] . "','";
$q .= $d["notify_email"] . "')";
$db->query($q);
$db->next_record();
return True;
}
На такой
function add(&$d) {
global $auth;
$db = new ps_DB;
$q = "INSERT INTO #__{vm}_waiting_list (product_id, user_id, notify_email, pcs)";
$q .= " VALUES ('";
$q .= $d["product_id"] . "','";
$q .= $auth['user_id'] . "','";
$q .= $d["notify_email"] . "','";
$q .= $_SESSION['kolichestvo'] . "')";
$db->query($q);
$db->next_record();
unset ($_SESSION['kolichestvo']);
return True;
}
ВАЖНО! ПЕРЕД ОСТАЛЬНЫМИ ШАГАМИ! Зайдите в таблицу jos_vm_waiting_list и добавьте поле pcs!Теперь у нас в базу будет заноситься не только какой товар нужен пользователю, а и его количество.
Можем проверить. закажите у себя товара больше, чем есть в наличии, оставьте имэйл, зайдите в таблицу базы данных jos_vm_waiting_list и проверьте наличие количества.
Если товара вообще нет в наличии, то в поле
pcs будет ставиться единица.
2. Необходимо выполнять проверку наличия товара хотябы раз в день. При этом не важно как вы обновите количество... через админку или через CSVI! Пишем для этого отдельный скрипт wait.php такого содержания (перед запуском скрипта создайте папку
flag в корне сайта):
<?php
$date = date("d.m.Y");
$file_name = '(физический путь на сервере к Вашему сайту)/flag/waiting-'.$date; // Флаг отработки скрипта. Как работает - дальше.
if (@fopen($file_name, "r"))
{
// Если флаг есть - скрипт ничего не выполняет. Имя флага включает в себя текущую дату.
}
else
{
touch($file_name); // если флага нету - создаём. Это означает, что сегодня скрипт уже отработал. Больше он запускаться не будет.
// Модуль подключения базы данных
if (!mysql_connect('(имя сервера)', '(имя пользователя)', '(пароль)'))
{
echo "ERROR ".mysql_errno()." ".mysql_error()."\n";
exit;
}
mysql_select_db(имя базы данных);
// конец модуля подключения базы данных
$waiting_list = mysql_query("SELECT * FROM jos_vm_waiting_list WHERE notified='0'"); // выбираем все записи с невыполненным статусом
if (mysql_num_rows($waiting_list)>0)
{
for ($c=0; $c<mysql_num_rows($waiting_list); $c++)
{
$list_array=mysql_fetch_array($waiting_list);
$tovar = mysql_query("SELECT * FROM jos_vm_product WHERE product_id='$list_array[product_id]'");
if (mysql_num_rows($tovar)>0)
{
for ($k=0; $k<mysql_num_rows($tovar); $k++)
{
$tovar_array=mysql_fetch_array($tovar);
if ($tovar_array[product_in_stock]>=$list_array[pcs]) // если наличие на складе больше или равно чем заказанное пользователем
{
mysql_query("UPDATE jos_vm_waiting_list SET notified='1' WHERE waiting_list_id='$list_array[waiting_list_id]'"); // ставим статус Выполнено (тоесть // пользователь уведомлён)
$to = $list_array[notify_email] ; // формируем почтовое уведомление
$subject = "Тема письма";
$subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject, "w","k")).'?='; // преобразование в людскую кодировку для почтовиков
// формируем текст письма. на свой вкус. тут просто пример.
$message = '
<html>
<head>
<title>Интересующие Вас позиции</title>
</head>
<body>
<p> '.$tovar_array[product_name].' есть на складе в количестве '.$tovar_array[product_in_stock].' шт.</p>
<p>Если Ваша заявка на этот товар ещё актуальна - посетите наш сайт или свяжитесь с менеджерами нашего магазина.</p>
</body>
</html>';
$headers = "Content-type: text/html; charset=windows-1251 \r\n";
$headers .= "From: Магазин <info@магазин.com.ua>\r\n";
$headers .= "Bcc: info@магазин.com.ua\r\n";
mail($to, $subject, $message, $headers);
}
}
}
}
}
}
?>
И вызываем выполнение этого скрипта (если хотите чтобы уведомления рассылались автоматически) в основном файле index.php
Ну вот и всё.
Может немного коряво, но я не претендую на звание лучшего кодера Joomla
Поэтому сделал так, как мне необходимо, и оно работает.
Если есть предложения по улучшению кода - с удовольствием выслушаю
PS. Версия Joomla 1.5.17, версия Virtuemart: VirtueMart 1.1.4 stable