Номер заказа в VirtueMart

При работе над одним интернет магазином возникла задача изменить номер заказа с ужасного варианта типа 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;
}

Если вдруг уважаемый посетитель заметит проблемы в этом решении — буду рад пообщаться в комментариях к посту.

Меток нет. Похожие записи
Запись опубликована в рубрике Virtuemart. Добавьте в закладки постоянную ссылку.

9 комментариев: Номер заказа в VirtueMart

  1. Alex говорит:

    Замечательная статья, спасибо. Но как бы при этом сделать номер заказа чуть сложнее? У меня получается 4 символа, а хотелось бы 6 или 8. Что бы можно было избавиться от пароля к заказу и оставить только номер?

    • kumatoz говорит:

      К сожалению, сейчас нет под рукой сайта с VM. Но думаю вот так должно сработать

      $order_id = ($data['virtuemart_order_id']+1).date(«ms»,time());
      или
      $order_id = ($data['virtuemart_order_id']+1).date(«s»,time()).rand(1,99);
      если надо больше, то как-то так
      $order_id = ($data['virtuemart_order_id']+1).date(«s»,time()).rand(1,9999);

  2. Фредз говорит:

    Помогите пожалуйста, нужно сделать то же самое только сначала дата а потом номер заказа(id).

    • kumatoz говорит:

      Приветствую.
      Не совсем понял, что Вы хотите. Где нужна дата, а потом 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(«dmy»);
        return (int)$order_id;
        }
        __________________
        В данном примере сначала идет id а потом дата, не могу правильно поменять их местами (слаб в php).

        • kumatoz говорит:

          Строку $order_id = ($data['virtuemart_order_id']+1).date(«dmy»); замените на
          $order_id = date(«dmy»).($data['virtuemart_order_id']+1);

  3. bigtits говорит:

    Здравствуйте, нужно чтобы номера были по порядку и без доп цифр: даты, время и тд. Сейчас сделал, но после заказа №9999 идет заказ №1. Напишите пожалуйста как увеличить лимит на число заказа, желательно на семизначное число

  4. Артём говорит:

    Спасибо!! С такими, как Вы, товарищ, шаг за шагом строится «правильная» система магазина! :)

  5. Павел говорит:

    Спасибо добрый человек!!! В VM3 функция называется genStdOrderNumber, но суть та же!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>