zfcUser две формы регистрации?

Я использую zfcUser для регистрации и авторизации, и у меня есть вопрос. Пользователь может зарегистрироваться по 2 типам профилей, и формы разные, поэтому вопрос в том, как лучше всего использовать несколько регистрационных форм в zfcUser, на одной странице, используя вкладки.


person Cawa    schedule 16.01.2014    source источник


Ответы (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 {
              //...

        }


   });
}
person Carlos Robles    schedule 22.01.2014