пошаговая регистрация

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

пошаговая регистрация

Сообщение yintar »

Здравствуйте.
Мне предстоит крупный проект.И первое, что надо сделать это пошаговую регистрацию .т.е. на первом шаге в форме вводится часть полей для заполнения ,далее при нажатии на кнопку продолжить еще форма с новыми полями ,но, в ней также есть поля и из первого шага(в эти поля должны автоматически подгружаться данные из первого шага).
В принципе я б это реализовал так:
1 Для каждого шага своя модель формы (RegistrationStepOneForm и RegistrationStepTwoForm)
2.Для каждого шага свой экшен в контроллере (UserController)
3.Данные между шагами хранятся в сессии.После заполнения данных пользователем полей в первом шаге, данные записываются в сессию с помощью функции registrationStepOne() в модели RegistrationStepOneForm , а на втором шаге данные сохраняются в БД с помощью функции registrationStepTwo в модели RegistrationStepTwoForm .
Но я думаю, что это неправильный подход, одни и те же свойства будут повторяться в обоих моделях формы(RegistrationStepOneForm и RegistrationStepTwoForm ).?Где правильно записывать данные в сессию (в контроллере или в модели)? Правильно ли создавать 2 модели и 2 экшена?
В общем знающих специалистов прошу подсказать (или дать ссылки) как правильно организовать архитектуру такой пошаговой регистрации.
dva20
Сообщения: 17
Зарегистрирован: 2016.12.13, 19:34

Re: пошаговая регистрация

Сообщение dva20 »

Мне кажется это можно решить сценариями, а не двумя моделями. Но точный ответ дать не готов, посмотрите самостоятельно в сторону scenario() в модели. Запрос- ответ = один сценарий, затем по скрытому атрибуту определяете шаг и выставляете нужный сценарий для модели. Как то так.
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

Re: пошаговая регистрация

Сообщение yintar »

Сценарии смотрел, но не совсем понял как их реализовать.А с сессиями как быть? где лучше записывать данные? Причитал, что можно использовать екшен в виде класса, но будет ли это здесь полезно?
<b>Неужели нет опытных спецов, которые толком подсказали бы как лучше организовать архитектуру?</b>
kwasti
Сообщения: 262
Зарегистрирован: 2016.01.28, 16:14

Re: пошаговая регистрация

Сообщение kwasti »

один из простых вариантов пошаговой регистрации. Возможно сделать на текущей таблице "user"
в таблицу user добавляем нужные поля.
в модели user есть константы статуса.
добавляем еще одну, например типа такой:

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

const STATUS_ACTIVATING = 20;
исправить rules для данного поля
В данной модели есть методы, которые по данному статусу фильтруют данные.
поэтому нужно их отредактировать согласно логике. например findIdentity() должен ли находить со статусом STATUS_ACTIVATING или нет.
а дальше все просто.
при первой регистрации пишем в БД первую часть данных и статус STATUS_ACTIVATING, далее
1. И/ИЛИ Сразу отправляем на вторую страницу регистрации.
2. И/ИЛИ Высылаем ссылку на емайл.
3. И/ИЛИ после авторизации, видим что статус STATUS_ACTIVATING и редиректим на вторую страницу регистрации)
а уже на второй странице получаем остальные данные и меняем статус на STATUS_ACTIVE
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

Re: пошаговая регистрация

Сообщение yintar »

kwasti . спасибо за ответ, не совсем понятно как быть с данными между шагами?, как и где их хранить и записывать сессию?
Объясните пожалуйста подробнее
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: пошаговая регистрация

Сообщение caHek2x »

yintar писал(а):kwasti . спасибо за ответ, не совсем понятно как быть с данными между шагами?, как и где их хранить и записывать сессию?
Объясните пожалуйста подробнее
при первой регистрации пишем в БД первую часть данных и статус STATUS_ACTIVATING, далее
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

Re: пошаговая регистрация

Сообщение yintar »

а если пользователь закыл браузер или вышел ,то в бд останется не заполненные поля, как этого избежать
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: пошаговая регистрация

Сообщение caHek2x »

ставить на крон задание на чистку базы от незавершенных регистраций ... (если дата старта регистрации уже больше XX дней ..)
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: пошаговая регистрация

Сообщение Onotole »

Записывать в localStorage как вариант
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

Re: пошаговая регистрация

Сообщение yintar »

блин........извините ,но это все такой бред , подключать крон для регистрации,localStorage и т.д. Да, уж, просто жалко что очень мало толковых учебников и видеоуроков и специалистов.....именно настоящих спецов(таких как я ,способных написать примитивный контроллер, модель и действие хватает), или просто грамотные спецы в таких форумах не участвуют...........Я просил подсказать как грамотно спроектировать АРХИТЕКТУРУ приложения. для пошаговой регистрации.........
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: пошаговая регистрация

Сообщение zelenin »

- заводим под каждую форму модель (Step1Form, Step2Form, Step3Form), заводим общую модель RegistrationForm, в которой будем хранить сумму после каждого шага
- идем на /user/registration, видим первый шаг, заполняем, сабмитим, в контроллере валидируем форму, данные заносим в RegistrationForm с пометкой step1, сериализуем, кладем в хранилище (БД/кэш на сутки/неделю), редиректим юзера на /user/registration/$registrationForm->id
- достаем форму из хранилища (имеем доступ к уже заполненным данным + пройденного шага), рендерим второй шаг, валидируем, сохраняем, редиректим на третий шаг (с тем же самым урлом /user/registration/$registrationForm->id)
- повторяем предыдущий шаг для каждого шага. на последнем шаге данные из RegistrationForm используем для финальной регистрации (созданию юзера итд)

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

