Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

четверг, 12 сентября 2013 г.

ZendFramework2. Совместная работа ScnSocialAuth и CdliTwoStageSignup.

Два очень полезных модуля для Zend Framework 2.
Которые не хотят работать вместе из коробки.
Все действия будут в контексте модуля Application из Skeleton.
В контроллере User модуля ScnSocialAuth, в действии register напрямую вызывается действие register модуля ZfcUser.
Как результат мы видим обычную форму регистрации со всеми полями,
несмотря на то, что все плагины подключены в нужной последовательности.
Все что мне нужно, чтобы вместо него вызывалось действие email-verification модуля CdliTwoStageSignup, которое отвечает за отрисовку формы первого этапа регистрации с проверкой почты.

1. Создаем свой контроллер, расширящий
 \ScnSocialAuth\Controller\UserController

Application/src/Application/Controller/SocialAuthController.php
 
namespace Application\Controller;

use Zend\View\Model\ViewModel;

class SocialAuthController 
    extends \ScnSocialAuth\Controller\UserController
{
    public function registerAction()
    {
        // вызываем контроллер CdliTwoStageSignup
        $zfcUserRegister = $this->forward()
            ->dispatch('cdlitwostagesignup_ev_controller',
               array('action' => 'email-verification'));
        /*if (!$zfcUserRegister instanceof ModelInterface) {
            return $zfcUserRegister;
        }*/
        $viewModel = new ViewModel();
        $viewModel->addChild($zfcUserRegister, 'zfcUserLogin');
        $viewModel->setVariable('options', $this->getOptions());

        $redirect = false;
        if ($this->getServiceLocator()->get('zfcuser_module_options')
                ->getUseRedirectParameterIfPresent() 
                    && $this->getRequest()->getQuery()->get('redirect')) {
            $redirect = $this->getRequest()->getQuery()->get('redirect');
        }
        $viewModel->setVariable('redirect', $redirect);
        // подключаем шаблон оригинального модуля
        $viewModel->setTemplate('scn-social-auth/user/register');

        return $viewModel;
    }

}

2. Создаем фабрику контроллера для первоначальной инициализации
по аналогии с фабрикой из ScnSocialAuth

Application/src/Application/Service/SocialAuthControllerFactory.php
 
namespace Application\Service;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class SocialAuthControllerFactory implements FactoryInterface
{
    public function createService(
        ServiceLocatorInterface $controllerManager)
    {
        $mapper = $controllerManager->getServiceLocator()
            ->get('ScnSocialAuth-UserProviderMapper');
        $hybridAuth = $controllerManager->getServiceLocator()
            ->get('HybridAuth');
        $moduleOptions = $controllerManager->getServiceLocator()
            ->get('ScnSocialAuth-ModuleOptions');

        $controller = new \Application\Controller\SocialAuthController();
        $controller->setMapper($mapper);
        $controller->setHybridAuth($hybridAuth);
        $controller->setOptions($moduleOptions);
        return $controller;
    }
}

3. Настройки в конфигурации нашего модуля

Application/config/module.config.php
 
...

'router' => array(
        'routes' => array(

            ...

            // создаем роут на наш контроллер
            'social-auth' => array(
                'type' => 'Literal',
                'priority' => 2000,
                'options' => array(
                    'route' => '/user',
                    'defaults' => array(
                        'controller' => 'zfcuser',
                        'action'     => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'register' => array(
                        'type' => 'Literal',
                        'options' => array(
                            'route' => '/register',
                            'defaults' => array(
                                'controller' =>
                                    'Application\Controller\SocialAuth',
                                'action'     => 'register',
                            ),
                        ),
                    ),

                ),
            ),
        ),
    ),

'controllers' => array(
        
        ...

        // регистрируем фабрику контроллера
        'factories' => array(
            'Application\Controller\SocialAuth' =>
                'Application\Service\UserControllerFactory',
        ),
    ), 

Комментариев нет:

Отправить комментарий