martes, 23 de julio de 2013

Creando módulos en Zend Framework 2


Hasta ahora hemos visto en los capítulos anteriores aspectos muy importantes, como la creación de controladores, vistas, layouts,  algunas configuraciones del módulo, todo ello en el módulo que viene por defecto en Skeleton "Application", y ahora es el momento de aprender a crear un nuevo módulo, la creación de módulos independientes nos permite dar mayor organización y funcionalidad a un proyecto, por ejemplo, crear un módulo para desarrollar un panel de administración, o un módulo para desarrollar un blog, o otra cualquier funcionalidad que convenga separar en un módulo independiente, sobre todo por organización y limpieza.

La estructura básica de un módulo se puede ver en el módulo "Application", ve a la ruta  

\tutorial-zend\module\Application ...

Creando módulos en Zend Framework 2


Ésta es la estructura básica de cualquier módulo Zend ...

config -> Se encuentra el archivo de configuración del módulo
src -> Se encuentran los controladores del módulo
view -> Se encuentran los layouts y vistas del módulo
language -> Se encuentran los archivos de configuración del idioma. Esta carpeta no es primordial, aunque si lo puede ser para una web multilenguaje.

Pues sabiendo los aspectos más importantes, es momento de empezar a crear un nuevo módulo llamado "Administracion" ...

Nos vamos a la ruta ... \tutorial-zend\module y creamos una carpeta llamada "Administracion", dentro de esta carpeta crearemos cuatro carpetas "config", "src", "view" y "language" y un archivo llamado "Module.php".

· En la carpeta "config" creamos un archivo llamado "module.config.php".

· En la carpeta "src" creamos una carpeta llamada "Administracion" y dentro de esta carpeta una carpeta llamada "Controller".

En la carpeta "views" creamos tres carpetas "administracion", "error" y "layout", en las carpetas "error" y "layout" incluye los mismos archivos que vienen por defecto en el módulo "Application".

En la carpeta "language" copiamos y pegamos los mismos archivos de idioma que vienen por defecto en el módulo "Application".

Para empezar sería conveniente crear un controlador y una vista, así que empezaremos por el controlador, ir a la siguiente ruta \tutorial-zend\module\Administracion\src\Application\Controller y crear un archivo llamado "IndexController.php"

Copiar y pegar el siguiente código ...

<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Administracion\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        return new ViewModel();
    }
}

En el namespace ahora utilizamos "Administracion" en lugar de "Application", esto es muy importante.

Ahora vamos a crear la vista, ir a la siguiente ruta \tutorial-zend\module\Administracion\view\administracion y crear una carpeta llamada "index", dentro de esta carpeta creamos una vista llamada "index.phtml" ...

Copiar y pegar el siguiente código ...

<h1>Módulo de Administración</h1>

Ahora toca configurar el archivo "Module.php", ir a la siguiente ruta \tutorial-zend\module\Administracion\Module.php ...

Copiar y pegar el siguiente código ...

<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Administracion;

use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }
}


El archivo Module.php es prácticamente igual para todos los módulos, salvo que tienes que poner en el namespace el nombre del módulo, en este caso Administracion, salvo esto no es necesario tocar nada más en este archivo, ya que viene configurado de por sí para gestionar los eventos del módulo.

A continuación vamos a la ruta del archivo de configuración del módulo \tutorial-zend\module\Administracion\config\module.config.php ...

Copiar y pegar el siguiente código ...

<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

return array(
    'router' => array(
        'routes' => array(
             /*--------------URL'S AMIGABLES--------------*/
                      'admin' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/administracion/',
                    'defaults' => array(
                        'controller' => 'Administracion\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),
    'service_manager' => array(
        'abstract_factories' => array(
            'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
            'Zend\Log\LoggerAbstractServiceFactory',
        ),
        'aliases' => array(
            'translator' => 'MvcTranslator',
        ),
    ),
    'translator' => array(
        'locale' => 'es_ES',
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),
    'controllers' => array(
        'invokables' => array(
            'Administracion\Controller\Index' => 'Administracion\Controller\IndexController',
        ),
    ),
    'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'administracion/index/index' => __DIR__ . '/../view/administracion/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),
    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
            ),
        ),
    ),
);


Ahora si ejecutas http://tutorial-zend.localhost/administracion/ te devolverá un error, este error viene dado a que hay que nombrar el nuevo módulo en el archivo "application.config.php" que se encuentra en la ruta \tutorial-zend\config

Agrega el nuevo módulo "Administracion" como se puede ver a continuación en color azul ...

    'modules' => array(
        'Application',
        'Administracion',
    ),

Ahora Zend si tendrá en cuenta de que hay un nuevo módulo en el proyecto, ejecuta en el navegador http://tutorial-zend.localhost/administracion/ y sorpresa un nuevo módulo ha sido creado.