При работе над одним интернет магазином возникла задача изменить номер заказа с ужасного варианта типа 7e8a031 на понятный и легкозапоминаемый числовой. Для этого открываем файл administrator/components/com_virtuemart/models/orders.php и в нем ищем функцию generateOrderNumber, которая отвечает за генерацию номера заказа. У меня в Virtuemart версии 2.0.8e это строка 973. Вот так выглядит оригинальная функция:
public function generateOrderNumber($uid = 0,$length=10, $virtuemart_vendor_id=1)
{
$db = JFactory::getDBO();
$q = 'SELECT COUNT(1) FROM #__virtuemart_orders WHERE `virtuemart_vendor_id`="'.$virtuemart_vendor_id.'"';
$db->setQuery($q);
//We can use that here, because the order_number is free to set, the invoice_number must often follow special rules
$count = $db->loadResult();
$count = $count + (int)VM_ORDER_OFFSET;
// vmdebug('my db creating ordernumber VM_ORDER_OFFSET '.VM_ORDER_OFFSET.' $count '.$count, $this->_db);
// $variable_fixed=sprintf("%06s",$num_rows);
$data = substr( md5( session_id().(string)time().(string)$uid )
,0
,$length
).'0'.$count;
return $data;
}
Было решено в качестве номера заказа использовать ключевое поле virtuemart_order_id таблицы #__virtuemart_orders — оно уникальное и подходит для нашей задачи. Осталось получить последнее значение этого поля и прибавить к нему единицу, получив таком образом идентификатор нового заказа. Но если заказы были удалены, то может возникнуть ситуация, когда новый virtuemart_order_id в таблице не будет равен последнему virtuemart_order_id, увеличенному на единицу. Поэтому для генерации нового номера заказа поступим так — получим последний virtuemart_order_id, прибавим к нему единицу и припишем справа секунды, когда заказ был оформлен. В конечном итоге функция будет выглядеть вот таким образом:
public function generateOrderNumber($uid = 0,$length=10, $virtuemart_vendor_id=1)
{
$db = JFactory::getDBO();
$q = 'SELECT `virtuemart_order_id` FROM #__virtuemart_orders ORDER BY `virtuemart_order_id` DESC LIMIT 1';
$db->setQuery($q);
$data = $db->loadAssoc();
$order_id = ($data['virtuemart_order_id']+1).date("s",time());
return (int)$order_id;
}
Если вдруг уважаемый посетитель заметит проблемы в этом решении — буду рад пообщаться в комментариях к посту.
9 комментариев: Номер заказа в VirtueMart