December 25th, 2008 Category: linux
3 Comments »

Hace un tiempo desde que probe fluxbox que estoy bastante maniatico con lo extremadamente ligth, de hecho ahora mientras escribo esto estoy tomando una Villa del sur levite (cuack).

Mp3Blaster es un reproductor de mp3 que funciona desde la linea de comando. Tiene una interfaz muy diferente al Winamp y tambien muy diferente la cantidad de recursos que consume, pero hacen lo mismo, reproducir nuestros MP3.

La instalacion como siempre en linux, FACIL. En ubuntu.
$ sudo aptitude install mp3blaster

En cualquier otra distro, hay .deb, y rpm dando vuelta por la red.

Sino se pueden bajar las fuentes desde la pagina de sourceforce de mp3blaster, y hacer el clasico ./configure && make && make install y listo.

Con mp3blaster vamos a poder crear playlist, y reproducir de forma liviana nustros Mp3. Si quieren consumir menos recursos haganlo desde una terminal xterm, y no las pesadas gnome-terminal y komander.

3_snap19

Seguir leyendo

December 19th, 2008 Category: blogzf
11 Comments »

Estos dias medojologo1 estuve debatiendo entre el uso o no de Zend_Dojo. Sinceramente siempre use Jquery, mootools y prototype, la verdad es que en un punto llegan a ser lo mismo, alguna aporta algo que la otra no, pero masomenos tienen el mismo fin, hacernos la vida mas facil, y este no fue el caso de Dojo, ultimamente estaba usando Zend_Dojo para un proyecto, y me costo bastante usarlo, y nunca llegue a aprovecharlo al maximo, termino escribiendo mucho codigo  y no me gusta los resultados que obtengo y tampoco me acostumbro a su sintaxis, tan diferente a la facilidad de mootools. Debido a esto y a una charla con scrammatte decidi usar mootools y no complicarme la vida con estas cosas que no aportan gran cosa. Asi que a partir de ahora vamos a usar Mootools en el blog que estamos desarrollando con Zend Framework, y nos olvidamos de Zend Dojo.

mootoolsUna de las principales razones que desisti de Dojo fue cuando scramatte me mostro Mochaui, enseguida me atrajo esa interfaz tan agradable y practica. Estos dias voy a tratar de adaptar mochaui al Backoffice del blog.

Y no solo van a ver a Mochaui, tambien vamos a empezar a trabajar con otros componentes mas de mootools, como son fvalidator, mootab, porque no mooflow, despues vamos a analizar cual conviene o no implementar, por ahora solo sepan que vamos a trabajar con Mootools.

Seguir leyendo

December 17th, 2008 Category: blogzf Zend Framework
40 Comments »

Zend Form

Hoy vamos a ver como armar los formularios. Para eso vamos a usar la carpeta forms dentro de nuestras vistas, ahí vamos a crear una clase para cada formulario.

Muchas ponen los formularios en el controller y algún que otro loco en el modelo, y también en los helpers, nosotros vamos a crear una clase para que resuelva nuestro problema en la carpeta forms de la vista del modulo correspondiente.

Nuestra clase va a tener un solo método init() y va a extender de Zend_Form.

El ejemplo a continuación es el de login de usuarios, con 3 elementos, usuario, password, y el botón de submit.

setName('authentication');
        /**
         * Creamos un elemento de tipo Text
         * - Seteamos el texto que queremos que represente a este campo
         * - Agregamos un filtro, que hace que cuando enviamos el
         *   fomrulario ponga todo el valor del campo en minuscula
         * - Tambien especificamos que el campo es obligatorio.
         * - Y agregamos el validador para preguntar si el campo es un campo valido
         */
        $username = new Zend_Form_Element_Text('username');
        $username->setLabel('Email')
            ->addFilter('StringToLower')
            ->setRequired(true)
            ->addValidator('NotEmpty', true);
        /**
         * Creamos el elemento tipo password.
         * Aca vamos a generar el campo para la clave
         */
        $password = new Zend_Form_Element_Password('password');
        $password->setLabel('Clave')
            ->setRequired(true)
            ->addValidator('NotEmpty', true);
        /**
         * El boton para enviar el formulario
         */
        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setLabel('Entrar');
        /**
         * Agregamos los elementos al formulario
         */
        $this->addElements(array($username , $password , $submit));
    }
}

Como se habrán dado cuenta nuestro archivo se va a llamar Authentication.php

Cada vez que se instancie y se imprima este objeto nos va a dibujar automaticamente nuestro formulario.

Ahora vamos a llamar a mostrar el formulario en nuestras paginas.

Vamos al controller


