• Inicio
  • Web
  • Contacto
El Blog del desarrollador
Menu
  • Inicio
  • Web
  • Contacto
Inicio › Zend Framework 2
  • Combinando TableGateway, Hydrator y sus estrategias en Zend Framework 2

    malakana     15 septiembre, 2015     Sin comentario     General, Zend Framework 2

    Obtenemos el adaptador de la Base de datos con el Localizador de servicio

    $sm = $this->getServiceLocator();
    $dbAdapter = $sm->get('DbAdapter');
    

    Instanciamos el Hydrator y Modelo que hidrataremos

    $hydrator = new \Zend\Stdlib\Hydrator\ObjectProperty();
    $tag = new \Application\Model\Tag();
    

    Añadimos una estrategia personalizada al hydrator para la propiedad tag de nuestro modelo para este caso como es más rápido he hecho uso de la clase para definir estrategias mediante closures, decir que existe también otros hydratadores predefinidos como ArraySerializable y ClassMethods entre otros

    $hydrator->addStrategy('tag', new \Zend\Stdlib\Hydrator\Strategy\ClosureStrategy(
        //Función que gestiona la estrategia de extracción
        function($value){
    
            return($value);
    
        },
        //Función que gestiona la estrategia de hidratacíón
        function($value){
    
            //Al tag obtenido de la base de datos le concatenamos una url
            $value = 'http://programadormalaga.es/'.$value;
            return($value);
    
        }
    
    ));
    

    Generamos un ResultSet con la clase HydratingResultSet que realice la hidratación pasándole como parametros el modelo y el hydrator

    $resultSet = new \Zend\Db\ResultSet\HydratingResultSet(
        $hydrator, $tag
    );
    

    Instanciamos TableGateway con toda la configuración que hemos hecho y extraemos los registros

    $tableGateway = new \Zend\Db\TableGateway\TableGateway('tags',$dbAdapter,null,$resultSet);
    $registros = $tableGateway->select();
    

    Pasamos el resultado a la vista

    return new ViewModel(array('tags' => $registros ));
    

    Acción completa:

    public function TableGatewayHydratorAction()
    {
    
       $sm = $this->getServiceLocator();
        $dbAdapter = $sm->get('DbAdapter');
    
        $hydrator = new \Zend\Stdlib\Hydrator\ObjectProperty();
        $tag = new \Application\Model\Tag();
    
        $hydrator->addStrategy('tag', new \Zend\Stdlib\Hydrator\Strategy\ClosureStrategy(
            //Función que gestiona la estrategia de extracción
            function($value){
    
                return($value);
    
            },
            //Función que gestiona la estrategia de hidratacíón
            function($value){
    
                //Al tag obtenido de la base de datos le concatenamos una url
                $value = 'http://programadormalaga.es/'.$value;
                return($value);
    
            }
    
        ));
    
        $resultSet = new \Zend\Db\ResultSet\HydratingResultSet(
            $hydrator, $tag
        );
    
        $tableGateway = new \Zend\Db\TableGateway\TableGateway('tags',$dbAdapter,null,$resultSet);
        $registros = $tableGateway->select();
    
        return new ViewModel(array('tags' => $registros ));
    }
    

    En nuestra vista:

    foreach ($this->tags as $key => $value) {           
    
        echo $value->getTag()."<br/>";
    
    }
    

    Fuente de documentación: Matthew Setter Blog

  • Leyendo feed de datos en Zend Framework 2

    malakana     10 septiembre, 2015     Sin comentario     General, Zend Framework 2

    En Zend trabajar con feed de datos es realmente simple gracias a su componente Zend\Feed . Vamos a un ejemplo para ver su funcionamiento.

    Crearemos un view helper que lea un feed y nos muestre un listado de los links del feed en nuestra web.

    <?php
    /**
     * @author Diego Domínguez
     * @copyright 
     */
    namespace Home\View\Helper;
    
    use Zend\View\Helper\AbstractHelper;
    use Zend\Feed\Reader\Reader as FeedReader;
    
    class Feed extends AbstractHelper
    {
    
        public $url;
    
        public function __construct($urlFeed)
        {
    
            $this->url = $urlFeed;
    
        }
    
        public function getLinks()
        {
    
            $feed = FeedReader::import($this->url);
    
            $html = '<ul id="listadoFeed"  >';
    
            foreach ($feed as $key => $valor) {
    
                $html.= '<li><a href="'.$valor->getLink().'"  target="_blank"  ><span class="glyphicon glyphicon-chevron-right"></span> '.$valor->getTitle().'</a></li>';
            }
    
            $html.= '</ul>';
    
            return $html;
    
        }
    
    }
    

    Instanciamos la clase FeedReader y llamamos al método import, pasandole como parámetro la url del feed. Después procesamos la información obtenida y generamos el html que devolverá la función. Notamos que la clase nos permite el acceso a cada uno de los items del feed mediante funciones predefinidas de acceso como getLink(), getTitle(), getDescription() .

    Lo hacemos accesible desde nuestra vistas configurando en el Module.php:

    public function getViewHelperConfig()
    {
        return array(
          'factories' => array(
            'feed' => function ($sm) {
    
              $helper = new View\Helper\Feed('http://blog.programadormalaga.com/feed/');
    
              return $helper;
    
            },
          ),
        );
    }
    

    Como podemos ver el link del feed es http://blog.programadormalaga.com/feed/ .
    Ahora ya solo queda usar el helper en nuestras vistas, para acceder al helper desde la vista lo hacemos de la siguiente manera:

    <?
    echo $this->feed()->getLinks();
    ?>
    

    El nombre del helper es la clave con la que lo hemos configurado en el Module.php y la función getLinks() la que nos devuelve el listado.

  • Extendiendo Twig en Zend Framework 2

    malakana     3 septiembre, 2015     Sin comentario     Zend Framework 2

    Descargamos una copia del ZendSkeletonApplication y el modulo ZfcTwig, configuramos nuestro composer.json de la siguiente manera y procedemos a instalarlo :

    {
        "name": "zendframework/skeleton-application",
        "description": "Skeleton Application for ZF2",
        "license": "BSD-3-Clause",
        "keywords": [
            "framework",
            "zf2"
        ],
        "homepage": "http://framework.zend.com/",
        "require": {
            "php": ">=5.5",
            "zendframework/zendframework": "~2.5",
            "zf-commons/zfc-twig": "dev-master"        
        }
    }
    

    Desde el terminal ejecutamos:

    composer.phar install
    

    Damos de alta el módulo ZfcTwig en el fichero application.config.php:

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

    Una vez tenemos nuestra copia de ZendSkeletonApplication con el modulo Zfctwig funcionando en nuestro servidor, vamos a proceder a crear nuestra clase para extender la funcionalidad de twig en nuestro proyecto web. Para ello creamos una carpeta llamada Extension dentro de nuestro modulo de trabajo, en este caso la ruta sería Application\src\Application\Extension . Dentro de esta carpeta procedemos a crear la clase que extenderá Twig a la que he llamado MiExtensionTwig, este es el código:

    <?php
    
    namespace Application\Extension;
    
    use Twig_Extension;
    use Twig_SimpleFilter;
    use Twig_SimpleFunction;
    
    class MiExtensionTwig extends Twig_Extension
    {
    
        public function getName() {
            return "MiExtensionTwig";
        }
    
        public function getFunctions() {
    
            return array(
                new Twig_SimpleFunction('htmlImagen', [$this, 'getImagen']
                , array(
                    'is_safe' => array(
                        'html'
                    )
                ))
    
            );        
    
        }
    
        public function getFilters(){        
    
            return array(
                new Twig_SimpleFilter('formatea', [$this, 'formatea']),
                new Twig_SimpleFilter('formateaNumero', [$this, 'formateaNumero']),
    
            );
    
        }
    
        public function getImagen($imagen) {
    
            $filename = basename($imagen);
            return '<img src="' . $imagen . '" class="img-responsive" />';
    
        }
    
        public function formatea($texto){
    
            return(ucfirst(strtolower($texto)));
    
        }
    
        public function formateaNumero($numero){
    
            return(number_format( $numero , '2' , "," ,  "."));
    
        }
    
    }
    

    Como podemos ver la clase que acabamos de crear extiende la clase del módulo de twig Twig_Extension. Según sea el caso de la funcionalidad que queramos extender, usaremos una clase diferente, en este caso hacemos uso de las clases Twig_SimpleFilter y Twig_SimpleFunction puesto que queremos añadir funciones y filtros nuevos a nuestro proyecto. Para darlos de alta necesitamos hacer uso de las funciones getFunctions y getFilters en nuestra clase, cada una de estas funciones devuelve un array donde cada valor representa una funcionalidad concreta. En filtros hemos dado de alta dos filtros nuevos ‘formatea’ y ‘formateaNumero’ además de la funcion ‘htmlImagen’ cada uno de estos tiene su propia funcion donde se detalla la lógica con la que opera.

    Con nuestra clase ya creada, solo nos queda enlazar esta clase en nuestro proyecto a través del module.config.php.

        'zfctwig' => array(
            'extensions' => array(
                'Application\Extension\MiExtensionTwig',
    
            )
        )
    

    Con todo configurado ya solo nos queda hacer uso en nuestras vistas de la nueva funcionalidad y listo.

    <div class="row">
    
        <div class="col-md-3">
            <h3>Extensión de función</h3>
            {{ htmlImagen('img/smiley.jpg') }}
    
        </div>
    
        <div class="col-md-9">
            <h3>Extensión de filtro</h3>
            <p>{{ 'Formateando texto usando filtros en twig'|formatea }}</p>
            <p>Estos números también</p>
            <ul>
            {% for numero in numeros %}
                <li>{{ numero|formateaNumero }}</li>
            {% endfor %}
            </ul>
        </div>
    
    </div>
    

    Link del ejemplo en github:
    Github

    Fuente de documentación:
    Manual oficial de Twig
    y El Blog de Rob Allen

Autor

malakanaMalakanaDesarrollador web freelance, aprendedor

  • F
  • t
  • G
  • l

Temas

  • Doctrine 2 (1)
  • General (6)
  • Oauth 2 (2)
  • Slim Framework (3)
  • Zend Framework 2 (3)

Busca

Diego Domínguez Blog / ProgramadorMalaga.com