Kami Posted March 18 Report Share Posted March 18 (edited) Кто сталкивался с таким интересным подходом добавлять контрагентов? Кто то до меня придумал у клиента такую фичу, if(empty($order->user_id)) $order->user_id = $order->id; В целом костыль норм, но потом если человек регается и user_id совпадает с номером заказа, то происходит каша в контрагентах при выгрузке в Мой склад. Кто сталкивался и какое решение было оптимальным? Edited March 18 by Kami Quote Link to post Share on other sites
shooroop Posted March 18 Report Share Posted March 18 ну так добавте пару нулей перед номером заказа чтоб точно не совпадет с номером заказа Quote Link to post Share on other sites
Chudo Posted March 19 Report Share Posted March 19 10 часов назад, Kami сказал: Кто сталкивался с таким интересным подходом добавлять контрагентов? Кто то до меня придумал у клиента такую фичу, if(empty($order->user_id)) $order->user_id = $order->id; В целом костыль норм, но потом если человек регается и user_id совпадает с номером заказа, то происходит каша в контрагентах при выгрузке в Мой склад. Кто сталкивался и какое решение было оптимальным? В вашем коде предполагается, что если у заказа нет user_id, то используется номер заказа в качестве user_id. Это может быть полезным, если пользователь оформляет заказ без регистрации, и его данные не сохранены в базе данных. Однако, как вы указали, это может привести к проблемам при регистрации пользователей, когда user_id будет совпадать с номером заказа. Чтобы избежать такой ситуации, я рекомендую изменить логику кода. Вместо того, чтобы использовать номер заказа в качестве user_id, можно создать отдельное поле в базе данных для номера заказа и сохранять его туда при оформлении заказа. Также можно добавить проверку на совпадение user_id и номера заказа при регистрации пользователей, и если они совпадают, то происходит автоматическое обновление user_id на другой уникальный идентификатор, который не будет совпадать с номером заказа. Также, возможно, стоит пересмотреть процесс выгрузки контрагентов в Мой склад, чтобы учесть возможные изменения в логике кода. 1. Конкретный пример кода для изменения логики оформления заказов может выглядеть следующим образом: Создайте новое поле "order_number" в таблице "orders". Для этого откройте файл "engine/init.php" и добавьте следующий код в функцию "init_db()": $this->db->query(" ALTER TABLE `{$this->db_prefix}orders` ADD COLUMN `order_number` INT(11) DEFAULT NULL; "); 2. В файле "engine/classes/Order.php" найдите функцию "create_order()". Замените код if (empty($order->user_id)) { $order->user_id = $order->id; } на if (empty($order->user_id)) { $order->user_id = $this->generate_user_id(); } $order->order_number = $order->id; 3. Добавьте функцию "generate_user_id()" в тот же файл "engine/classes/Order.php": private function generate_user_id() { $user_id = null; do { $user_id = rand(100000, 999999); $count = $this->orders->count_orders("user_id = '{$user_id}'"); } while ($count > 0); return $user_id; } Эта функция генерирует случайный уникальный идентификатор для пользователя. Если пользователь уже существует с таким идентификатором, то функция генерирует новый идентификатор, пока не найдет уникальный. 4. Добавьте проверку на совпадение user_id и order_number в файле "engine/ajax/User.php" в функции "signup()": // Проверяем, совпадают ли user_id и order_number if (!empty($_SESSION['order_id']) && !empty($_POST['password'])) { $order = $this->orders->get_order(intval($_SESSION['order_id'])); if ($order && $order->user_id == $order->order_number) { // Generate new user_id $user_id = $this->orders->generate_user_id(); $this->orders->update_order($order->id, array('user_id' => $user_id)); } } Этот код проверяет, существует ли заказ, связанный с текущей сессией, и был ли создан пользователь с помощью регистрации. Если user_id и order_number совпадают, то генерируется новый user_id и обновляется соответствующий заказ. Надеюсь, это поможет вам решить проблему! Quote Link to post Share on other sites
phukortsin Posted March 20 Report Share Posted March 20 (edited) Опять вспоминается товарищ Огурцов, который в старом фильме говорил: - Так, ну что ж, товарищи, коллектив большой, народ квалифицированный, работа проделана большая, у меня лично сомнений нет, это дело так не пойдёт... Для начала, судя по тому, что в инструкции встречаются несуществующие в актуальной версии пути"engine/init.php", "engine/classes/Order.php" и другие подобные, инструкция написано для какой-то специфичной переработанной версии Simpla. А может, для очень-очень старой. В любом случае, об этом надо бы сообщать... Миниатюрная простенькая функция generate_user_id написана настолько неверно, что в ней прямо с ходу видны грубые ошибки. 1. Подсчет числа заказов в функции ВСЕГДА будет давать общее число заказов в магазине, без какой-либо фильтрации. 2. Если в магазине до выполнения нового кода ЕСТЬ заказы, то в результате в новом заказе в качестве user_id будет просто случайное число в диапазоне, возможно совпадающее с зарегистрированным пользователем. То есть заявленный функцонал просто не работает. 3. Если в магазине до выполнения нового кода НЕТ заказов, то функция войдет в бесконечный цикл и пользователь при попытке заказа после долгого ожидания увидит сообщение о серверной ошибке. 4. Автор решения явно проверкой себя не затруднял. Но самое главное, предложенное решение неоправданно сложное. Куда как проще честно создать, если требуется, нового пользователя. Простенький код для этого можно подсмотреть в RegisterView.php. Для текущей версии простое короткое решение может выглядеть примерно так: if(empty($order->user_id)) { $order->user_id = $this->users->add_user(array( 'name'=>'autogeristered by order '.$order->id, 'email'=>$order->id.'@autogeristered.mail', 'password'=>rand(100000, 999999), 'enabled'=>1, 'last_ip'=>$_SERVER['REMOTE_ADDR'] )); } Edited March 20 by phukortsin Quote Link to post Share on other sites
Chudo Posted May 24 Report Share Posted May 24 В 20.03.2023 в 10:05, phukortsin сказал: Опять вспоминается товарищ Огурцов, который в старом фильме говорил: - Так, ну что ж, товарищи, коллектив большой, народ квалифицированный, работа проделана большая, у меня лично сомнений нет, это дело так не пойдёт... Для начала, судя по тому, что в инструкции встречаются несуществующие в актуальной версии пути"engine/init.php", "engine/classes/Order.php" и другие подобные, инструкция написано для какой-то специфичной переработанной версии Simpla. А может, для очень-очень старой. В любом случае, об этом надо бы сообщать... Миниатюрная простенькая функция generate_user_id написана настолько неверно, что в ней прямо с ходу видны грубые ошибки. 1. Подсчет числа заказов в функции ВСЕГДА будет давать общее число заказов в магазине, без какой-либо фильтрации. 2. Если в магазине до выполнения нового кода ЕСТЬ заказы, то в результате в новом заказе в качестве user_id будет просто случайное число в диапазоне, возможно совпадающее с зарегистрированным пользователем. То есть заявленный функцонал просто не работает. 3. Если в магазине до выполнения нового кода НЕТ заказов, то функция войдет в бесконечный цикл и пользователь при попытке заказа после долгого ожидания увидит сообщение о серверной ошибке. 4. Автор решения явно проверкой себя не затруднял. Но самое главное, предложенное решение неоправданно сложное. Куда как проще честно создать, если требуется, нового пользователя. Простенький код для этого можно подсмотреть в RegisterView.php. Для текущей версии простое короткое решение может выглядеть примерно так: if(empty($order->user_id)) { $order->user_id = $this->users->add_user(array( 'name'=>'autogeristered by order '.$order->id, 'email'=>$order->id.'@autogeristered.mail', 'password'=>rand(100000, 999999), 'enabled'=>1, 'last_ip'=>$_SERVER['REMOTE_ADDR'] )); } Согласен, написал неверное решение, той ночю я мало спал) Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.