_request->isPost()) {
            $credentials = $this->_request->getPost();
            if ($form->isValid($credentials)) {
                $authAdapter = new Zend_Auth_Adapter_DbTable(
                    Zend_Db_Table::getDefaultAdapter(),
                        'users','username','password', 'MD5(?) AND status="ENABLED"');

                // Set the input credential values to authenticate against
                $authAdapter->setIdentity($credentials['username']);
                $authAdapter->setCredential($credentials['password']);
                $result = Zend_Auth::getInstance()->authenticate( $authAdapter );
                if ($result->isValid()) {
                    $this->_redirect('/admin/dashboard/');
                }
                $this->_flashMessenger->addError('usuario incorrecto');
                $form->populate($credentials);
            } else {
                $this->_flashMessenger->addError('Hay datos invalidos o vacios');
                $form->populate($credentials);
            }
        }
        $this->view->form = $form;
    }
}

En nuestro indexAction vemos que lo primero que se hace es instanciar la clase forms_Authentication que creamos anteriormente. Seguidamente tenemos una linea que pregunta si hay datos enviados via post, en nuestro caso esta condicion va a ser falsa porque todavia no enviamos ningun formulario. Asi que vamos a explicar lo que hacemos en caso de que no se haya enviado el formulario aun.

$this->view->form = $form;

Aca estamos pasando a la vista nuestro objeto Form. Para dibujar nuestro formulario desde el controller esto es lo unico que tenemos que hacer.

Ahora pasemos a la vista. Y veamos como queda de complejo nuestro index/index.phtml

form?>

Esto solo y nos deberia mostrar lo siguiente.

login

Ahora que ya tenemos nuestro formulario vamos a completar datos y enviarlo. Completamos con cualquier dato. Pero para probar vamos a completar el usuario y no la clave. Para aprender a usar los Validators.

Si hacemos esto nos deberia aparecer el formulario resaltando el problema por el cual no proceso el formulario.

login-error

Y como hicimos esto?

Muy facil, cuando creamos el formulario, no especificamos a donde queremos que envie los datos, entonces los envia a si mismo.

Esto quiere decir que enviamos un post a indexAction, ahora el condicional if ($this->_request->isPost()) nos va a dar verdadero.

Lo siguiente que preguntamos es si los datos de nuestro formulario son validos, en el caso que lo sean vamos a seguir con el logueo de usuario. En caso contrario vamos a volver a mostrar el formulario con los datos que envio el usuario, y agregano los errores correspondientes, esto lo hacemos llamando al metodo populate de Zend_Form, que solo se encarga de completar los datos que vinieron por post en el elemento correspondiente, y los errores. Lamentablemente los errores estan en ingles, y por ahora vamos a dejarlo asi. Tambien agregamos un error con el flashHelper de Zsamer.

Ahora probemos completar todos los datos, si corresponden a los de la base de datos te va a loguear, y redireccionar a tu dashboard.

Zend Auth.

Una de las cosas que mas me sorprendio cuando empeze con Zend Framework, fue la cantidad de tutoriales sobre este componente. La verdad que no tiene mucha mistica, pero el uso que le damos en blogzf es bastante basico y comun,

Primero instanciamos la clase Zend_Auth_Adapter_DbTable, y le pasamos los datos de nuestra tabla donde guardamos los datos de los usuarios, seteamos la columna donde esta el identificador, y la columna donde esta la clave (credencial).

Ya con la instancia seteamos los datos que vinieron con el formulario.

Y si Zend_Auth::getInstance()->authenticate( $authAdapter )->isValid() nos da true, estamos logueados.

Facil?, si es Zend.

Ahora necesitamos preguntar en cada modulo que lo requiera si el usuario ya esta logueado, en caso que no lo este vamos a redireccionarlo a la pantalla de login. En nuestro sistema lo vamos a hacer desde el plugin de Blogzf_Controller_Plugin_Backoffice.


$auth = Zend_Auth::getInstance();
if ( $request->module == 'admin' ) {
    if( !$auth->hasIdentity() && $request->controller != 'index' ) {
        header('Location: /admin/');
    } elseif ( $auth->hasIdentity()  && $request->controller == 'index' ) {
        header('Location: /admin/dashboard/');
    }
}

Con esto es suficiente.

Seguir leyendo

December 11th, 2008 Category: blogzf Open source Zend Framework
7 Comments »

Primero que nada quiero contarles que se unió scramatte al grupo de trabajo del Blog. Scramatte va a estar desarrollando junto conmigo todo el proyecto, todavía no hay una convocatoria abierta a participar del desarrollo pero los que tengas ganas pueden dejar su comentario.

Esta incorporación voluntaria es muy importante para el proyecto ya que Scramatte ya había empezado a desarrollar un blog con Zend Framework, y tiene bastante experiencia. Si hacen un update del proyecto van a notar grandes cambios. Y digo grandes, porque ya tenemos un Diseño de base de datos mas completo, acorde a las necesidades, y el sistema en el frontend ya adquirió mucha de las funcionalidades.

Por el lado del backoffice (backend/admin), tome prestado otro estilo, no va a ser el definitivo, pero necesitaba una estructura para trabajar. También incorpore el plugin de Zsamer para el manejo de errores. El login ya tomo un poco de forma, y solucionamos algunos problemas con las vistas.

En la parte anterior vimos el uso de módulos dentro de nuestros sistemas. Y anticipamos el ABML de módulos como el de usuario, para los abml vamos a usar los ejemplos de CRUD también del blog de Zsamer, que a mi gusto están muy bien hechos, y además ya podemos usar el manejador de errores.

Otro cambio importante, y es lo que voy a tratar de explicar hoy es la incorporación de 3 externals nuevos. Estos externals son los componentes que necesita Dojo. Voy a hacer lo posible por implementar de la mejor manera este componente, porque tal como me lo describió scramatte, es un monstruo. Lo mas fácil seria usar Mootools o Jquery, pero Zend_Dojo, me parece el mas completo. Por ahora solo vamos a usar Zend Dojo View Helpers.

Lo primero que tenemos que hacer es agregar estos 3 Dojo toolkit como externals, que es la manera correcta de hacerlo, en la carpeta webroot para que pueda ser accedida públicamente, lo ideal seria tener un branch propio donde tengamos el ultimo release de estas Dojo Toolkit en nuestros propios repositorio, pero por ahora no va a hacer falta, y vamos a agregar directamente los repositorios de dojo.

Una vez tengamos los dojo toolkits dentro de nuestro webroot tenemos que habilitar Zend_Dojo en nuestro sistema. La forma que por ahora vamos a usar en nuestro proyecto es poner el código dentro de nuestro plugin de View, y como por ahora solo vamos a usarlo en el Backoffice, vamos a habilitarlo ahí solamente. El código para habilitar Zend_Dojo es el siguiente.

_view->addHelperPath( 'Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper' );
/**
* Ahora habilitamos Zend_Dojo en nuestra vista
*/
Zend_Dojo::enableView( $this->_view );
/**
* Configuracion de Dojo
*/
$this->_view->dojo()->setDjConfigOption( 'parseOnLoad', false );
$this->_view->dojo()->setDjConfigOption( 'userPlainJson', true );
Zend_Dojo_View_Helper_Dojo::setUseDeclarative();

Ahora desde nuestro layout vamos a cargar la librería dojo, como dice el Manual de Zend Framework. Desde el header html de nuestro layout agregamos la siguientes lineas.

        dojo()->isEnabled() ) {
                $this->dojo()->setLocalPath('/js/dojo/dojo.js');
                echo $this->dojo();
            }
        ?>

Esto despues de <?= $this->headScript() ?>.

Con esto ya podemos usar los helpers de Zend_Dojo, y tenemos habilitado la libreria de Dojo. Se que es mas dificil que.

<script src="http://www.google.com/jsapi"></script>
<script>google.load("mootools", "1.11");</script>

Pero a la larga vamos a apreciar esto. La gran integracion de Dojo con Zend Framework es algo muy favorable, y agil. 

En proximas entregas vamos a tratar de darle un poco mas de onda a nuestro backoffice haciendo uso de estas librerias.
Seguir leyendo


December 4th, 2008 Category: Zend Framework
6 Comments »

En los envíos anteriores vimos la forma de crear el frontend, la forma correcta de configurar el layout del sistema y como aprovecharlo. En esta oportunidad vamos a ver dos cosas muy importantes, como son la modularización del sistema, para crear un backend, y como conectarnos a la base de datos con Zend_Db.
Quiero que recuerden que el proyecto esta alojado en google code, pueden ver como esta quedando en http://www.blogzf.com.ar.

- Modularizar el sistema.

Uno de los problemas que me encuentro habitualmente en los foros o las listas de Zend Framework es como tener en un  mismo sistema frontend y Backoffice (backend) compartiendo la misma estructura. Este problema se puede resolver de varias formas, pero la manera correcta es crear módulos. En nuestro sistema actual teníamos el modulo default cargado, que no necesita mas configuracion, que declarar cual es el path de nuestros controllers, con el método setControllerDirectory(), y como parámetro le pasamos un string con el path correspondiente. Con esta acción, le estamos diciendo que el modulo default esta en esa ruta.

Si nosotros quisieramos agregar un modulo mas que en este caso vamos a llamarlo admin, en vez de pasarle un string vamos a pasarle un array, donde el índice va a ser el nombre del modulo, y el valor el path donde encontrar el controller.

Nuestra ruta actual es applications/controller/, esta es la ruta para el default, pero ahora que vamos a agregar un admin necesitamos ubicarlo en otro lugar. Ese lugar lo puede establecer ustedes, yo voy a elegir para guardarlo en applications/admin/controller. Ahora siguiendo esto en la carpeta application nos va a quedar la siguiente estructura.


Esto tiene una particularidad, los controllers de nuestro modulo admin, tienen que tener el prefijo de la carpeta, pero en Mayúscula no en minúscula como lo indica la lógica, ya que la carpeta admin esta en minúscula.

Ahora cuando queramos crear un controller el nombre seria algo así


Pero ya me estoy llendo por otro lado, ahora vamos a ver cual es la forma correcta de agregar los módulos en nuestro bootstrap.

setParam( 'config', 'config.default.ini' )
    ->setControllerDirectory( array(
        'default'=> '../application/controller',
        'admin'=> '../application/admin/controller'))
    ->throwExceptions(true)
    ->dispatch();

Si o si tenemos que crear un modulo con el key default, y el otro es el que queremos agregar. Si quisieramos podríamos agregar muchos mas módulos, pero no es algo que veamos en este proyecto, pero se puede

Si hacen un svn update del proyecto, van a encontrar algunas lineas mas en este código, que son las que levantan los plugins. Pero esto lo dejamos para otra entrega.

- Leyendo una base de datos

Todo blog necesita de una base de datos para almacenar los post, ahora vamos a crear una nueva base de datos llamada blogzf.

Vamos a crear la tabla 'posts', donde vamos a guardar todo el contenido de nuestro blog.

La tabla es la siguiente.

CREATE TABLE `blogzf`.`posts` (
`post_id` MEDIUMINT( 10 ) NOT NULL AUTO_INCREMENT ,
`user_id` MEDIUMINT( 10 ) NOT NULL ,
`title` TEXT NOT NULL ,
`content` LONGTEXT NOT NULL ,
`comment` TINYINT( 1 ) NOT NULL ,
`created_date` DATETIME NOT NULL ,
`modified_date` DATETIME NOT NULL ,
`status` CHAR( 10 ) NOT NULL ,
PRIMARY KEY ( `post_id` )
) ENGINE = MYISAM;

Y la tabla users.

CREATE TABLE `blogzf`.`users` (
`user_id` MEDIUMINT( 10 ) NOT NULL AUTO_INCREMENT ,
`username` CHAR( 50 ) NOT NULL ,
`password` CHAR( 50 ) NOT NULL ,
`display_name` CHAR( 100 ) NOT NULL ,
`status` CHAR( 10 ) NOT NULL ,
PRIMARY KEY ( `user_id` )
) ENGINE = MYISAM;

Ahora vamos a tener que crear un ABML o CRUD (CREATE, READ, UPDATE, DELETE) para estos modulos.

En esta parte no vamos a darle funcionalidad a este modulo, vamos a dejarlo para la proxima, asi podemos extendernos un poco y ver Zend_Paginator, Zend_Form, entre otros.

Lo primero que tenemos que hacer es crear el controller, model, y vista de users, vamos a empezar con el mas facil.

Creamos los actions para nuestro CRUD.


El modelo va a ser bastante simple


Y las vistas.

Un buen ejemplo de como crear un CRUD con Zend Framework  lo tenemos en el blog de Zsamer.
Lo primero que tenemos que hacer es configurar la conexion a la base de datos, los datos de esta lo vamos a poner en nuestro archivo de configuracion, config.default.ini.

[database]
db.adapter = PDO_MYSQL
db.config.host = localhost
db.config.username = blogzf
db.config.password = "password"
db.config.dbname = blogzf

Supongamos que tenemos una base de datos en localhost llamada blogzf,  y un usuario blogzf con la clave "password". esta seria la forma de representarlo en el ini.

Cuando levantamos esta configuracion tenemos que crear una conexion a la base de datos, esto lo vamos a hacer desde el preDispatch, la conexion la vamos a guardar en una variable privada llamada _db, para usarla en todo el modulo.

$this->_db = Zend_Db::factory(
    $config->database->db->adapter,
    $config->database->db->config
    ->toArray() );

Asi como paso con el bootstrap, el config no les va andar porque tienen que crear un archivo config.local.ini, con solo crearlo y dejarlo en blanco es suficiente, la idea de esto es generar un archivo con toda la configuracion generica, y uno que sea configurable para cada ambiente, desarrollo, qa, y Produccion. Pero eso lo vemos mas adelante.

En esta parte vimos

Zend_Config
Zend_Db


Seguir leyendo