пошаговая регистрация
пошаговая регистрация
Здравствуйте.
Мне предстоит крупный проект.И первое, что надо сделать это пошаговую регистрацию .т.е. на первом шаге в форме вводится часть полей для заполнения ,далее при нажатии на кнопку продолжить еще форма с новыми полями ,но, в ней также есть поля и из первого шага(в эти поля должны автоматически подгружаться данные из первого шага).
В принципе я б это реализовал так:
1 Для каждого шага своя модель формы (RegistrationStepOneForm и RegistrationStepTwoForm)
2.Для каждого шага свой экшен в контроллере (UserController)
3.Данные между шагами хранятся в сессии.После заполнения данных пользователем полей в первом шаге, данные записываются в сессию с помощью функции registrationStepOne() в модели RegistrationStepOneForm , а на втором шаге данные сохраняются в БД с помощью функции registrationStepTwo в модели RegistrationStepTwoForm .
Но я думаю, что это неправильный подход, одни и те же свойства будут повторяться в обоих моделях формы(RegistrationStepOneForm и RegistrationStepTwoForm ).?Где правильно записывать данные в сессию (в контроллере или в модели)? Правильно ли создавать 2 модели и 2 экшена?
В общем знающих специалистов прошу подсказать (или дать ссылки) как правильно организовать архитектуру такой пошаговой регистрации.
Мне предстоит крупный проект.И первое, что надо сделать это пошаговую регистрацию .т.е. на первом шаге в форме вводится часть полей для заполнения ,далее при нажатии на кнопку продолжить еще форма с новыми полями ,но, в ней также есть поля и из первого шага(в эти поля должны автоматически подгружаться данные из первого шага).
В принципе я б это реализовал так:
1 Для каждого шага своя модель формы (RegistrationStepOneForm и RegistrationStepTwoForm)
2.Для каждого шага свой экшен в контроллере (UserController)
3.Данные между шагами хранятся в сессии.После заполнения данных пользователем полей в первом шаге, данные записываются в сессию с помощью функции registrationStepOne() в модели RegistrationStepOneForm , а на втором шаге данные сохраняются в БД с помощью функции registrationStepTwo в модели RegistrationStepTwoForm .
Но я думаю, что это неправильный подход, одни и те же свойства будут повторяться в обоих моделях формы(RegistrationStepOneForm и RegistrationStepTwoForm ).?Где правильно записывать данные в сессию (в контроллере или в модели)? Правильно ли создавать 2 модели и 2 экшена?
В общем знающих специалистов прошу подсказать (или дать ссылки) как правильно организовать архитектуру такой пошаговой регистрации.
Re: пошаговая регистрация
Мне кажется это можно решить сценариями, а не двумя моделями. Но точный ответ дать не готов, посмотрите самостоятельно в сторону scenario() в модели. Запрос- ответ = один сценарий, затем по скрытому атрибуту определяете шаг и выставляете нужный сценарий для модели. Как то так.
Re: пошаговая регистрация
Сценарии смотрел, но не совсем понял как их реализовать.А с сессиями как быть? где лучше записывать данные? Причитал, что можно использовать екшен в виде класса, но будет ли это здесь полезно?
<b>Неужели нет опытных спецов, которые толком подсказали бы как лучше организовать архитектуру?</b>
<b>Неужели нет опытных спецов, которые толком подсказали бы как лучше организовать архитектуру?</b>
Re: пошаговая регистрация
один из простых вариантов пошаговой регистрации. Возможно сделать на текущей таблице "user"
в таблицу user добавляем нужные поля.
в модели user есть константы статуса.
добавляем еще одну, например типа такой:
исправить rules для данного поля
В данной модели есть методы, которые по данному статусу фильтруют данные.
поэтому нужно их отредактировать согласно логике. например findIdentity() должен ли находить со статусом STATUS_ACTIVATING или нет.
а дальше все просто.
при первой регистрации пишем в БД первую часть данных и статус STATUS_ACTIVATING, далее
1. И/ИЛИ Сразу отправляем на вторую страницу регистрации.
2. И/ИЛИ Высылаем ссылку на емайл.
3. И/ИЛИ после авторизации, видим что статус STATUS_ACTIVATING и редиректим на вторую страницу регистрации)
а уже на второй странице получаем остальные данные и меняем статус на STATUS_ACTIVE
в таблицу user добавляем нужные поля.
в модели user есть константы статуса.
добавляем еще одну, например типа такой:
Код: Выделить всё
const STATUS_ACTIVATING = 20;
В данной модели есть методы, которые по данному статусу фильтруют данные.
поэтому нужно их отредактировать согласно логике. например findIdentity() должен ли находить со статусом STATUS_ACTIVATING или нет.
а дальше все просто.
при первой регистрации пишем в БД первую часть данных и статус STATUS_ACTIVATING, далее
1. И/ИЛИ Сразу отправляем на вторую страницу регистрации.
2. И/ИЛИ Высылаем ссылку на емайл.
3. И/ИЛИ после авторизации, видим что статус STATUS_ACTIVATING и редиректим на вторую страницу регистрации)
а уже на второй странице получаем остальные данные и меняем статус на STATUS_ACTIVE
Re: пошаговая регистрация
kwasti . спасибо за ответ, не совсем понятно как быть с данными между шагами?, как и где их хранить и записывать сессию?
Объясните пожалуйста подробнее
Объясните пожалуйста подробнее
Re: пошаговая регистрация
yintar писал(а):kwasti . спасибо за ответ, не совсем понятно как быть с данными между шагами?, как и где их хранить и записывать сессию?
Объясните пожалуйста подробнее
при первой регистрации пишем в БД первую часть данных и статус STATUS_ACTIVATING, далее
Re: пошаговая регистрация
а если пользователь закыл браузер или вышел ,то в бд останется не заполненные поля, как этого избежать
Re: пошаговая регистрация
ставить на крон задание на чистку базы от незавершенных регистраций ... (если дата старта регистрации уже больше XX дней ..)
Re: пошаговая регистрация
Записывать в localStorage как вариант
Re: пошаговая регистрация
блин........извините ,но это все такой бред , подключать крон для регистрации,localStorage и т.д. Да, уж, просто жалко что очень мало толковых учебников и видеоуроков и специалистов.....именно настоящих спецов(таких как я ,способных написать примитивный контроллер, модель и действие хватает), или просто грамотные спецы в таких форумах не участвуют...........Я просил подсказать как грамотно спроектировать АРХИТЕКТУРУ приложения. для пошаговой регистрации.........
Re: пошаговая регистрация
- заводим под каждую форму модель (Step1Form, Step2Form, Step3Form), заводим общую модель RegistrationForm, в которой будем хранить сумму после каждого шага
- идем на /user/registration, видим первый шаг, заполняем, сабмитим, в контроллере валидируем форму, данные заносим в RegistrationForm с пометкой step1, сериализуем, кладем в хранилище (БД/кэш на сутки/неделю), редиректим юзера на /user/registration/$registrationForm->id
- достаем форму из хранилища (имеем доступ к уже заполненным данным + пройденного шага), рендерим второй шаг, валидируем, сохраняем, редиректим на третий шаг (с тем же самым урлом /user/registration/$registrationForm->id)
- повторяем предыдущий шаг для каждого шага. на последнем шаге данные из 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);
}
Re: пошаговая регистрация
Сань. А где сарказм? )
Re: пошаговая регистрация
такие слова мне не знакомыOnotole писал(а):Сань. А где сарказм? )
Re: пошаговая регистрация
задачу на крон это не так сложно ... это всеголишь грубо говоря "метод который дергается по расписанию ..."yintar писал(а):блин........извините ,но это все такой бред , подключать крон для регистрации,localStorage и т.д. Да, уж, просто жалко что очень мало толковых учебников и видеоуроков и специалистов.....именно настоящих спецов(таких как я ,способных написать примитивный контроллер, модель и действие хватает), или просто грамотные спецы в таких форумах не участвуют...........Я просил подсказать как грамотно спроектировать АРХИТЕКТУРУ приложения. для пошаговой регистрации.........
то что будет лишняя запись в базе это не так страшно(которую крон потом подчистит) ... если страшно заведите другую таблицу ...
вам накидывают варианты а вы решаете под свои задачи как вам их использовать ... все зависит от потребностей ... вам никто не мешает сделать даже две формы на одной страницы переключать их через js скрывая блока ... и сабмит потом сгребет все в кучу ... опять же все от задач и тз ...
уж извините но "но это все такой бред", "как грамотно спроектировать АРХИТЕКТУРУ приложения для пошаговой регистрации", "Мне предстоит крупный проект" не рано ?
"Да, уж, просто жалко что очень мало толковых учебников и видеоуроков" литературы и видео полно ...
Re: пошаговая регистрация
Да, печально.............caHek2x вы ,наверное, считаете себя опытным кодером....? Это вам рано отвечать на вопросы и вводить в заблуждение людей некомпетентными ответами......
Никто даже не посоветовал вынести функционал в отдельный класс для Регистрации(это и будет модель) и в нем уже писать всю логику.
Никто не тыкнул ,что писать как правильно использовать экшены.....
Ладно,,,,похоже теряю время......
Никто даже не посоветовал вынести функционал в отдельный класс для Регистрации(это и будет модель) и в нем уже писать всю логику.
Никто не тыкнул ,что писать как правильно использовать экшены.....
Ладно,,,,похоже теряю время......
Re: пошаговая регистрация
я не настолько опытный кодер как звучит эта фраза но чтото посоветовать могу ... "и вводить в заблуждение людей некомпетентными ответами" ваше имхо ...
---------------
все зависит от задачи ... еще раз повторюсь .. если для того что бы пользователь зарегистрировался надо всё заполнить и первый шаг и второй ... и нет ожидания чуда (письмо по почте или смс) я вообще не вижу смысл и двух моделей и двух экшенов ... одна форма и только дизайн разбит на переключаемые блоки ...
вообще страшное предложение ...что писать как правильно использовать экшены
вы сами себе это посоветовали в самом начале ...Никто даже не посоветовал вынести функционал в отдельный класс для Регистрации(это и будет модель)
а далее вам предложили альтернативы ...1 Для каждого шага своя модель формы (RegistrationStepOneForm и RegistrationStepTwoForm)
---------------
все зависит от задачи ... еще раз повторюсь .. если для того что бы пользователь зарегистрировался надо всё заполнить и первый шаг и второй ... и нет ожидания чуда (письмо по почте или смс) я вообще не вижу смысл и двух моделей и двух экшенов ... одна форма и только дизайн разбит на переключаемые блоки ...
Re: пошаговая регистрация
Я бы сделал так: все шаги регистрации - одна большая форма. Переключение между шагами - на стороне клиента, через JS. Ну то есть, форма делится на блоки, которые показываются по очереди. Кнопка на последнем шаге - сабмит формы, которая полностю отсылается на сервер. Вообще, пошаговая регистрация для чего придумана? Чтоб не нагружать юзера огромной формой сразу. Но по сути, регистрация то одна, соответственно и форма одна, и экшн один.
Единственная сложность тут с валидацией - нужно, чтоб кнопка перехода на следуюющий шаг делалась недоступной в случае, если какие-то поля неверно заполнены. Но мне кажется, что особого геморроя тут быть не должно.
А при пошаговой работе с сервером, навскидку, кроме конкретного усложнения кода, мы будем иметь невозможность в базе какие-нибуть поля с поздних шагов сделать не-NULL, так как между шагами нужно будет сохранять уже имеющююся инфу.
В любом случае, решение через клиент будет намного приятнее и болле красивое, ну и более интерактивное для юзера.
Единственная сложность тут с валидацией - нужно, чтоб кнопка перехода на следуюющий шаг делалась недоступной в случае, если какие-то поля неверно заполнены. Но мне кажется, что особого геморроя тут быть не должно.
А при пошаговой работе с сервером, навскидку, кроме конкретного усложнения кода, мы будем иметь невозможность в базе какие-нибуть поля с поздних шагов сделать не-NULL, так как между шагами нужно будет сохранять уже имеющююся инфу.
В любом случае, решение через клиент будет намного приятнее и болле красивое, ну и более интерактивное для юзера.