Páginas

lunes, 3 de diciembre de 2012

Zend y Symfomy el equipo perfecto

Una diapositiva muy interesante que conseguí leyendo un poco los temas que se trataron en la ZendCon 2012 Espero que sirva un poco, para ver las cosas que se pueden hacer si se siguen bien los standares, saludos

miércoles, 8 de agosto de 2012

Script de comparación entre rangos de fechas

Este es un pequeño script que realice para dar una respuesta en foros del web, y me pareció que vale la pena compartirlo, ando un poco fiebruo con eso de los closures, por lo que me hice uno para hacer este script


date_default_timezone_set('UTC');

$rangeBettweenRange = function(array $range1, array $range2) {
    $from1 = new DateTime($range1[0]);
    $to1 = new DateTime($range1[1]);
    $from2 = new DateTime($range2[0]);
    $to2 = new DateTime($range2[1]);    

    $range1Diff = $from1->diff($to1);    

    for($i = 0; $i <= $range1Diff->days; $i++) {    
        if($from1 >= $from2 && $from1 <= $to2) {
            $return[$from1->format('d-m-Y')] =  "in the range 
";
        } else {
            $return[$from1->format('d-m-Y')] = "out the range
";
        }
        $from1->modify("+1 day");        
    }
    return $return;
};

El resultado es algo como esto
Array
(
    [01-01-2012] => out the range

    [02-01-2012] => out the range

    [03-01-2012] => out the range

    [04-01-2012] => out the range

    [05-01-2012] => out the range

    [06-01-2012] => out the range

    [07-01-2012] => out the range

    [08-01-2012] => out the range

    [09-01-2012] => out the range

    [10-01-2012] => out the range

    [11-01-2012] => out the range

    [12-01-2012] => out the range

    [13-01-2012] => out the range

    [14-01-2012] => out the range

    [15-01-2012] => in the range 

    [16-01-2012] => in the range 

    [17-01-2012] => in the range 

    [18-01-2012] => in the range 

    [19-01-2012] => in the range 

    [20-01-2012] => in the range 

    [21-01-2012] => in the range 

    [22-01-2012] => in the range 

    [23-01-2012] => in the range 

    [24-01-2012] => in the range 

    [25-01-2012] => in the range 

    [26-01-2012] => in the range 

    [27-01-2012] => in the range 

    [28-01-2012] => in the range 

    [29-01-2012] => in the range 

    [30-01-2012] => in the range 

    [31-01-2012] => in the range 

)
el que hacer con el resultado ya queda del desarrollador. Espero que el script sea de utilidad, saludos

jueves, 26 de julio de 2012

Temas más vistos y con más respuestas de MyBB Forum con YiiFramework

En esta entrada compartiré unos pequeños script que realice para la gente de yiiframework en español, esarriba, como hacerlo, luego en un proyecto creado con YiiFramework generamos el modelo Threads con la herramienta Gii de YiiFramework, también necesitaremos generar el modelo Posts,  un simple script que nos permite por medio de YiiFramework conocer los temas más vistos y con más respuestas de un foro de MyBB.

Aclarando que ya tenemos que tener configurado el foro de MyBB, pueden ver en el enlace que se dejo

arriba como hacerlo, luego en un proyecto creado con YiiFramework generamos el modelo Threads con la herramienta Gii de YiiFramework, también necesitaremos generar el modelo Posts ambos extienden del Active Record de Yii, comenzamos a trabajar en nuestro código








Lo primero es hacer la relación entre ambos models/Threads.php
    /**
     * @return array relational rules.
     */
     public function relations()
     {
        // NOTE: you may need to adjust the relation name and the related
 // class name for the relations automatically generated below.
 return array(
     'posts' => array(self::HAS_MANY, 'posts', 'tid'),
 );
     }
models/Posts.php
    /**
     * @return array relational rules.
     */
     public function relations()
     {
        // NOTE: you may need to adjust the relation name and the related
 // class name for the relations automatically generated below.
 return array(
            'threads' => array(self::BELONGS_TO, 'Threads', 'tid'),     
 );
     }

De esta manera tenemos la relación, una vez establecemos esto, realizamos el método hotpost, que es el que nos da los datos que necesitamos

/**
* hotThread return the hot threads of the foro
* @param  string  $type   [description]
* @param  integer $length [description]
* @return [type]          [description]
*/
public function hotThread($type = 'views', $length = 5)
{
    if($type == 'views') { //shows the hotpost for views
        $criteria = new CDbCriteria();
 $criteria->select = 'tid, subject, views, dateline, username';
 $criteria->with = array(
     'posts'=>array(                     
         'joinType'=>'LEFT JOIN', 
         'order' => 'pid',                     
         ),
 );   
 $criteria->order = 'views DESC';
 $criteria->together = true;   
 $criteria->limit = $length;
        $dataProvider = new CActiveDataProvider($this, array(
            'criteria' => $criteria,                                    
            'pagination'=>array(
                'pageSize'=>20,
            ),
        ));            
    } elseif($type == 'answerd') { //show the hotpost by answerd
        $criteria = new CDbCriteria();
 $criteria->select = 'tid, COUNT(posts.tid) as length, subject, views, dateline, username';   
 $criteria->order = 'length DESC'; 
 $criteria->with = array(
     'posts'=>array(                    
         'joinType'=>'RIGHT JOIN',  
         'order' => 'pid',         
         ),
 );
 $criteria->together = true;   
 $criteria->group = 'posts.tid';
 $criteria->limit = $length;
        $dataProvider = new CActiveDataProvider($this, array(
            'criteria' => $criteria,                                                    
        ));
    }
    return $dataProvider;
}

