Ярлыки

.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)

вторник, 17 сентября 2013 г.

ZendFramework2. Установка макета в модуле и контроллере.

В модуле
...

use Zend\ModuleManager\ModuleManager;

class MyModule implements AutoloaderProviderInterface
{
    public function init(ModuleManager $moduleManager)
    {
        $sharedEvents = $moduleManager->getEventManager()
                            ->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
            // Событие сработает при вызове ActionController
            // в пространстве имен MyModule.
            $controller = $e->getTarget();
            $controller->layout('layout/index');
        }, 100);
    }
}

В контроллере

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        $this->layout('layout/index');
        return array();
    }
}

понедельник, 16 сентября 2013 г.

ZendFramework2. Перевод сообщений валидатора на русский язык.

Для того чтобы валидаторы заговорили по-русски или на любом другом языке, а это сообщения об ошибках в формах и тд, делаем следующее:

namespace MyModule;

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
use Zend\Validator\AbstractValidator;

class Module implements AutoloaderProviderInterface
{
   ...

   $translator = $e->getApplication()->getServiceManager()
                     ->get('translator');
   $translator->addTranslationFile(
       'phpArray',
'./vendor/zendframework/zendframework/resources/languages/ru/Zend_Validate.php',
       'default',
       'ru_RU'
   );
   AbstractValidator::setDefaultTranslator($translator);

   ...
}

А так же можем вообще добавить свой файл переводов. Мне, например, он понадобился для локализации сообщений модуля ZfcUser, которые просто заданы как свойства контроллера.
   ...

   $translator->addTranslationFile(
       'phpArray',
       './module/MyModule/language/ru.php',
       'default',
       'ru_RU'
   );

   ...

Ну и сам файл переводов создаем module/MyModule/language/ru.php

return array(
    'Authentication failed. Please try again.' =>
        'Неверный пароль или логин. Попробуйте еще раз.'
);

четверг, 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',
        ),
    ), 

пятница, 6 сентября 2013 г.

MySQL. Добавление внешнего ключа.

В дополнение к заметкам об удалении внешнего ключа mysql и возможных ошибках при удалении внешнего ключа innodb
CREATE TABLE `category` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `parent_id` int(11) DEFAULT NULL,
    `slug` varchar(255) NOT NULL,
    `title` varchar(255) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `slug` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

ALTER TABLE category 
ADD CONSTRAINT id_parent_id FOREIGN KEY (parent_id)
      REFERENCES category (id)
      ON UPDATE CASCADE ON DELETE CASCADE