Kami Опубликовано 18 марта, 2023 Жалоба Поделиться Опубликовано 18 марта, 2023 (изменено) Кто сталкивался с таким интересным подходом добавлять контрагентов? Кто то до меня придумал у клиента такую фичу, if(empty($order->user_id)) $order->user_id = $order->id; В целом костыль норм, но потом если человек регается и user_id совпадает с номером заказа, то происходит каша в контрагентах при выгрузке в Мой склад. Кто сталкивался и какое решение было оптимальным? Изменено 18 марта, 2023 пользователем Kami Цитата Ссылка на сообщение Поделиться на другие сайты
shooroop Опубликовано 18 марта, 2023 Жалоба Поделиться Опубликовано 18 марта, 2023 ну так добавте пару нулей перед номером заказа чтоб точно не совпадет с номером заказа Цитата Ссылка на сообщение Поделиться на другие сайты
Chudo Опубликовано 19 марта, 2023 Жалоба Поделиться Опубликовано 19 марта, 2023 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 и обновляется соответствующий заказ. Надеюсь, это поможет вам решить проблему! Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 20 марта, 2023 Жалоба Поделиться Опубликовано 20 марта, 2023 (изменено) Опять вспоминается товарищ Огурцов, который в старом фильме говорил: - Так, ну что ж, товарищи, коллектив большой, народ квалифицированный, работа проделана большая, у меня лично сомнений нет, это дело так не пойдёт... Для начала, судя по тому, что в инструкции встречаются несуществующие в актуальной версии пути"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'] )); } Изменено 20 марта, 2023 пользователем phukortsin Цитата Ссылка на сообщение Поделиться на другие сайты
Chudo Опубликовано 24 мая, 2023 Жалоба Поделиться Опубликовано 24 мая, 2023 В 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'] )); } Согласен, написал неверное решение, той ночю я мало спал) Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.