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

Как можно сделать нумерацию заказов по порядку, но начиная не с 1, а, например, с 500?
Анастасия
10 апреля 2018, 20:31
modx.pro
3
3 598
0

Комментарии: 17

Володя
11 апреля 2018, 09:09
0
переопределить класс заказа

в нем переопределить метод getNum()

думаю достаточно поменять одну строчку
$num = date('ym') . '/0';
на
$num = date('ym') . '/500';

public function getNum()
    {
        $cur = date('ym');
        $num = 0;
        $c = $this->modx->newQuery('msOrder');
        $c->where(array('num:LIKE' => "{$cur}%"));
        $c->select('num');
        $c->sortby('id', 'DESC');
        $c->limit(1);
        if ($c->prepare() && $c->stmt->execute()) {
            $num = $c->stmt->fetchColumn();
        }
        if (empty($num)) {
            $num = date('ym') . '/500';
        }
        $num = explode('/', $num);
        $num = $cur . '/' . ($num[1] + 1);
        return $num;
    }
    Анастасия
    11 апреля 2018, 10:57
    0
    Имелось ввиду чтобы номера заказов были сквозные. То есть сейчас номер заказа это год месяц/порядковый номер в рамках месяца. Можно ли сделать, чтобы шло просто 500, 501, 502 и т.п. и не сбрасывалось при начале нового месяца
      Володя
      11 апреля 2018, 11:21
      0
      аналогично
      public function getNum()
          {
              $cur = date('ym');
              $num = 0;
              $c = $this->modx->newQuery('msOrder');
              $c->where(array('num:LIKE' => "{$cur}%"));
              $c->select('num');
              $c->sortby('id', 'DESC');
              $c->limit(1);
              if ($c->prepare() && $c->stmt->execute()) {
                  $num = $c->stmt->fetchColumn();
              }
              if (empty($num)) {
                  $num = '500';
              }
              $num = explode('/', $num);
              $num = end($num)  + 1;
              return $num;
          }
        Дима
        06 мая 2019, 23:39
        0
        Добрый вечер, пробовал сделать. Возникла проблема, в том, что номера заказов повторяются при оформлении. Например — оформил заказ, номер заказа — 1, оформил заказ еще раз — номер заказа 1 и т.д., в общем повторение идет.

        Нумерация также не работает из первого варианта, просто ничего не происходит при смене цифры.
          Станислав
          20 августа 2019, 16:15
          0
          Не работает так
            ElenaLelo
            20 августа 2019, 16:24
            0
            Попробуйте убрать строчку или поставьте сюда свой разделитель
            $num = explode('/', $num);
              Станислав
              20 августа 2019, 16:26
              0
              пробовал
                ElenaLelo
                20 августа 2019, 16:28
                0
                Тогда полный код давайте, соусы
                  Станислав
                  20 августа 2019, 16:29
                  0
                  public function getNum()
                      {
                          $cur = date('ym');
                          $num = 0;
                          $c = $this->modx->newQuery('msOrder');
                          $c->where(array('num:LIKE' => "{$cur}%"));
                          $c->select('num');
                          $c->sortby('id', 'DESC');
                          $c->limit(1);
                          if ($c->prepare() && $c->stmt->execute()) {
                              $num = $c->stmt->fetchColumn();
                          }
                          if (empty($num)) {
                              $num = '2864';
                          }
                          $num = end($num) + 1;
                          return $num;
                      }
                    ElenaLelo
                    20 августа 2019, 16:46
                    0
                    В вашем примере нужно просто скопировать код выше и изменить «500» на «2864», если же разделитель по умолчанию другой то вот пример:
                    if (empty($num)) {
                                $num = date('dm') . '-000';
                            }
                            $num = explode('-', $num);
                            $num = $cur . '-' . sprintf('%03d',($num[1] + 1));
                      Станислав
                      20 августа 2019, 16:57
                      0
                      я так и сделал, но он начинает с 1
                        ElenaLelo
                        20 августа 2019, 17:05
                        0
                        Проверьте еще раз, код/логи/консоль
                        public function getNum()
                            {
                                $cur = date('ym');
                                $num = 0;
                                $c = $this->modx->newQuery('msOrder');
                                $c->where(array('num:LIKE' => "{$cur}%"));
                                $c->select('num');
                                $c->sortby('id', 'DESC');
                                $c->limit(1);
                                if ($c->prepare() && $c->stmt->execute()) {
                                    $num = $c->stmt->fetchColumn();
                                }
                                if (empty($num)) {
                                    $num = '2864';
                                }
                                $num = explode('/', $num);
                                $num = end($num)  + 1;
                                return $num;
                            }
                        Станислав
                        20 августа 2019, 17:12
                        0
                        у меня срабатывает, проставляет 2865, но при повторном, снова 2865
                        skrinshoter.ru/s/200819/oBnYJvpZ?a
                      Андрей
                      08 января 2021, 16:37
                      0
                      Добрый день. Подскажите, а если вообще разделитель не нужен? пусть будет номер заказа и без слеша сразу месяц и год. Как сделать?
      Станислав
      20 августа 2019, 19:38
      +1
      Все оказалось просто
      {
              $num = 0;
              $c = $this->modx->newQuery('msOrder');
              $c->select('num');
              $c->sortby('id', 'DESC');
              $c->limit(1);
              if ($c->prepare() && $c->stmt->execute()) {
                  $num = $c->stmt->fetchColumn();
              }
              $num = $num + 1;
      
              return $num;
          }
        Станислав
        21 августа 2019, 19:29
        0
        при оплате через yandex кассу выдает ошибку
        Fatal error: Class 'msOrderHandler' not found in /core/components/minishop2/custom/cart/myOrderHandler.php on line 2
        сделано через кастомный класс и соотвтсвенно его не видит, что с этим делать?
          Станислав
          21 августа 2019, 19:57
          +1
          <?php
          
          if(!class_exists('msOrderHandler')) {
              require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msorderhandler.class.php';
          }
          
          class myOrderHandler extends msOrderHandler {
            public function getNum()
              {
                  $num = 0;
                  $c = $this->modx->newQuery('msOrder');
                  $c->select('num');
                  $c->sortby('id', 'DESC');
                  $c->limit(1);
                  if ($c->prepare() && $c->stmt->execute()) {
                      $num = $c->stmt->fetchColumn();
                  }
                  $num = $num + 1;
          
                  return $num;
              }
          }
          решение, может кому то пригодится
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            17