Como vemos estamos obteniendo un nuevo atributo para la categoría por respuesta, entonces tenemos que agregar a nuestra clase Threads el atributo length


class Threads extends CActiveRecord
{
    public $length;
    /*...*/   
Ya que obtuvimos los hotpost por su respectiva categoria (visitas y respuestas), ahora realizaremos el controller, controllers/SiteController.php
public function actionHotpost()
{        
    $threads = new Threads();  
    $dataProviderVisitPost = $threads->hotThread('views');
    $dataProviderMostAnswerdPost = $threads->hotThread('answerd');
    $this->render('index-test',array(
        'dataProviderVisitPost'=>$dataProviderVisitPost,
        'dataProviderMostAnswerdPost' => $dataProviderMostAnswerdPost)
    );                
}

Ahora, hacemos la vista, esta consta de un CListView,
views/site/index-test.php


pageTitle=Yii::app()->name; ?>

h1="">
titulo de la pagina
/h1>
h2="">
Temas más Visitados
widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProviderVisitPost,
    'itemView'=>'_hotpostitem', 
));?>

h2="">
Con mayor numero de respuesta /h2>
widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProviderMostAnswerdPost,
    'itemView'=>'_hotpostitemvisit',   
));?>

Disculpen los horrores en las etiquetas html, no le tengo instalado plugin para codigo al blog, por eso no esta el principio <.

Ahora solo nos queda realizar el código de
views/site/_hotpostitem.php


div class="view">     
   h2>subject); ?>/h2>
   span>Creado por: username);?> en la fecha dateline));?>/span>
   p>Visto: views); ?>/p>  
   p>posts[0]->message, 0, 350)); ?>/p>   
   a href="http://localhost/mybb/Upload/showthread.php?tid=tid)?>" alt="leer mas">Leer mas/a>
/div>
Y de views/site/_hotpostitemvisit.php
div class="view">     
   h2>subject); ?>/h2>
   span>Creado por: username);?> en la fecha dateline));?>/span>
   p>Cantidad de Respuestas: length - 1); ?>/p>  
   p>posts[0]->message, 0, 350)); ?>/p>   
   a href="http://localhost/mybb/Upload/showthread.php?tid=tid)?>" alt="leer mas">Leer mas/a>
/div>
Espero que este sirva de agrado a los que lo lean, el código pronto estará en github, en la cuenta de yienespanol y en la de mi persona, saludos

sábado, 14 de julio de 2012

CrugeMailer una extensión para enviar correos electrónicos con YiiFramework

Buenas esta entrada es para presentar la librería CrugeMailer, es una librería para enviar correos electrónicos con YiiFramework, simple de configurar, simple de usar implemeta la librería Swiftmailer para enviar correos electrónicos con php.

¿Como la usamos?

Clonamos la librería en la carpeta extensions de nuestra aplicación "pathapplication/protected/extensions"

cd /pathapp/protected/extensions/
git clone https://github.com/carlosbelisario/crugemailer

Necesitamos también la librería swiftmailer para esto realizamos los siguiente

git submodule init
git submodule update

Una vez tenemos la librería instalada la librería tenemos que hacer la configuración en el main


'import'=>array(
    'application.models.*',
    'application.components.*',
    'application.extensions.crugemailer.*',        
),

'component' => array(
/*...*/
    'crugemailer'=>array(
         'class' => 'application.extensions.crugemailer.CrugeSwiftMailer',
         'mailfrom' => 'christiansalazarh@gmail.com',
         'transport' => 'gmail' // gmail para usar el stmp de gmail (recomendado), no especificarlo trabajara la librería con la función mail de php
         /**
         *
         * obligatorios si el transporte es gmail
         */
         'gmailAcount' => 'carlos.belisario.gonzalez@gmail.com',
         'gmailPassword' => 'password de gmail',       
         'subjectprefix' => 'Prefijo que deseas agregar, es opcional - ',
    ),
);
Luego de tenerla configurada simplemente cuando necesitemos mandar un mail lo que debemos hacer es lo siguiente


Yii::app()->crugemailer->sendEmail('el cuerpo de lo que va a ser enviado en el mensaje',
    /*destinatario del mensaje*/array('carlos.belisario.gonzalez@gmail.com'),
    array('contac@midominio.com'),/*opcional puede configurarse en 
        el application/config/main*/ 
    'Asunto del Correo Electrónico'/*opcional*/);


Y ya estamos enviando correos electrónicos desde YiiFramework con la librería swiftmailer

Espero que la librería les sea útil, esta todavía en desarrollo para mas funcionalidades pero actualmente ya envia los correos, saludos

sábado, 30 de junio de 2012

Configurando la Extensión YiiDoctrine2Orm


Buenas en esta entrada indicaré cada uno de los pasos a seguir para configurar la extensión YiiDoctrine2Orm y tener disponible el popular ORM Doctrine2 en una aplicación creada con YiiFramework, esta entrada me surge de el pequeño trabajo que me dio configurarla (ya que en la web oficial no tienen un tutorial paso a paso de la configuración) aunque abriendo los archivos de la extensión es muy intuitiva e incluso te traen el main.php y console.php de ejemplo para que puedas tener esta librería a disposición.

Lo primero que tenemos que hacer claro esta es bajar los archivos de la extensión desde la página del proyecto, también tenemos que tener instalado también Doctrine 2 en nuestro equipo personalmente tengo el ORM en un repositorio separado a la de los proyectos y tengo un link a las carpetas del proyecto para poder hacer las actualizaciones al mismo y que este cambie en todos los proyectos que uso (en desarrollo cuando pasa a producción si es en un servidor externo hay que copiar las librerías).

Una vez tenemos el ORM y la extensión de YiiFRamework, descomprimimos la carpeta d2ormext-1.0.1.zip, en la carpeta "/applicationpath/protected/extensions/", una vez descomprimida ingresaremos a la carpeta "/applicationpath/protected/extensions/Wildkat/YiiExt/DoctrineOrm/vendor/Doctrine/" y hacemos lo siguiente


ln -s /ruta/hacia/doctrine2/lib/vendor/doctrine-common Common
ln -s /ruta/hacia/doctrine2/lib/vendor/doctrine-dbal DBAL
ln -s /ruta/hacia/doctrine2/lib/vendor/doctrine-build-common build-common
ln -s /ruta/hacia/doctrine2/lib/Doctrine/ORM ORM

Ahora nos posicionamos en la carpeta "/applicationpath/protected/extensions/Wildkat/YiiExt/DoctrineOrm/vendor/Symfony" y hacemos el siguiente enlace

ln -s /ruta/hacia/doctrine2/lib/vendor/Symfony/Component Component


Una vez tenemos estos archivos debemos hacer lo siguiente en nuestro archivo applicationpath/protected/config/main.php y applicationpath/protected/config/console.php

agregamos la siguiente linea antes del arreglo

Yii::setPathOfAlias('Wildkat', realpath(dirname(__FILE__) . '/../extensions/Wildkat'));

luego en el indice componente del arreglo agregamos lo siguiente 

'components'=>array(
    // los componentes que ya tengamos configurados
    'doctrine' => array(
     'class' => 'Wildkat\YiiExt\DoctrineOrm\DoctrineContainer',
     'dbal' => array(
         'default' => array(
             'driver' => 'pdo_mysql',
             'host' => 'localhost',
             'dbname' => 'dbname',
             'user' => 'userdb',
             'password' => 'passworddb',
         ),
     ),
     'cache' => array(
         'default' => array(
             'driver' => 'ArrayCache',
             'namespace' => '__app',
         ),
     ),
     'entityManager' => array(
         'default' => array(
             'connection' => 'default',
             'metadataCache' => 'default',
             'queryCache' => 'default',
             'entityPath' => 'application.models.entities',
             'mappingDriver' => 'YamlDriver',
             'mappingPaths' => array(
                 'application.models.entities'
             ),
             'proxyDir' => 'application.data',
             'proxyNamespace' => 'Proxy',
         ),
     ),
 ),
persomalmente cambie la carpeta donde que hace el mapping a la misma donde creo las entidades "application.models.entities", sin embargo cada quien puede configurarla donde desee.


Una vez tenemos esta configuración ahora tenemos que copiar el archivo applicationpath/protected/extensions/Wildkat/YiiExt/DoctrineOrm/commands/DoctrineOrmCommand.php a la carpeta applicationpath/protected/commands para tener disponible en yiic las ordenes para trabajar con doctrine.


Como se indico la extensión es muy intuitiva para configurar, ahora lo que nos queda es usar el ORM en nuestras aplicaciones de YiiFramework si no deseamos trabajar con el Active Record por defecto que trae el mismo, saludos espero que sea de ayuda este post

domingo, 24 de junio de 2012

Comparación simple entre algunas extensiones para el control de acceso de YiiFramework


Como lo prometido es deuda, estuve jugando un poco con las extensiones para control de acceso que me recomendaban en la Página de facebook de YiiFramework en Español, a partir de esto realice una pequeña comparación entre las que me comentaban, espero que pueda servir de ayuda al momento de la elección, aunque la comparación no esta muy detallada ya que no ligue ninguna con un gestor de usuarios como tal, sin más preámbulos vamos a la comparación 

Es el componente que trae el framework por defecto, simplemente lo importamos, y hacemos una configuración tan simple como crear una base de datos o incluso un archivo llamado auth.php como lo indican acá en este post http://www.yiiframework.com/wiki/65/how-to-setup-rbac-with-a-php-file/, simplemente sencillo de trabajar, fácil de configurar por lo tanto es la elección de muchos que les gusta hacer su propia gestión de control de acceso, como bien me recomendaba una persona en la conversación que tuvimos en la Página de facebook de YiiFramework en Español

Actualmente es el que tengo en un proyecto ya que hasta ahora estaba buscando cual extensión se me hacía mejor para este tema del control de acceso.


En las pruebas realizadas a esta extensión, pude notar facilidad para configurarlo, tan simple como seguir los pasos de la documentación que colocan en la web de la extensión, aunque en la línea de la clase de configuración para el login 
'class'=>'modules.srbac.components.SDbAuthManager'
” falto colocar al principio el application al principio para que pudiera el autoload cargarlo, sin embargo una vez configurado correctamente
'class'=>'application.modules.srbac.components.SDbAuthManager'

, es algo intuitivo para cualquier usuario que trabaje con el framework se da cuenta de que falta ese detalle para que logre iniciarse el modulo, una vez establecido la interfaz aunque me habían comentado que deja que desear, me pareció fácil de manejar y muy simple para el momento de manejar los roles, tareas y operaciones de los usuarios, ya esta internacionalizado para nuestro lenguaje, solo vi un pero corrijan si estoy errado o si hubo una mala configuración de mi parte (ando comenzando con el framework así que puede pasar), me dejo ingresar al módulo de srbac sin pedirme ningún login (a mi manera de ver un fail ya que le estoy dando a cualquier visitante la oportunidad de tener el control de mis listas de acceso), aunque en mi investigación según vi en algunos foros, se resuelve con un condicional (aunque sigo pensando la extensión debería de tenerlo en cuenta porque es la seguridad), sin embargo muy intuitivo y para los que están acostumbrados a utilizar authManager seguro se les hará simple ya que esta basada en esta.


El más recomendado en la Página de facebook de YiiFramework en Español, y cuando lo instalamos podemos ver el porque, simple, una interfaz mas limpia en cuanto a la estructura del html se refiere, fácil de instalar y configurar, la documentación super detallada, tiene la traducción a nuestro lenguaje, en fin una excelente herramienta para trabajar el control de acceso, no le encontré ningún pero, ya veo el porque es tan recomendada, me hablaron de integrarla con yiiUser, pero como estaba tocando el tema solo de control de acceso no quise darle ventajas a ninguna extensión. Aunque tiene una ventaja en lo personal esta en github https://github.com/schmunk42/yii-rights solo un git clone y ya tenemos nuestra extensión en la carpeta de la aplicación


Es mas que un simple control de acceso es un sistema completo de usuario que gestiona varios componentes, es decir te monta la gestión de usuarios con tan solo una configuración simple, es mucho mas complejo que los mencionados anteriormente ya que esta basado en diferentes módulos, para los que necesitan la gestión de usuarios ya montada YUM es la elección, ya que tiene todo lo relacionado a registros asignación de permisos creación de permisos, en lo personal para proyectos a grandes rasgos creo que es la elección, pueden ver acá todo lo que esta ofrece http://code.google.com/p/yii-user-management/ y por supuesto descargar y probar esta excelente extensión

Una vez probadas todas las extensiones claro que YUM esta por encima de las otras motivado a que esta tiene toda la gestión de usuarios, sin embargo como indique en el grupo la veo muy compleja para proyectos a pequeños rasgos (aunque siempre pueden crecer), la segunda opción de las estudiadas sería como podemos ver Rights debido a la facilidad y simplicidad que esta ofrece de hecho se tendría que unir con yiiUser como me recomendaron para poder hacer una comparación entre YUM y esta completamente, seguiría por supuesto SRBAC que le encontré en mis pruebas el detalle de la falta de solicitud de autenticación para poder gestionar los roles de usuario y por última el authManager y explico porque, como se observo cuando se estaba haciendo las pruebas con las extensiones tanto rights como srbac están basadas en esta, de hecho ya nos proveen una interfaz gráfica para el manejo de los roles y estaríamos sacando a mi parecer más provecho de esta extensión si utilizamos alguna que ya nos tenga un poco de trabajo ya realizado.

Espero que este post sea informativo y aclaratorio para todos los que lo lean por supuesto si hay comentarios o correcciones en cuanto a cada una de las extensiones que se mencionaron no duden en indicarlos, el tema por supuesto va al grupo del facebook ya que de ahí fue de donde salio, saludos

domingo, 17 de junio de 2012

Lo nuevo que nos traerá YiiFramework 2

Como ya había comentado en el post anterior actualmente me estoy nutriendo mucho con YiiFramework, hoy leyendo en http://www.linkedin.com/ en el grupo de Yii, me encontré con esta presentación que nos dice todo lo que traerá este framework para su siguiente versión.
Dejo la presentación:



Como pueden ver el camino por el que va es a mejores prácticas de programación, implementación de los namespace, mejoras en el Active Record, aplicación del estandar PSR-0 para los autoload, en fin la presentación ya lo dice todo.

Si ven el caminó hacia el que va es simplemente muy parecido al que ya tomo symfony2 y para el que va Zend Framework también en su versión 2, cada uno aplicando por supuesto su forma de desarrollar.

Saludos espero que les sea de utilidad esta presentación

martes, 12 de junio de 2012

Introduciendonos en el mundo de los Frameworks PHP

En esta entrada se tocará un tema un tanto polémico, y aunque la intención no es caer en batallas de mi framework contra el de los demás, si es dar una idea a todos los desarrolladores  PHP que no se han adentrado en el mundo de los frameworks.

Lo primero que debemos tener claro es que es un framework PHP, mi definición sería es una herramienta para desarrollar aplicaciones web con el lenguaje. Un conjunto de librerías que una vez aprendida a utilizar nos facilitan el trabajo, ya que nos brindan una cantidad de códigos que nos evitan el reescribir una y otra vez los mismos script.

¿Porque un framework?


Esta es una pregunta que muchos cuando comenzamos a adentrarnos mas en el lenguaje nos hacemos, porque un framework si yo ya he hecho mis propios sistemas que funcionan, ya que hacen lo que se quería. Mi respuesta muy directa y viene de la mano con la definición es que estos nos brindan una serie de librerías y evitamos el reescribir nuevamente una y otra vez el mismo código, además de que estos framework tienen un soporte de la comunidad y están realizados bajo buenas prácticas de programación.



¿Puedo hacer mi propio framework?


Esta es la pregunta del millón, siempre que me la hacen mi respuesta es la siguiente "Claro que pudieras hacer tu propio framework con buenas prácticas de programación", pero no es mejor trabajar con alguno de los que ya existen que son bastantes y participar en esa comunidad, de manera que los esfuerzos y conocimientos que se tienen ayuden a una comunidad entera, que ya tiene cierta cantidad de tiempo trabajando por mantener el framework listo. A esta pregunta también hay muchos que son menos tolerantes que yo (suele pasar :-)) que dicen para que reinventar la rueda si ya existen muchos frameworks realizados con las mejores prácticas de programación.

¿Que busco en un framework php?

Lo principal que se busca es que tengan buenas prácticas de programación, actualmente los frameworks vienen desarrollados bajo una serie de patrones de diseños como lo son Modelo Vista Controlador ( El famoso MVC), Active Record, DAO o DataMapper para el trabajo del ORM que brinde el framewokr, entre otros patrones que estos brindan.

Sistema de plantillas fácil de manejar.

Soporte por parte de la comunidad (es decir que no este en el olvido).

Componentes o librerías que nos brinda el framework.

Facilidad para integrar con librerías externas a lo que son el framework ejemplo (FPDF, Doctrine, etc).

¿Es un framework un CMS?


Esta es una de las preguntas mas comunes que solemos hacernos los desarrolladores (yo no soy muy amante de los CMS aunque lo admito he usado Wordpress XD). Pero un framework y un CMS no son lo mismo, un framework es una herramienta para programadores, que nos brinda una serie de librerías, un CMS es un gestor de contenido ya hecho que con solo montarlo ya tenemos una página, solo hay que acomodarla a nuestro gusto o crear un theme y ya tenemos una web, cualquier diseñador es capaz de montar una web con ellos.

¿Top tres de frameworks (opinión personal)?


Este es la pregunta mas polémica de este post, ya que es la que normalmente crea guerras santas entre cual es el mejor framework para desarrollar con php, aunque solo he probado por encima o testeado con algunos yo pudiera dar estos tres en mi lista:

Symfony 2: Este framework aplica excelentes prácticas de programación, su sistema de plantillas twig es muy sencillo de utilizar, aunque también puede usarse php como motor de plantillas, el sistema de ruteo es simple, tiene como ORM a doctrine 2, su configuración es fácil de realizar, el sistema de bundles que tiene es maravilloso ya que hay muchos realizados lo que hay es que adaptarlos a nuestra situación. Pudiera seguir dando más detalles de este, pero mejor vayan a su web oficial y vean que mas hay.

ZendFramework: Muchos dicen que es el framework ofical de php ya que lo creo y da soporte la comunidad de los que desarrollan el php "Zend", tiene excelentes prácticas de programación aunque dicen que la curva de aprendizaje del mismo es difícil vale la pena aprenderlo. Lo desacoplado de este framework, la cantidad de librería que este brinda y la utilización de las mismas sin necesidad de usar el framework nos dice lo bueno que es el framework.

YiiFramewor: Es un framework super sencillo de utilizar, ademas que aplica excelentes prácticas de programación, trae una serie de librerías que nos permiten crear código de manera fácil y siendo precisos, tiene un componente para crear los CRUD de manera simple permitiendo que el desarrollador se concentre en la lógica específica de su desarrollo.

Personalmente utilizo yiiFramework actualmente, aunque cualquiera de los tres que acabo de nombrar los usaría con gusto.

Espero que este post ayude a los que están comenzando en el trabajo con php a decidirse por utilizar un buen framework con buen soporte, pueden dar su top tres también de framework y el porque sin insultar ningún otro ya que no es el punto llegar a batallas sino informar, saludos


domingo, 13 de mayo de 2012

Manejo de errores y excepciones PHP

Buenas en esta entrada intentaré explicar un poco el manejo de errores y excepciones con PHP, comenzaremos definiendo un poco que es un error a nivel de programación.
Un error es un problema que pasa en cierta línea de programación a medida que nuestro código es interpretado, un ejemplo muy simple pero bastante recurrente, el no colocar el ";" a final de cada línea de instrucción.

 Una excepción es un problema o algo inesperado que ocurre al intentar interpretar nuestro código. Si vemos los conceptos en teoría son parecidos más no son lo mismo, es importante hacer la aclaración porque habemos quienes la primera vez que vemos el tema creemos que es lo mismo. Llevemos esto a un ejemplo simple

/**
*
* conexion con el servidor
*/
$dns = 'mysql:host=localhost;db=test';
$user = 'user';
$password = 'password';
// si vemos esta línea el interprete de php encuentra un error al no encontrar el final de línea ";"
$connect = new PDO($dns, $user, $password)

ahora si tenemos el mismo código completo pero no están bien los parámetros de la conexión con mysql esto nos lanzará una excepción

/**
*
* conexion con el servidor
*/
$dns = 'mysql:host=localhost;db=test';
$user = 'user';
$password = 'password';
// si vemos esta línea el interprete de php encuentra un error al no encontrar el final de línea ";"
$connect = new PDO($dns, $user, $password);

Ahora como manejarlas?? PHP desde la versión 4 pero mejorada en la versión 5 tiene un soporte para programación orientada a objetos, por lo que podemos explotar estos beneficios. Para manejar las excepciones php tiene varias palabras reservadas las cuales indicaremos a continuación.

 Lo primero que tenemos que conocer es la clase Exception esta nos brinda la posibilidad de manejar todas las excepciones que lance el lenguaje.

 Ahora hablaremos un poco de throw: como bien es traducido a nuestro idioma es lanza, lo usamos para indicarle al interprete que debe lanzar una excepción en caso de que algo no sea lo que necesitamos, un ejemplo simple

function test($a) {
    if(!$a) {
        throw new Exception('Error al comparar a');
    } else  {
       echo $a;
    }
}

En esté código lo que le decimos al interprete de php, es si es falso $a lanza una excepción porque necesitas que esté tenga un valor verdadero.


try/catch Estas dos palabras son importantes e interesantes al momento de trabajar con excepciones, como vemos en su traducción a nuestro lenguaje try es trata, intenta ejecutar el código que esta en este bloque, si existe algún problema o algo inesperado catch o captura la excepción, entonces si continuamos la implementación del código anterior que ya nos lanza una excepción entonces realizaríamos lo siguiente

try {
   test(0);
} catch(Exception $e) {
   $e->getMessage(); 
}

Entonces si pasamos 0 el interprete de php lo toma como falso y este automáticamente lanzara la excepción, como vemos el catch pide como parámetro un objeto del tipo Exception, y cuando captura esta excepción muestra el mensaje.

Hasta ahora todo ha sido fácil y sencillo verdad?? Ahora lo vamos a ver un poco más fácil vamos a trabajar como se debe a partir de PHP5 con objetos, para el manejar las excepciones con objetos no cambia mucho, lo que cambia es que podemos utilizar las ventajas como la herencia para extender de la clase Exception y crear nuestro propio objeto para manejar las excepciones.

Para el caso de los objetos trabajaremos con una sencilla clase

/**
*
* class manager of exception
*/
class TestException extends Exception {}

/**
*
* class for testing this article
*/
class Test 
{
    /**
    *
    * @param Int $number
    */
    public function testInteger($number)
    {   
        if(!is_numeric($number)) {
            throw new TestException('Debe de indicar un numero');
        }
        if(is_int($number)) {
            return true;
        } else {
            return false;
        }
    }
}

Entonces cuando nos toque utilizar este objeto deberíamos realizar lo siguiente

try {
    $test = new Test();
    $test->testInteger(1);
    $test->testInteger('hola');
} catch(TestException $e) {
    echo $e->__toString();
}

si ejecutamos el código nos dara como resultado algo como esto
exception 'TestException' with message 'Debe de indicar un numero' in /var/www/loqueras/Test.php:22 Stack trace: #0 /var/www/loqueras/Test.php(35): Test->testInteger('hola') #1 {main}

Con esto ya sabemos donde y que es lo que esta pasando en nuestro código, como ven no hay error de sintaxis, sino más bien de algo que esperaba la clase.

Tocando un poco otro tema en cuanto al manejo de errores hay un tema importantes al momento de trabajar los mensajes de errores, warning, hay muchos códigos o programadores que utilizan el símbolo "@" o operador de control de error para que el interprete de php no muestre en pantalla el error, esto simplemente es una mala práctica al momento de programar, porque?? porque simplemente ocultar un error no lo corrige, solo lo oculta, es como que te barra la casa y te esconda la tierra bajo la sombra y luego pregunten porque me enferme. Buenos por ahora es todo espero que les sirva este post y ayude a entender un poco mas el manejo de errores y excepciones saludos.

sábado, 3 de marzo de 2012

Presentación de mi mini Librería FileManager

Esta entrada es para presentar la primera versión de la librería que estoy creando para el manejo de archivos txt, csv, es 100% programación orientada a objetos, aunque todavía esta en beta, ya estoy trabajando en una segunda versión que agregara mas utilidad y manejo sobre estos archivos, por ahora estoy conforme con lo que hace, pueden probarla si lo desean y me indican si encuentran algún bugs.

 La librería esta bajo la licencia GPL por lo tanto se puede copiar, modificar y distribuir con todos los términos que esta licencia indica Todavía no le tengo una documentación por lo tanto mostrare como utilizarla aunque es muy intuitiva, en mi repositorio publico de github encontramos la libreria y la utilizamos de la siguiente manera:
  archivo.csv
 campo1;campo2;campo3
 valor11;valor12;valor13
valor21;valor22;valor23
valor31;valor32;valor33

 instanciamos la clase y le indicamos el archivo
    require_once 'filemanager/libs/FileManager.php';

    $file = new file('archivo.csv');
    $fileManager = new FileManager();
    $fileManager->setFile($file);

obtenemos el contenido del archivo en un arreglo
    $contenido = $fileManager->read();
    foreach($contenido as $linea => $contenido) {
        echo "$linea.- $contenido";
    }

podemos mostrarlo o realizar cualquier trabajo que deseemos con el. escribir nuevo contenido al archivo
    $nuevoContenido = "a;b;c\nd;e;f\n";
    $fileManager->changeMode('w');
    $fileManager->write($nuevoContenido);

este metodo borra el contenido anterior del archivo por lo que debemos de ser muy cuidadosos con el, para agregar una nueva linea al archivo necesitamos utilizar el metodo addNewLine
    $nuevoContenido = "a;b;c;";
    $fileManager->changeMode('a');
    $fileManager->addNewLine($nuevoContenido);

como su nombre lo indica agrega una nueva linea. Actualización del archivo
    //el contenido
    $nuevoContenido = "a;b;c;";
    //la linea a actualizar
    $line = 1;
    $fileManager->changeMode('w');
    $fileManager->update($line, $nuevoContenido);

de esa manera se actualiza esa línea sin cambiar nada más dentro del archivo el método save, este método es lo suficientemente inteligente como para escribir todo de nuevo o actualizar el archivo según sea el caso
    //el contenido
    $nuevoContenido = "a;b;c;";
    //la linea a actualizar
    $line = 1;
    $fileManager->changeMode('w');
    //hace lo mismo que write,
    $fileManager->save($nuevoContenido);
    //el metodo verifica que no este vacío, si lo esta hace lo mismo que write, sino lo esta hace el update
    $fileManager->save($nuevoContenido, 1);

El método delete(), este método borra un archivo, cabe destacar que para poder hacerlo el archivo tiene que tener los permisos, sino dará una excepción.
    
    $fileManager->delete();

Método changeMode, a menudo es necesario cambiar el modo para poder hacer los cambios en los archivos ya que por defecto cuando pasamos el archivo a la clase esta abierto como lectura 'r', este método nos permite cambiar el modo para poder agregar información al documento como lo hemos visto en cada uno de los métodos anteriores
    
    $fileManager->changeMode('w');

mas información sobre los modos de apertura de un archivo aca. espero que la librería les sea de utilidad, saludos cualquier comentario es bien aceptado

viernes, 24 de febrero de 2012

Rutas en PHP

Esta es una entrada un tanto informativa, que tenía algo pendiente y al ver algunos detalles en unos códigos en la web me decidí a compartir. Al hablar de las rutas en PHP podemos decir que tenemos dos maneras de implementarlas 1.- Rutas Absolutas: son aquellas en la que colocamos toda la url del archivo que queremos incluir, mencionar, etc, un ejemplo: archivo http://tusitio.com/archivos/incluir.php esta es la ruta de un archivo alojado en tusitio.com en la carpeta archivos el archivo incluir.php
$hola = "Hola Mundo!!";
index.php
require_once('http://tusitio.com/archivos/incluir.php');
echo $hola;
el resultado sería hola mundo en nuestro navegador, ya que incluimos el archivo por medio de una ruta absoluta, fácil verdad?? 2.- Rutas Relativas: Las rutas relativas son un poco mas complejas de explicar, pero sin embargo una vez que entendemos es sencillo saber como llegar desde donde estamos hasta el archivo que queremos llegar, veamos con un ejemplo para ser más específico estructura del sitio htdocs/ ...images/ ......image.png ......logo.jpg ......mygif.gif ...css/ ......style.css ...js ......myJs.js ...index.php ...procesos/ ......miProceso.php ...class/ ......myClass.php supongamos que en el index queremos incluir a miProceso.php, tendriamos que hacer lo siguiente
require_once('procesos/miProceso.php');
lo que indicamos con esta ruta es que desde index.php vaya a la carpeta proceso e incluya el archivo miProceso.php fácil verdad?? Pero que pasa cuando el archivo no esta en una carpeta del mismo nivel, sino que tenemos que salir de nuestra carpeta para llegar al sitio?? debemos utilizar '../' para subir un nivel fuera de nuestra carpeta, es decir, si quicieramos incluir a myClass.php dentro de miProceso.php tendríamos que realizar lo siguiente
require_once('../class/myClass.php');
que hicimos?? al hacer "../" subimos un nivel, es decir subimos desde la carpeta procesos a la carpeta htdocs, una vez en la carpeta htdocs entramos a la carpeta class ("class/") e incluimos el archivo myClass.php dentro de el archivo miProceso.php podemos dentro de las rutas relativas subir niveles e ingresar en carpetas tantas veces como sea necesarío, ver algo como esto ../../carpeta1/carpeta2/archivo.php es una ruta correcta en esta subimos dos niveles y entramos en la carpeta2 que a su vez esta en la carpeta1 espero que sea de ayuda esta entrada, saludos

domingo, 22 de enero de 2012

Clase para gestión de Usuario

En una Discusión que se formo en un aporte que hizo un compañero de forosdelweb, donde di algunas sugerencias al usuario que lo inicio, quede de hacer una pequeña clase para también aportar al tema en cuestión, y hasta ahora la clase es la siguiente

error_reporting(E_ALL);
/**
 * 
 * clase para gestionar Usuarios
 * @author Carlos Belisario 
 * @version 1.0
 * 
 */
class Usuarios
{
    /**
     * 
     * @var String $usuario
     */
    private $usuario;
    
    /**
     * 
     * @var String $password
     */
    private $password;
    
    /**
     * 
     * @var String $rol
     */
    private $rol;
    
    /**
     * 
     * @var String $estatus
     */
    private $estatus;
    
    /**
     * 
     * @var String $securitySalt
     */
    private $securitySalt;
    
    /**
     *
     * @var PDO 
     */
    private $db;
    
    /**
     *
     * @var String $error
     */
    private $error;


    /**
     *
     * @param PDO $db 
     */
    
    public function __construct(PDO $db) 
    {
        $this->db = $db;
    }

        /**
     * 
     * Getter and Setter
     */
    public function getUsuario() 
    {
        return $this->usuario;
    }
    
    public function setUsuario($usuario)
    {
        $this->usuario = $usuario;
    }
    
    public function getPassword()
    {
        return $this->password;
    }
    
    public function setPassword($password, $salt = true)
    {
        if($salt)
            $this->password = md5($this->getUsuario().$password.$this->getSecuritySalt());
        else
            $this->password = md5($this->getUsuario().$password);
    }
    
    public function getSecuritySalt()
    {
        return $this->securitySalt;
    }
    
    public function setSecuritySalt($securitySalt = 'heyntonwgrnkmoamju33mdowm')
    {
        $this->securitySalt = $securitySalt;
    }
    
    public function getRol()
    {
        return $this->rol;
    }
    
    public function setRol($rol)
    {
        $this->rol = $rol;
    }
    
    public function getEstatus()
    {
        return $this->estatus;
    }
    
    public function setEstatus($estatus)
    {
        $this->estatus = $estatus;        
    }
    
    public function getError()
    {
        return $this->error;
    }

    public function setError($k, $error)
    {
        $this->error[$k] = $error;
    }
    /**
     * 
     * @method login
     * metodo para autnetificar al usuario
     * 
     */
    public function login()
    {
        // aca verificamos que el usuario haya escrito en un formato que comience con letras y pueda estar seguido de un punto, guion bajo o guion 
        if(preg_match("/(^[a-z]{1,20})(?!\s)([\w-\.]{0,20}$)/i",  $this->getUsuario())){
            $sql = "SELECT * FROM usuarios WHERE usuario = :usuario AND password = :password";
            try {
                // hacemos la consulta
                $query = $this->db->prepare($sql);            
                $query->bindParam(':usuario', $this->getUsuario());
                $query->bindParam(':password', $this->getPassword());
                $query->execute();
                $row = $query->fetchObject();
                //verificamos que el usuario exista en la base de datos y la password sea correcta
                if(!empty($row)) {                                                                                  
                    $this->setRol($row->rol);
                    /*podemos pasar el estatus para que se haga la verificacion
                    * e ingrese a una pagina para usuarios deshabilitados, 
                    * para darle motivos e incluso donde comunicarse, 
                    *                            
                    */                        
                    $this->setEstatus($row->estatus);
                        
                    /* o podemos incluirlo en los errores, de manera que no haga login
                    if($row->estatus == "habilitado") {
                        $this->setRol($row->rol);                                                                 
                    } else {
                        $this->setError ('userEstatus', 'El Usuario no esta habilitado');
                    }*/                          
                    
                } else {
                    $this->setError('errorLogin', 'El Usuario o la Contraseña no es Correcta');
                }    
            
             } catch( PDOException $e) {
                 $e->getMessage();
             }                     
        } else {
            $this->setError('erroFormato', 'Formato de usuario no permitido');
        }   
    }
}

/**
* como usar
*/
try {
//establecemos la conexion con PDO
    $db = new PDO('mysql:host=localhost; dbname=prueba', 'root', '123');   
} catch(PDOException $e) {
   echo $e->getMessage();
}
//instanciamos la clase y probamos el login
$class = new Usuarios($db);
//los parámetros estan siendo pasado un login por defecto se puede obtener desde un formulario con $_POST O $_GET
$class->setUsuario('carlos');
$class->setPassword('123456');
//indicamos que realice el login
$class->login();
//sino existe algn error 
if(count($class->getError()) == 0) {
    //realizamos los procesos con las variables de session o incluso si se desea se puede crear un componente de session y le pasamos nuestro objeto usuario con el login correcto
} else {
// gestionamos los mensajes de errores para los usuarios
    echo "
";
    print_r($class->getError());
    echo "
"; }
hasta ahora llevo realizado esto, sin la gestión de lo que es el CRUD de la gestión de usuarios, sin embargo cuando vaya teniendo tiempo lo iré actualizando, el proyecto lo pueden descargar desde https://github.com/carlosbelisario/juegos_con_clases/ espero que sea de utilidad