• Publicidad

Tutorial de Catalyst Framework

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Tutorial de Catalyst Framework

Notapor preiddy » 2013-10-03 05:03 @252

A partir de hoy y durante varios días publicaré un pequeño tutorial para los que quieran probrar este framework.
El ambiente de trabajo que he usado para hacerlo ha sido un PC con Arch Linux (https://www.archlinux.org/); Kernel 3.7.8-1; MySQL 5.5; Catalyst 5.90020

Lección 1. Instalación de las herramientas necesarias: Catalyst Framework, MySQL...
Instalación de Catalyst
Si se usa Debian/Ubuntu se puede instalar desde apt-get, aunque no contaríamos con la última versión de Catalyst.
Se recomienda instalar mejor desde cpan.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -MCPAN -e 'install Catalyst::Runtime'
  2. perl -MCPAN -e 'install Catalyst::Devel'
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4

También se puede instalar ejecutando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. cpan Catalyst::Runtime
  2. cpan Catalyst::Devel
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

Si queremos que instale los módulos y dependencias necesarias sin tener que estar pendiente de decirle que sí a todo, ejecutamos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. PERL_MM_USE_DEFAULT=1 cpan Catalyst::Runtime Catalyst::Devel
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

Recuerde que si decide instalar el Catalyst usando cpan se debe tener instaladas primero las herramientas necesarias (make, gcc) para compilar en nuestra distribución preferida de Linux.

Una vez instalado y dependiendo de lo que queramos hacer, es necesario ir añadiendo algunos módulos y complementos. Para este proyecto usaremos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -MCPAN -e 'install DBIx::Class'
  2. perl -MCPAN -e 'install DBIx::Class::TimeStamp'
  3. perl -MCPAN -e 'install DBIx::Class::PassphraseColumn'
  4. perl -MCPAN -e 'install Catalyst::Model::DBIC::Schema'
  5. perl -MCPAN -e 'install Catalyst::Model::DBIC::Schema::Types'
  6. perl -MCPAN -e 'install Catalyst::Plugin::DateTime'
  7. perl -MCPAN -e 'install Template Toolkit'
  8.  
Coloreado en 0.011 segundos, usando GeSHi 1.0.8.4

Los tres primeros módulos para trabajar con la base de datos, los dos siguientes son los complementos que requiere Catalyst para funcionar con DBI. El último es un "sistema de procesamiento de plantillas rápido, flexible y altamente extensible... fue creado específicamente para permitir a los diseñadores web y desarrolladores centrarse en la generación de páginas web sin empantanarse en materia de programación" (http://www.template-toolkit.org/). No es el único del que disponemos en Perl. Están Mason 2 y HTML::Template. Uso TT porque me gusta más :D

El proceso de instalación puede tardar un buen rato, depende de la velocidad de conexión a Internet así como de la potencia de nuestro PC.

Tras finalizar el proceso de instalación, ya se puede crear una aplicación. Para ello ejecutamos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. catalyst.pl Proyecto1
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

El comando catalyst.pl crea la estructura y los archivos necesarios para empezar a trabajar. Una vez ejecutado en nuestra terminal veremos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
created "Proyecto1"
created "Proyecto1/script"
created "Proyecto1/lib"
created "Proyecto1/root"
created "Proyecto1/root/static"
created "Proyecto1/root/static/images"
created "Proyecto1/t"
created "Proyecto1/lib/Proyecto1"
created "Proyecto1/lib/Proyecto1/Model"
created "Proyecto1/lib/Proyecto1/View"
created "Proyecto1/lib/Proyecto1/Controller"
created "Proyecto1/proyecto1.conf"
created "Proyecto1/proyecto1.psgi"
created "Proyecto1/lib/Proyecto1.pm"
created "Proyecto1/lib/Proyecto1/Controller/Root.pm"
created "Proyecto1/README"
created "Proyecto1/Changes"
created "Proyecto1/t/01app.t"
created "Proyecto1/t/02pod.t"
created "Proyecto1/t/03podcoverage.t"
created "Proyecto1/root/static/images/catalyst_logo.png"
created "Proyecto1/root/static/images/btn_120x50_built.png"
created "Proyecto1/root/static/images/btn_120x50_built_shadow.png"
created "Proyecto1/root/static/images/btn_120x50_powered.png"
created "Proyecto1/root/static/images/btn_120x50_powered_shadow.png"
created "Proyecto1/root/static/images/btn_88x31_built.png"
created "Proyecto1/root/static/images/btn_88x31_built_shadow.png"
created "Proyecto1/root/static/images/btn_88x31_powered.png"
created "Proyecto1/root/static/images/btn_88x31_powered_shadow.png"
created "Proyecto1/root/favicon.ico"
created "Proyecto1/Makefile.PL"
created "Proyecto1/script/proyecto1_cgi.pl"
created "Proyecto1/script/proyecto1_fastcgi.pl"
created "Proyecto1/script/proyecto1_server.pl"
created "Proyecto1/script/proyecto1_test.pl"
created "Proyecto1/script/proyecto1_create.pl"
Change to application directory and Run "perl Makefile.PL to make sure your install is complete
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Nos cambiamos a la carpeta Proyecto1/ y ejecutamos proyecto1_server.pl que se encuentra dentro de la carpeta script/.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. cd Proyecto1
  2. script/proyecto1_server.pl
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

Con esta instrucción tenemos ya disponible la aplicación recién creada accesible desde nuestro navegador web:

http://localhost:3000

Se nos muestra la pagina genérica que trae el framework.

Si no tenemos instalado MySQL, ahora sería el mejor momento para instalarlo. Lo dejamos a elección del lector el método seleccionado para su instalación. Depende, claro, de la distribución de Linux que usemos.

Si desea saber más sobre la instalación de Catalyst, recomendamos leer http://wiki.catalystframework.org/wiki/ ... ngcatalyst

Eso es todo por hoy. En la próxima entrega crearemos una base de datos en Mysql y trataremos de explicar un poco la organización del framework.
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Publicidad

Tutorial de Catalyst Framework

Notapor preiddy » 2013-10-04 10:58 @498

Lección 2. Crear BD en MySQL y entender el funcionamiento del Framework
Esta segunda lección se encuentra estructurada en dos apartados. El primero referente a la creación de las tablas en MySQL y el segundo conocer un poco los archivos que instaló Catalyst.

Se va a usar MySQL como servidor de BD ya que hay mucho y muy buenos tutoriales que usan Sqlite, pero poco menos con MySQL.

Creamos la base de datos proyecto1 y dentro de ella las siguientes tablas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. CREATE DATABASE proyecto1;
  2. CREATE TABLE IF NOT EXISTS feed (
  3.                 id   int                NOT NULL AUTO_INCREMENT,       
  4.                 name varchar(100)       NOT NULL,
  5.                 url  varchar(3000)      NOT NULL,
  6.                 category int            NOT NULL,
  7.                 last_checked timestamp  NOT NULL,
  8.  
  9.                 PRIMARY KEY ( id )
  10.                 )
  11. ENGINE=InnoDB;
  12. CREATE TABLE IF NOT EXISTS feed_item (
  13.                 id                      int     NOT NULL AUTO_INCREMENT,
  14.                 feed                    int     NOT NULL,
  15.                 url                     longtext,
  16.                 title                   longtext,
  17.                 body                    longtext,
  18.                 posted                  timestamp,
  19.                 hash                    varchar(255),
  20.                 pubdate                 varchar(255),
  21.                 STATUS                  int     NOT NULL,
  22.  
  23.                 FOREIGN KEY feed_item_feed ( feed ) REFERENCES feed ( id ),
  24.                 PRIMARY KEY ( id ),
  25.                 UNIQUE KEY hash ( hash )
  26.                 )
  27. ENGINE=InnoDB;
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Como se menciono al principio, la lección de hoy tiene dos apartados. En el apartado anterior creamos la base de datos, las tablas y las relaciones con que trabajaremos. En este segundo apartado vamos a conocer un poco más los archivos que nos instaló el framework cuando creamos la aplicación.

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Changes               # Archivo para llevar los cambios hechos en la aplicación
  2. lib                   # Directorio de todos los módulos Perl
  3.     Proyecto1         # Carpeta donde están todos los archivos de funcionamiento de la aplicación
  4.         Controller    # Directorio para los módulos de control
  5.         Model         # Directorio donde está el o los modelos
  6.         View          # Directorio para la o las vistas
  7.     Proyecto1.pm      # Archivo base de la aplicación
  8. Makefile.PL           # Makefile para construir la aplicación
  9. proyecto1.conf        # Archivo de configuración, sigue el esquema YAML
  10. README                # Archivo README
  11. root                  # Directorio para los archivos del template, css, javascript. Equivale a htdocs
  12.     favicon.ico
  13.     static            # Directorio para archivos estáticos, como los css
  14.         images        # Directorio que contiene las images que muestra la página de inicio de catalyst
  15. script                    # Directorio para los Perl scripts
  16.     proyecto1_cgi.pl      # Inicia la aplicación como un cgi (no se recomienda su uso)
  17.     proyecto1_create.pl   # Para crear modelos, vistas y controladores
  18.     proyecto1_fastcgi.pl  # Inicia la aplicación como fastcgi
  19.     proyecto1_server.pl   # Inicia el servidor de desarrollo
  20.     proyecto1_test.pl     # Test para probar la aplicación desde la línea de comandos
  21. t                     # Directorio de los test
  22.     01app.t           # Test scaffold      
  23.     02pod.t          
  24.     03podcoverage.t
Coloreado en 0.016 segundos, usando GeSHi 1.0.8.4


Eso es todo por hoy.
En la próxima entrega crearemos la conexión y el modelo para poder trabajar con la base de datos en Mysql. Instalaremos un complemento de tipo CRUD para gestionar los datos en las tablas que hemos creado.
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Catalyst Framework: día 3

Notapor preiddy » 2013-10-07 05:46 @282

Lección 3. Crear el modelo de la BD e instalar el AutoCRUD

Hoy se van a crear los controladores, los modelos y las vistas necesarias para que funcione nuestra nueva aplicación.

Dentro de la carpeta script/, como vimos anteriormente, hay una serie de archivos y todos tiene el nombre del proyecto como prefijo. Los más usados serán proyecto1_server.pl y proyecto1_create.pl

La aplicación que proponemos es sencilla: se cargan algunos canales RSS (feed) en una tabla y almacenamos todos sus ítem publicados en otra tabla (feed_item); todos los ítem almacenados tendrán una serie de palabras claves (tag); así mismo, cada vez que se consulta un ítem se registrará el número de visitas y votos.

Se puede crear manualmente toda la aplicación para que incluya un CRUD, pero ya que estamos, ¿por qué no reutilizar lo que existe? De hecho esa es la filosofía de este framework.

Siguiendo esa filosofía instalamos el plugin que nos monta una herramienta administrativa de cada tabla que tengamos en nuestra base de datos.

Para ello ejecutamos en nuestra terminal:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. cpan Catalyst::Plugin::AutoCRUD
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4


Una vez instalado, se tiene que activar, para ello editamos el archivo Proyecto1/lib/Proyecto1.pm y añadimos el plugin AutoCRUD.

use Catalyst qw/ ... AutoCRUD/;

Listo, ya contamos con una interfaz administrativa para todas las tablas, por defecto es accesible en la URL del servidor:3000/autocrud

Si queremos cambiar esa ruta por defecto añadimos en el archivo Proyecto1/proyecto1.conf la nueva ruta, como se muestra a continuación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
<Plugin::AutoCRUD>
   basepath admin
</Plugin::AutoCRUD>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Si ingresamos ahora no nos mostrará ninguna tabla ya que aún no hemos creado el modelo de nuestra base de datos. De hecho, hasta ahora no hemos creado nada en nuestra aplicación. Para crear un controlador, un modelo o una vista, ejecutamos script/proyecto1_create.pl controller NOMBRE_DEL_CONTROLADOR que queramos crear. Igual para los modelos y las vistas, como veremos más adelante.

Cuando catalys.pl creó la aplicación nos añadió un primer controlador, el controlador principal, que se encuentra en Proyecto1/lib/Proyecto1/Controller/Root.pm. Se encarga de mostrar el index que se ve cuando se ingresa por primera vez a la aplicación desde el navegador.

Como toda aplicación que vamos a crear requiere de una base de datos lo mejor será crear el modelo de la misma; para ello ejecutamos: script/proyecto1_create.pl model DB DBIC::Schema Proyecto1::Schema \create=static naming=current use_namespaces=1 \ components=TimeStamp dbi:mysql:proyecto1 'usuario' 'clave' '{ AutoCommit => 1 }'

Si volvemos a levantar el servidor de desarrollo (script/proyecto1_server.pl) e ingresamos la ruta http://localhost:3000/autocrud veremos las tablas que componen la base de datos creada anteriormente.

Para ver en la terminal las consultas SQL que realiza la aplicación a la base de datos, se ejecuta antes
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. export DBIC_TRACE=1
  2. script/proyecto1_server -r -d
Coloreado en 0.014 segundos, usando GeSHi 1.0.8.4


El -r (recursivo) indica que escuche y se actualice automáticamente la aplicación. Así, si modificamos algo en los archivos del proyecto lo tendremos disponible desde el navegador sin tener que cancelar y volver a ejecutar.


Eso es todo por hoy.
En la próxima entrega crearemos la vista para el sitio web y un controlador para mostrar los ítem.
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Re: Tutorial de Catalyst Framework

Notapor preiddy » 2013-10-08 07:16 @344

Lección 4. Crear la vista para el nuevo sitio web y el controlador para los ítemes

Ya hemos montado una interfaz para "administrar" nuestras tablas, ahora lo interesante sería mostrar la información en una página web y, de ser posible, con una bonita presentación. Bien, crearemos un controlador para mostrar los artículos de cada feed que añadamos y estableceremos algunos comportamientos.

Creamos el controlador y le llamaremos items. Ejecutamos script/proyecto1_create.pl controller items

Ya tenemos dentro de la carpeta /lib/Proyecto1/Controller/ el controlador items.pm. Así mismo, el framework ha creado el correspondiente test en la carpeta t/controller_items.t

Abrimos /lib/Proyecto1/Controller/items.pm y veremos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub index \:Path :Args(0) {
  2.     my ( $self, $c ) = @_;
  3.     $c->response->body('Matched Proyecto1::Controller::items in items.');
  4. }
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

El $c->response->body('Matched Proyecto1::Controller::items in items.') es el mensaje que se mostrará en el navegador, es un mensaje creado automáticamente por Catalyst.

Ahora bien, si tratamos de ingresar vía web a la página items no se nos mostrará nada, nos saldrá el bonito 'Page not found' definido en el controlador Root.pm.

Para que podamos ver el mensaje que crea el framework por defecto para cada controlador (Matched Proyecto1::Controller::items in items.), es necesario que se añada la Vista. Catalyst nos permite emplear diversos tipos de vistas, desde las típicas HTML hasta la generación de documentos PDF. Este procedimiento se realiza una sola vez si solo queremos generar páginas HTML; si queremos generar otro tipo de salida sí es necesario añadir la correspondiente vista.

A continuación, crearemos una vista HTML. Disponemos de varias herramientas ("templates") para generar HTML: Template::Toolkit (TT); Mason 2; HTML::Template, entre otros. Nosotros usaremos Template::Toolkit (TT), ya que él por si mismo es un framework para generar HTML y, como dicen ellos en su web, se puede procesar todo tipo de textos: HTML, XML, CSS, JavaScript. Destacar que podemos trabajar de dos maneras con TT: fácil y más fácil. Al ejecutar la fácil (script/proyecto1_create.pl view HTML TT) nos crea la vista y nada más, hay que ir definiendo las estructuras de los directorios donde estarán todos los templates (archivos) HTML, en la medida que el usuario quiera trabajar la visualización. La más fácil es que nos cree las estructuras de directorios y nos instale un diseño de página para mostrar los datos. Usaremos la segunda opción, script/proyecto1_create.pl view HTML TTSite

Con TTSite le hemos dicho que cree toda la "lógica" de la web. Por tanto, ahora tenemos los siguientes directorios y archivos en nuestra aplicación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
created " ../lib/Proyecto1/View/HTML.pm"
created " ../root/lib"
created " ../root/src"
created " ../root/lib/config"
created " ../root/lib/config/main"
created " ../root/lib/config/col"
created " ../root/lib/config/url"
created " ../root/lib/site"
created " ../root/lib/site/wrapper"
created " ../root/lib/site/layout"
created " ../root/lib/site/html"
created " ../root/lib/site/header"
created " ../root/lib/site/footer"
created " ../root/src/welcome.tt2"
created " ../root/src/message.tt2"
created " ../root/src/error.tt2"
created " ../root/src/ttsite.css"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Todos las plantillas que usaremos tendrán la extensión tt2. Dentro pondremos código HTML y TT.

Ahora podremos hacer unos pequeños cambios en Root.pm para mostrar la página de inicio que aporta por defecto el TT, así como la página de errores.

Cambiamos $c->response->body( $c->welcome_message ); por $c->stash->{ template } = 'welcome.tt2';

Cambiamos en Root.pm que el manejo de errores use el template que nos ha creado TT; para ello sustituimos:

$c->response->body( 'Page not found' );
$c->response->status(404);


por esto:

$c->stash->{ template } = 'error.tt2';

Hasta este momento parece que no hemos hecho muchas cosas, ya que aún no hemos escrito apenas código en la aplicación y ahora es que llegamos (por fin) a modificar la primera línea. Hemos hecho mucho y por eso creo que este es de los mejores framework que hay en la actualidad para la programación web.

Tiene automatizado una gran cantidad de tareas que con solo una instrucción tenemos un servidor web instalado y ejecutando nuestra aplicación. Sin tener que modificar archivos del servidor web con que se trabaje, y claro que se tendrá en algún momento, si así lo requiere el proyecto, configurar un servidor web.

Dejamos a la libertad del lector explorar el contenido de cada archivo que se han creado con TTSite. Seguro que surgirán dudas, así que no duden en preguntar.

A manera de resumen, esto es todo lo que hemos hecho hasta el momento:
  • Añadido modelo, vista y controlador:
    • script/proyecto1_create.pl model DB DBIC::Schema Proyecto1::Schema \create=static naming=current use_namespaces=1 \ components=TimeStamp dbi:mysql:proyecto1 'usuario' 'clave' '{ AutoCommit => 1 }'
    • script/proyecto1_create.pl view HTML TTSite
    • script/proyecto1_create.pl controller items
  • Hemos usado el servidor web incorporado (built in testserver), al cual se le pueden pasar algunos parámetros como -r para 'restart' de forma automática cuando hacemos cambios en la aplicación. -d para ver el modo depurado por pantalla.
    script/proyecto1_server.pl
Finalmente, tenemos en nuestra aplicación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
.-----------------------------------------------------------------+----------.
| Class                                                           | Type     |
+-----------------------------------------------------------------+----------+
| Proyecto1::Controller::AutoCRUD::AJAX                           | instance |
| Proyecto1::Controller::AutoCRUD::DisplayEngine::ExtJS2          | instance |
| Proyecto1::Controller::AutoCRUD::DisplayEngine::Skinny          | instance |
| Proyecto1::Controller::AutoCRUD::Root                           | instance |
| Proyecto1::Controller::AutoCRUD::Static                         | instance |
| Proyecto1::Controller::Root                                     | instance |
| Proyecto1::Controller::items                                    | instance |
| Proyecto1::Model::AutoCRUD::StorageEngine::DBIC                 | instance |
| Proyecto1::Model::DB                                            | instance |
| Proyecto1::Model::DB::Feed                                      | class    |
| Proyecto1::Model::DB::FeedItem                                  | class    |
| Proyecto1::View::AutoCRUD::JSON                                 | instance |
| Proyecto1::View::AutoCRUD::TT                                   | instance |
| Proyecto1::View::HTML                                           | instance |
'-----------------------------------------------------------------+----------'
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La próxima entrega cargaremos y mostraremos los ítemes.
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Re: Tutorial de Catalyst Framework

Notapor preiddy » 2013-10-09 04:22 @223

Lección 5. Cargar y Mostrar los ítemes

Ya tenemos casi todo listo para empezar a trabajar en lo que realmente nos interesa y no es otra cosa que ver en nuestra página web los registros que tenemos en nuestra base de datos. Aunque si nos fijamos bien y hemos seguido al pie de la letra este documento, aun no tenemos registros en ninguna tabla de nuestra base. Vamos a nuestra interfaz de administración (AutoCRUD) y agregamos algunos feeds en la tabla de feeds.

Novedades en Perl en Español: noticias-del-sitio/news/digest/forum.xml.gz
Foro Básico: basico/news/digest/forum.xml.gz
Foro Web: cgi/news/digest/forum.xml.gz


Hecho esto, es necesario cargar los ítemes de esos canales. Para ello podemos hacerlo de varias formas, pero para empezar lo haremos como una tarea externa: creamos en la raíz del proyecto la carpeta tareas y un script de Perl que se llame rss_item.pl.

Este script se conectará con nuestra base de datos y se traerá todos los feeds que hemos añadidos e insertará en la tabla feed_item cada ítem de dicho feeds. Se preguntarán por qué lo hacemos así y no lo añadimos dentro de un controlador en la aplicación. La respuesta es que queremos mostrar cómo podemos usar nuestra aplicación como una "librería".

Hay que tener instaladas las siguientes librerías, sino se tienen ya:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -MCPAN -e 'LWP::Simple'
  2. perl -MCPAN -e 'XML::Feed'
  3. perl -MCPAN -e 'Digest::MD5'
  4. perl -MCPAN -e 'Encode'
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4


Ahora el contenido de rss_item.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use FindBin qw( $Bin );
  5. use lib "$Bin/../lib";
  6. use Proyecto1;
  7. use Proyecto1::Model::DB;
  8. use LWP::Simple;
  9. use XML::Feed;
  10. use Digest::MD5 qw(md5_hex);
  11. use Encode qw(encode_utf8);
  12.  
  13. # Get a database connection
  14. my $schema = Proyecto1::Schema->connect( Proyecto1->config->{'Model::DB'}->{connect_info} );
  15.  
  16. # Get the list of feeds to check
  17. my @feeds = $schema->resultset('Feed')->all;
  18. foreach my $feed (@feeds) {
  19.  
  20.     # Read in the feed
  21.     my $xmlfeed = XML::Feed->parse( URI->new( $feed->url ) );
  22.     if ($xmlfeed) {
  23.  
  24.         # Read each items
  25.         foreach my $item ( $xmlfeed->entries ) {
  26.             my $clave = md5_hex( encode_utf8( $item->link ) );
  27.             $feed->add_to_feed_items(
  28.                 {   url    => $item->link,
  29.                     title  => $item->title,
  30.                     body   => $item->content->body,
  31.                     posted => $item->modified,
  32.                     hash   => $clave,
  33.                     status => 1,
  34.                 }
  35.             );
  36.         }
  37.     }
  38. }
  39.  
Coloreado en 0.016 segundos, usando GeSHi 1.0.8.4

Es necesario en el archivo de configuración proyecto1.conf añadir la conexión a la base de datos:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <Model::DB> 
  2.     schema_class Proyecto1::Schema 
  3.     <connect_info> 
  4.         dsn    dbi:mysql:proyecto1 
  5.         user    nombre 
  6.         password  clave 
  7.         AutoCommit 1 
  8.         # Quote SQL in case of reserved words (notably, 'user' and 'order' tables) 
  9.         quote_char ` 
  10.         # Force MySQL to be more ANSI-compliant 
  11.         on_connect_call set_strict_mode 
  12.     </connect_info> 
  13. </Model::DB> 

Al ejecutar nos cargará los últimos feeds de los foros.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. tareas/rss_item.pl
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4


Ahora mostraremos todos los ítemes de la tabla en una lista. Ya por fin modificamos el controlador items y empezamos a tocar la aplicación. Por norma, toda subrutina en un controlador que quiera enviar o devolver algún resultado en la web, tiene que tener un archivo html asociado, el cual se debe llamar de igual manera.

Modificamos la subrutina index() para que muestre todos los registros que tenga la tabla FeedItem y el resultado lo mande a la template index.tt2.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub index : Path : Args(0) {
  2.      my ( $self, $c ) = @_;
  3.  
  4.      $c->stash( items  => [$c->model('DB::FeedItem')->all]);
  5.      $c->stash( template   => 'items/index.tt2');
  6. }
  7.  
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4

Creamos la carpeta root/src/items y añadimos el archivo index.tt2 lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. [%- FOREACH news_post IN items %]
  2. <a href="[% news_post.url %]"> [% news_post.title | html %] </a> <br>
  3. [% news_post.body | html %]<br>
  4. [%- END %]
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4

Nos conectamos al localhost:3000/items y ¡listo!

Con lo visto hasta ahora es suficiente por hoy, hemos usado la aplicación como una librería para cargar los ítemes, en el controlador nos hemos conectado al modelo para que nos diera todos los registros de la tabla FeedItem y el resultado lo mostramos en la página index.tt2.
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Re: Tutorial de Catalyst Framework

Notapor preiddy » 2013-10-16 15:57 @706

Lección 6. Mostrar más información de un ítem

En la lección anterior mostramos un listado de feeds, ahora bien, lo modificaremos para que el título del feed sea un enlace a una página que nos muestre más información.

Para ello modificamos el controlador, la página index de ítemes y agregamos la página de view_items.

Lo primero es modificar el controlador y añadir la subrutina para mostrar el ítem seleccionado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub view_items : Path('view_items') Args(1){
  2.     my ( $self, $c, $itemid ) = @_;
  3.     $c->stash( items => [ $c->model('DB::FeedItem')->search( { id => $itemid } ) ] );
  4.     $c->stash( template   => 'items/view_items.tt2');
  5. }
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4

Lo que acabamos de añadir captura un argumento "Args(1)" y se lo pasa a la instrucción "search" que lo buscará en la tabla de la base de datos.

Ahora modificamos el index y añadimos enlace a la página view_items
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <a href="[% c.uri_for( '/view_items', news_post.id ) %]">[% news_post.title | html %]</a>
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Para construir la URL podemos usar el método anterior o simplemente usar la forma en como se hace con HTML de siempre. La opción "| html" es un filtro de TT para escapar caracteres, el cual ayuda a evitar el Cross Site Scripting.

Finalmente la página view_items:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. [% FOREACH item IN items %]
  2. <p>Id: [%item.id%]</p>
  3. <p>feed: [%item.feed%]</p>
  4. <p>url: [%item.url%]</p>
  5. <p>title: [%item.title%]</p>
  6. <p>body: [%item.body%]</p>
  7. <p>posted: [%item.posted%]</p>
  8. <p>hash: [%item.hash%]</p>
  9. <p>pubdate: [%item.pubdate%]</p>
  10. <p>status: [%item.status%]</p>
  11. [% END %]
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Cosas que se pueden hacer y que trataré en la medida de lo posible mostrar en otras lecciones:
  • Paginar los resultados, aunque sigo sin dar con una forma de hacerlo que no resulte tan compleja que las que he visto hasta ahora
  • Añadir un diseño gráfico más apropiado a los nuevos tiempos. Por ejemplo el uso de un framework CSS como 90grid o Bootstrap
  • Añadir comentarios y votos a los ítemes.
Última edición por preiddy el 2013-10-18 15:08 @672, editado 1 vez en total
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado