Rashp Опубликовано 18.08.2026 в 17:12 Поделиться Опубликовано 18.08.2026 в 17:12 Парни, доброго времени суток, подскажите пожалуйста, хочу прописать чтобы invoice_no был = order_id при оформлении заказа, но 1. правильно ли вписал? 2. не будет ли коллапса при одновременном оформлении заказа? Сборка ocstore 3.0.2. Заранее спасибо. /catalog/model/checkout/order.php $order_id = $this->db->getLastId(); //сразу после $this->db->query("UPDATE `" . DB_PREFIX . "order` SET invoice_no = '" . (int)$order_id . "' WHERE order_id = '" . (int)$order_id . "'"); 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
the88788 Опубликовано 23.09.2026 в 14:57 Поделиться Опубликовано 23.09.2026 в 14:57 Если ID заказа получен через тот же запрос к базе сразу после INSERT, конкурентные заказы не должны подменить это значение. Второй UPDATE допустим, но лучше сразу записать invoice_no из известного ID заказа и проверить, не создаёт ли другая модификация собственную нумерацию. Отдельно стоит решить, нужно ли заполнять поле у старых заказов. 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
nikifalex Опубликовано 2.10.2026 в 06:50 Поделиться Опубликовано 2.10.2026 в 06:50 Твой код рабочий. getLastId() берёт mysqli->insert_id, а он привязан к соединению, поэтому при одновременном оформлении заказов каждый получит свой ID, путаницы не будет. Но я бы сделал иначе: 1. Не править ядро, а повесить событие. addOrder правят многие модули через OCMOD (быстрые заказы, CRM, обмен с 1С). Правка в ядре может конфликтовать с ними и слетит при обновлении. В OC 3 / ocStore 3 на это есть событие catalog/model/checkout/order/addOrder/after, и в $output приходит готовый order_id. catalog/controller/extension/module/invoice_eq_order.php: <?php class ControllerExtensionModuleInvoiceEqOrder extends Controller { public function setInvoice(&$route, &$args, &$output) { $order_id = (int)$output; if ($order_id) { $this->db->query("UPDATE `" . DB_PREFIX . "order` SET invoice_no = '" . $order_id . "' WHERE order_id = '" . $order_id . "' AND invoice_no = 0"); } } } Регистрация (в install() модуля или одним разом): $this->load->model('setting/event'); $this->model_setting_event->addEvent('invoice_eq_order', 'catalog/model/checkout/order/addOrder/after', 'extension/module/invoice_eq_order/setInvoice'); 2. Подумай, в какой момент присваивать номер. addOrder срабатывает уже на шаге подтверждения, когда заказ ещё в статусе 0. Брошенные и неоплаченные заказы тоже получат счёт, и в нумерации счетов появятся дыры. Если счёт нужен только по реальным заказам, вешай событие на catalog/model/checkout/order/addOrderHistory/after. Там order_id лежит в $args[0], а $args[1] — новый статус. Номер ставь, когда статус входит в config_processing_status / config_complete_status. 3. Префикс. В админке счёт выводится как invoice_prefix + invoice_no, по умолчанию получится INV-2026-00123. Если нужен просто номер заказа, очисти префикс в настройках магазина. Он сохраняется в заказ при создании, так что у старых заказов останется прежний. 4. Кнопка «Сгенерировать» в админке. Она показывается только при invoice_no = 0, поэтому у новых заказов её не будет и стандартный createInvoiceNo() (MAX+1) их не перебьёт. 5. Старые заказы, если нужно их выровнять: UPDATE oc_order SET invoice_no = order_id WHERE invoice_no = 0 AND order_status_id > 0; 1 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.