Оформление заказа

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
fname_lname
Сообщения: 38
Зарегистрирован: 2018.03.15, 12:22

Оформление заказа

Сообщение fname_lname »

Делаю примитивный интернет-магазин.
Сейчас для оформления заказа достаточно ввести персональные данные (фио, телефон, адрес). После ввода данные и данные сессии (количество товаров и цена) сохраняются в бд вот так:

CartController

Код: Выделить всё

public function actionIndex()
    {
        $session = Yii::$app->session;
        $session->open();
        $this->setMeta('Корзина');
        $order = new Order();
        if ($order->load(Yii::$app->request->post())) {
            $order->qty = $session['cart.qty'];
            $order->sum = $session['cart.sum'];
            if ($order->save()) {
                $order->saveOrderDetails($session['cart'], $order->id);
                Yii::$app->session->setFlash('success', 'Ваш заказ принят');
                $session->remove('cart');
                $session->remove('cart.qty');
                $session->remove('cart.sum');
                return $this->refresh();
            } else {
                Yii::$app->session->setFlash('error', 'Ошибка');
            }
        }
        return $this->render('index', compact('session', 'order'));
    }
Model Order

Код: Выделить всё

 public function saveOrderDetails($items, $order_id)
    {
        foreach ($items as $id => $item) {
            $order_details = new OrderDetails();
            $order_details->order_id = $order_id;
            $order_details->product_id = $id;
            $order_details->name = $item['name'];
            $order_details->price = $item['price'];
            $order_details->qty_item = $item['qty'];
            $order_details->sum_item = $item['qty'] * $item['price'];
            $order_details->save();
        }
    }
Но я не хочу хранить персональные данные (фио, телефон, адрес) в таблице с заказами. Вместо этих полей хочу добавить одно поле user_id. Как это реализовать в модели и как получить id пользователя в контроллере?
У меня есть таблице user_address которая связана по id с таблицей user.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Оформление заказа

Сообщение unknownby »

Поле телефон сделай через маску, перед регистрацией пользователя проверяй на наличие телефона в зареганых. Оно должно быть уникальным. Если зареган, то бери user_id как надо. Иначе регистрируй и бери user_id.

В контроллере обычным способом find->where(phone)->one
Или метод внутри модели с параметром phone, а в контроллере вызов этого метода с передачей параметра
fname_lname
Сообщения: 38
Зарегистрирован: 2018.03.15, 12:22

Re: Оформление заказа

Сообщение fname_lname »

а как вообще правильно сделать, если это был реальный магазин? там ведь пользователь может совершить заказ не зареганым? а историю заказов уже смотреть в личном кабинете. То есть получается поле телефон тоже должен быть связан с таблицей user?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Оформление заказа

Сообщение unknownby »

fname_lname писал(а): 2020.02.19, 15:13 а как вообще правильно сделать, если это был реальный магазин? там ведь пользователь может совершить заказ не зареганым? а историю заказов уже смотреть в личном кабинете. То есть получается поле телефон тоже должен быть связан с таблицей user?
В принципе правильно будет так, как сделаешь для себя, но по сути можно увидеть несколько способов в интернет магазинах.
1. Прежде чем заказать, нужно пройти регистрацию. Корзина не появится, пока пользователь не залогинен, вместо корзины у него "Войти", после входа появляется "Корзина" и "Выход".
2. Корзина видна, можно накидывать товары и после кнопки "Заказать" из корзины пользователь проходит регистрацию и после успешной регистрации отправляются товары на заказ.
3. Корзина видна, можно накидывать товары и после кнопки "Заказать" указывает данные в форме (а может и во время заказа, как сделаешь) с "ФИО", "Телефон", "Адрес" (как вариант еще email). И сделать регистрацию пользователя по его телефону или email (уникальность обязательна). При этом проверки не забываем. Пользователь мог же заказать не первый раз уже. Если указывает email, то можно ему на почту прислать логин и пароль.

С третьим способом больше работы тебе, но проще заказать пользователю, а т.к. мы делаем "всё для людей" :D нужно выбирать третий способ.
Чтобы обеспечить безопасность, вначале регистрация простая, при повторном заказе лучше, чтобы он заходил по логину и паролю.

А вообще на сколько твоей фантазии хватает и позволяет твой скил. ;)
Ответить