Я использую zfcUser для регистрации и авторизации, и у меня есть вопрос. Пользователь может зарегистрироваться по 2 типам профилей, и формы разные, поэтому вопрос в том, как лучше всего использовать несколько регистрационных форм в zfcUser, на одной странице, используя вкладки.
zfcUser две формы регистрации?
Ответы (1)
Я могу придумать несколько решений. Это тот, который я думаю, является лучшим для вашей цели. Это немного кода.
Прежде всего, вы должны подумать о базе данных, возможно, у вас будет одна таблица с разными полями или одна общая таблица и разные таблицы с дополнительными полями в зависимости от типа пользователя. Решение такое же.
Во-первых, как вы знаете, есть сервис для получения регистрационной формы. Вы можете использовать обратные вызовы событий регистрации для их изменения, но, поскольку вам нужны разные формы, и ни одна из них не является стандартной, я думаю, что лучше всего создать 2 новых сервиса для двух новых форм.
Для этого в вашем модуле в функции getServiceConfig()
вы создаете эти две службы, которые отвечают службе zfcuser_register_form, но добавляют и удаляют поля и поля фильтра ввода.
<?
public function getServiceConfig()
{
return array(
'factories' => array(
'zfcuser_register_form_usertype1' => function ($sm) {
$options = $sm->get('zfcuser_module_options');
$form = new Form\Register(null, $options);
///for type:
$this->add(array(
'name' => 'usertype',
'attributes' => array(
'type' => 'hidden',
'value' => '1',
),
));
/*
* Add o remove fields to the form
*/
$form->setInputFilter(new Form\RegisterFilter(
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'email'
)),
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'username'
)),
$options
));
/*
* Add o remove fields to the input filter
*/
return $form;
},
////////////////////////////////////////////////////////////
'zfcuser_register_form_usertype2' => function ($sm) {
$options = $sm->get('zfcuser_module_options');
$form = new Form\Register(null, $options);
///for type:
$this->add(array(
'name' => 'usertype',
'attributes' => array(
'type' => 'hidden',
'value' => '2',
),
));
/*
* Add o remove fields to the form
*/
$form->setInputFilter(new Form\RegisterFilter(
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'email'
)),
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'username'
)),
$options
));
/*
* Add o remove fields to the input filter
*/
return $form;
},
),
);
}
Руководство по добавлению или удалению полей см. на странице официальная страница руководства по формам
Затем в контроллере/действии, которое покажет формы регистрации (должно быть свое, маршрутное, а не стандартное zfuser)
public function registerAction()
{
//get the first form
$form1 = $this->getServiceLocator ()->get ( 'zfcuser_register_form_usertype1' );
//set the action to the zfuser registation route
$form1->setAttribute('action', $this->url('zfcuser/register'));
$form1->setAttribute('method', 'post');
//the same for the second form
$form2 = $this->getServiceLocator ()->get ( 'zfcuser_register_form_usertype2' );
$form2->setAttribute('action', $this->url('zfcuser/register'));
$form2->setAttribute('method', 'post');
//send both form to the view
return array('form1' => $form1,'form2' => $form2);
}
Затем просмотрите, просто извлеките формы и визуализируйте их, как с любой формой (если у вас есть какие-либо сомнения, перейдите к приведенному выше связанному руководству, которое также содержит информацию о том, как визуализировать формы)
<?php
/*
* html for tabs
*/
$form = $this->form1;
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('usertype'));
echo $this->formRow($form->get('field1'));
echo $this->formRow($form->get('field2'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
/*
* other html for tabs
*/
$form2 = $this->form2;
$form2->prepare();
echo $this->form()->openTag($form2);
echo $this->formHidden($form->get('usertype'));
echo $this->formRow($form2->get('field1'));
echo $this->formRow($form2->get('field2'));
echo $this->formSubmit($form2->get('submit'));
echo $this->form()->closeTag();
/*
* other html for tabs
*/
Теперь у вас есть формы. Осталось только оформить регистрацию. Как вы, наверное, знаете, в zfcuser есть менеджер событий, который позволяет нам планировать действия для некоторых событий, например, при создании новой учетной записи
Для этого в вашем модуле в функции onBootstrap
вы
<?
/**
* executes on boostrap
*
* @param \Zend\Mvc\MvcEvent $e
* @return null
*/
public function onBootstrap(MvcEvent $e) {
//retrieve the zfcuser event manager
$sm = $e->getApplication()->getServiceManager();
$zfcServiceEvents = $sm->get('zfcuser_user_service')->getEventManager();
// add a callback to Store the field when the form is submited
$zfcServiceEvents->attach('register', function ($e) use($sm)
{
$form = $e->getParam('form');//here you have the submited form
$user = $e->getParam('user');//here you have the already created standard user entity
$type=$form->get("usertype")->getValue();//retrieve the user type
//with this, you can decide what other fields to retrieve,
//and how to asign it to the entity or to other related entities:
if ($type==1) {
//...
}
else {
//...
}
});
}