if($id) {
    $registrationForm = RegistrationForm::findByPk($id);
    switch($registrationForm->step()) {
        case RegistrationForm::STEP1 :
        ...
        break;

        case RegistrationForm::STEP2 :
        ...
        break;
        ...
        case RegistrationForm::STEP3 :

        break;
    }
    $registrationForm->save();
    return $this->redirect(/user/registration/$registrationForm->id);
} else {
    $registrationForm = new RegistrationForm;

    $form = new Step1;
    ...

    $registrationForm->save();
    return $this->redirect(/user/registration/$registrationForm->id);
}
 
примерный код (не рассматривать как руководство к действию всю логику прописывать внутри экшна - необходимо вынести в сервис регистрации)
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: пошаговая регистрация

Сообщение Onotole »

Сань. А где сарказм? )
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: пошаговая регистрация

Сообщение zelenin »

Onotole писал(а):Сань. А где сарказм? )
такие слова мне не знакомы
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: пошаговая регистрация

Сообщение caHek2x »

yintar писал(а):блин........извините ,но это все такой бред , подключать крон для регистрации,localStorage и т.д. Да, уж, просто жалко что очень мало толковых учебников и видеоуроков и специалистов.....именно настоящих спецов(таких как я ,способных написать примитивный контроллер, модель и действие хватает), или просто грамотные спецы в таких форумах не участвуют...........Я просил подсказать как грамотно спроектировать АРХИТЕКТУРУ приложения. для пошаговой регистрации.........
задачу на крон это не так сложно ... это всеголишь грубо говоря "метод который дергается по расписанию ..."
то что будет лишняя запись в базе это не так страшно(которую крон потом подчистит) ... если страшно заведите другую таблицу ...
вам накидывают варианты а вы решаете под свои задачи как вам их использовать ... все зависит от потребностей ... вам никто не мешает сделать даже две формы на одной страницы переключать их через js скрывая блока ... и сабмит потом сгребет все в кучу ... опять же все от задач и тз ...
уж извините но "но это все такой бред", "как грамотно спроектировать АРХИТЕКТУРУ приложения для пошаговой регистрации", "Мне предстоит крупный проект" не рано ?
"Да, уж, просто жалко что очень мало толковых учебников и видеоуроков" литературы и видео полно ...
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

Re: пошаговая регистрация

Сообщение yintar »

Да, печально.............caHek2x вы ,наверное, считаете себя опытным кодером....? Это вам рано отвечать на вопросы и вводить в заблуждение людей некомпетентными ответами......
Никто даже не посоветовал вынести функционал в отдельный класс для Регистрации(это и будет модель) и в нем уже писать всю логику.
Никто не тыкнул ,что писать как правильно использовать экшены.....
Ладно,,,,похоже теряю время......
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: пошаговая регистрация

Сообщение caHek2x »

я не настолько опытный кодер как звучит эта фраза но чтото посоветовать могу ... "и вводить в заблуждение людей некомпетентными ответами" ваше имхо ...
что писать как правильно использовать экшены
вообще страшное предложение ...
Никто даже не посоветовал вынести функционал в отдельный класс для Регистрации(это и будет модель)
вы сами себе это посоветовали в самом начале ...
1 Для каждого шага своя модель формы (RegistrationStepOneForm и RegistrationStepTwoForm)
а далее вам предложили альтернативы ...
---------------
все зависит от задачи ... еще раз повторюсь .. если для того что бы пользователь зарегистрировался надо всё заполнить и первый шаг и второй ... и нет ожидания чуда (письмо по почте или смс) я вообще не вижу смысл и двух моделей и двух экшенов ... одна форма и только дизайн разбит на переключаемые блоки ...
Matvik
Сообщения: 194
Зарегистрирован: 2013.06.21, 02:32

Re: пошаговая регистрация

Сообщение Matvik »

Я бы сделал так: все шаги регистрации - одна большая форма. Переключение между шагами - на стороне клиента, через JS. Ну то есть, форма делится на блоки, которые показываются по очереди. Кнопка на последнем шаге - сабмит формы, которая полностю отсылается на сервер. Вообще, пошаговая регистрация для чего придумана? Чтоб не нагружать юзера огромной формой сразу. Но по сути, регистрация то одна, соответственно и форма одна, и экшн один.
Единственная сложность тут с валидацией - нужно, чтоб кнопка перехода на следуюющий шаг делалась недоступной в случае, если какие-то поля неверно заполнены. Но мне кажется, что особого геморроя тут быть не должно.

А при пошаговой работе с сервером, навскидку, кроме конкретного усложнения кода, мы будем иметь невозможность в базе какие-нибуть поля с поздних шагов сделать не-NULL, так как между шагами нужно будет сохранять уже имеющююся инфу.
В любом случае, решение через клиент будет намного приятнее и болле красивое, ну и более интерактивное для юзера.
Ответить