<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3643110465101310094</id><updated>2024-09-19T10:42:13.128-04:00</updated><category term="PHP"/><category term="POO"/><category term="MySQL"/><category term="YiiFramework"/><category term="PARTONES DE DISEÑO"/><category term="diagrama clase"/><category term="diseño aplicación"/><category term="java"/><category term="lyndaChallenge"/><category term="Excepciones"/><category term="Exceptiom"/><category term="FPDF"/><category term="JGRAPH"/><category term="Libreria"/><category term="PDO"/><category term="PHPUnit"/><category term="TDD"/><category term="desarrollo de software"/><category term="extensiones"/><category term="framewokrs"/><category term="symfony"/><title type='text'>Desarrollo PHP para todos</title><subtitle type='html'>Blog para el aprendizaje de las tecnologías usadas para el desarrollo Web (PHP,MySQL,HTML,JAVASCRIPT) y algo mas</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-910675504589994206</id><published>2016-02-01T21:45:00.000-04:30</published><updated>2016-02-01T21:45:26.404-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="diagrama clase"/><category scheme="http://www.blogger.com/atom/ns#" term="diseño aplicación"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="PHPUnit"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><category scheme="http://www.blogger.com/atom/ns#" term="symfony"/><category scheme="http://www.blogger.com/atom/ns#" term="TDD"/><title type='text'>Diseñando una aplicación desde cero parte 2</title><content type='html'>Buen día, en la &lt;a href=&quot;http://desphpparatodos.blogspot.com/2016/01/disenando-una-aplicacion-desde-un.html&quot; target=&quot;_blank&quot;&gt;entrada anterior&lt;/a&gt; obtuvimos un diagrama de clases según un requerimiento ahora comenzaremos a convertir este diagrama en una app funcional, para esto podemos utilizar cualquiera de los frameworks de la variedad que tenemos en php (symfony, laravel, yii, zend, etc.) o incluso php puro y duro (para mi usar un framework opción super recomendada), en esta entrada se trabajará con symfony2.8 destacando que no es un tutorial de como trabajar con symfony por lo que no se explicará estructura del framework ni nada por el estilo, el punto es ir haciendo la aplicación según el diseño, el mismo diseño debería de servir para cualquier otro y ya con las manos en el código se mostrará como ir aplicando &lt;a href=&quot;https://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas&quot; target=&quot;_blank&quot;&gt;Test Development driver TDD&lt;/a&gt; a nuestra aplicación, por supuesto usando PHPUnit como framework base paras las pruebas unitarias.&lt;br /&gt;
&lt;br /&gt;
Lo primero es conocer un poco de TDD, en síntesis la teoría es la siguiente, escribe la test de la funcionalidad a aplicar, corre el test y estarás en rojo, realiza el código para que la test funcione y pasa a verde, el punto principal es que según el diseño que se pensó para la aplicación se vayan realizando las test y codeando la funcionalidad, no es hacer un millón de test y luego ir al código sino al contrario, escribe test, escribe el condigo necesario de la funcionalidad para que ella pase a verde y pasa a la siguiente test, repite hasta que termines la app (suena divertido :)). Aplica refactory si es necesario (no es el tema principal en este artículo pero es parte del ciclo de TDD), ahora sí manos al código.&lt;br /&gt;
&lt;br /&gt;
Según el diagrama diseñado en la entrada anterior tenemos una entidad Album y una Artista por lo que lo primero que tenemos que hacer son comenzar las test de nuestra entidad, para ello en la carpeta de test escribimos lo siguiente&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
https://gist.github.com/carlosbelisario/71c1ba6b81ce22943a5b&lt;br /&gt;
&lt;br /&gt;
Como podemos ver, la test es simple y se autocomenta (importante para las test ya que las mismas no sirven de doc muchas veces) y lo que probamos es que haya instancia de nuestra entity a testear. Una vez culminado el código de la test procedemos a correrlo lo cual nos dará como resultado&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
.PHP Fatal error: &amp;nbsp;Class &#39;AppBundle\Entity\Album&#39; not found ...&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
Es lo esperado según la técnica que estamos usando, el test esta en rojo ¿por que? obviamente no hemos aún creado nuestra entidad, en el caso de symfony podemos hacer uso de su consola para crearla o podemos hacerlo a pie (a gusto del consumidor) y obtendremos &lt;br /&gt;&lt;br /&gt;https://gist.github.com/carlosbelisario/714a37a94c6c0258b64d&lt;br /&gt;&lt;br /&gt;si volvemos a correr nuestra test ahora si tendremos el verde que deseamos y si ya finalizamos la primera test, simple cierto.&lt;br /&gt;&lt;br /&gt;Seguimos revisando nuestro diseño y vemos que nuestra entidad tiene comportamiento que debemos testear, si tenemos un método para añadir los artistas a nuestro album y según la cardinalidad podemos agregar muchos artistas al mismo, doctrine nos provee de un tipo de datos llamado ArrayCollection que implementaremos en la entidad, pero vayamos a la test&lt;br /&gt;&lt;br /&gt;https://gist.github.com/carlosbelisario/790574b289899627a5e7&lt;br /&gt;&lt;br /&gt;Como se puede observar, la test cambio un poco añadimos un método setUp para inicializar en cada test nuestro objeto a testear Album en este caso, y se añadió la funcionalidad que se necesita si volvemos a correr la test encontraremos que estamos en rojo nuevamente y ¿que tenemos que hacer? realizar el código para pasar a verde, el cual para nuestro caso será el siguiente.&lt;br /&gt;&lt;br /&gt;https://gist.github.com/carlosbelisario/283f67b5adeb06168937&lt;br /&gt;&lt;br /&gt;Volvemos a correr la test y ya nuevamente todo en verde, en este punto podemos ver que tenemos setter y getter dentro de nuestra entidad (el comando de consola de doctrine es genial y nos creo todos los que necesitamos) la pregunta del millon &lt;br /&gt;&lt;br /&gt;¿se deben hacer test de todos los getter y setter?&lt;br /&gt;
&lt;br /&gt;En mi opinión personal no, solo si tienen alguna lógica específica se deberían de hacer test, documentandome sobre el tema he leído personas que concuerdan con este punto, pero todo es cuestión de puntos de vistas y opiniones&lt;br /&gt;&lt;br /&gt;Como podemos ver ya hemos implementado las test de la primera entidad (el comando de consola de doctrine nos apoyo con el segundo método que faltaba) el cual podemos ver su test aquí&lt;br /&gt;&lt;br /&gt;https://gist.github.com/carlosbelisario/770c537ca6802cb6c80b&lt;br /&gt;&lt;br /&gt;Antes de concluir es importante indicar que una test en rojo no significa que sea un error y una test en verde no significa que la test este 100% correcta siempre hay que tener en cuenta el concepto de refactory para nuestras test y nuestro código de manera que el software que tengamos sea software de calidad.&lt;br /&gt;&lt;br /&gt;Espero que la entrada sea de agrado cualquier comentario o mejora será bien recibido y recordar hay que crear test verlas en rojo y luego pasar a verde. Saludos&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/910675504589994206/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2016/02/disenando-una-aplicacion-desde-cero.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/910675504589994206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/910675504589994206'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2016/02/disenando-una-aplicacion-desde-cero.html' title='Diseñando una aplicación desde cero parte 2'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-8635450614779301213</id><published>2016-01-26T22:41:00.002-04:30</published><updated>2016-01-26T22:46:28.286-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="lyndaChallenge"/><title type='text'>Curso de introducción a java challenge2</title><content type='html'>Buen día, en esta segunda entrada de los challenge que van saliendo del curso de lynda up and run java, ya con un poco más de contenido dado en el curso, ya indicaron la existencia de métodos, estructuras de control (bucles y condicionales), métodos y sobrecarga de métodos para jugar un poco más con lo que se puede hacer con lo dado y veamos que se puede hacer con el challenge al oopstyle&lt;br /&gt;
&lt;br /&gt;
El reto en este caso no es más que llevar el costo de la estadía de los pacientes en un hospital, teniendo los siguientes datos&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;datos de estadía&lt;/li&gt;
&lt;li&gt;hay que determinar si existen sobrecargos en la estadía&lt;/li&gt;
&lt;li&gt;cargos por medicamentos&lt;/li&gt;
&lt;li&gt;cargos por laboratorio&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
acá lo que se implemento del código&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://github.com/carlosbelisario/upAndRunJava/tree/master/src/chalengetwo&quot; target=&quot;_blank&quot;&gt;código challenge 2&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
cualquier comentario, sugerencia critica es aceptada, saludos&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/8635450614779301213/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2016/01/curso-de-introduccion-java-challenge2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/8635450614779301213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/8635450614779301213'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2016/01/curso-de-introduccion-java-challenge2.html' title='Curso de introducción a java challenge2'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-474062047604644676</id><published>2016-01-25T12:10:00.003-04:30</published><updated>2016-01-26T22:46:42.145-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="lyndaChallenge"/><title type='text'>Challenge1 curso up and run java lynda</title><content type='html'>Buen día, en esta entrada estaré compartiendo un repositorio que he creado para los challege del curso de java que estoy realizando en lynda.com, el punto principal es mostrar el código de estos challenge como los va brindando el instructor de lynda, cabe destacar que es un curso introductorio a java, el primer challenge como no se ha llegado a la separación en objetos la gente de lynda lo hizo a la manera estructurada todo en el método main, pero por ir un poco más allá cree un paquete donde separe en objetos e hice el mismo programa al estilo POO.&lt;br /&gt;
&lt;br /&gt;
El challenge trata acerca de calcular el área de pintura de una casa, quitando las ventanas y las puertas de la misma, la formula fue dada en el mismo curso, sin mas preambulo les dejo el repositorio con el código&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/carlosbelisario/upAndRunJava/tree/master/src/lyndachallenge/challengeone&quot; target=&quot;_blank&quot;&gt;Repositorio del Challenge1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que no soy un experto en java, si consiguen detalles o piensan que hay una mejor manera de aplicar al código pueden dejarla en los comentarios serán bien recibidos, saludos y espero sea de su agrado</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/474062047604644676/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2016/01/buen-dia-en-esta-entrada-estare.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/474062047604644676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/474062047604644676'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2016/01/buen-dia-en-esta-entrada-estare.html' title='Challenge1 curso up and run java lynda'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-2927962121567046833</id><published>2016-01-23T17:15:00.001-04:30</published><updated>2016-01-26T22:47:45.006-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="desarrollo de software"/><category scheme="http://www.blogger.com/atom/ns#" term="diagrama clase"/><category scheme="http://www.blogger.com/atom/ns#" term="diseño aplicación"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>Diseñando una aplicación desde un requerimiento (parte 1)</title><content type='html'>&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
Buen día&amp;nbsp;esta es la primera de varias entradas donde se diseñará y construirá una app partiendo desde un requerimiento, el mismo será el siguiente:&lt;/div&gt;
&lt;blockquote style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Se necesita una aplicación que permitirá a los gestores de una discográfica mantener su histórico de producciones, con la lista de los artistas que han participado en cada una. En particular, los usuarios deben poder:&lt;br /&gt;
1. Crear, modificar, borrar y listar (con todos los campos relacionados) álbumes&lt;br /&gt;
2. Crear, modificar, borrar y listar artistas&lt;br /&gt;
3. Añadir y quitar artistas de un álbum existente.&lt;br /&gt;
Notas adicionales:&lt;br /&gt;
• Un álbum tiene un título y una fecha de publicación.&lt;br /&gt;
• De los artistas se conoce el nombre y el instrumento o rol.&lt;br /&gt;
• Los artistas se presentarán en el orden en que han sido añadidos al álbum.&lt;br /&gt;
• La aplicación se ejecutará en un servidor accesible solo desde la oficina del promotor, y por lo tanto no necesita ningún tipo de control de acceso.&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
La idea principal es utilizar aplicar y compartir diferentes técnicas que utilizamos para el diseño y desarrollo de &amp;nbsp;una aplicación, sin más preámbulo comencemos con la primera fase (ya teniendo los requerimientos de la aplicación) la misma en nuestro caso será la identificación de entidades que participan dentro del sistema, viendo el requerimiento escrito buscaremos los sustantivos para hacer esta identificación, los cuales viendo el escrito muy simplemente se puede ver que estarán:&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;a data-mce-href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities.png&quot; href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities.png&quot; rel=&quot;attachment wp-att-399&quot;&gt;&lt;img alt=&quot;entities&quot; class=&quot;alignnone size-medium wp-image-399&quot; data-mce-src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-300x25.png&quot; src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-300x25.png&quot; height=&quot;25&quot; style=&quot;height: auto; max-width: 100%;&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
Una vez identificadas las entidades pasamos a ver los atributos de las mismas de manera que podamos ir modelando la aplicación de manera correcta, los atributos los identificaremos en nuestros requerimientos&amp;nbsp;como las características que describen a nuestras entidades,&amp;nbsp;por lo que actualizando&amp;nbsp;el diagrama de clases quedaría de la siguiente manera&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;a data-mce-href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-properties.png&quot; href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-properties.png&quot; rel=&quot;attachment wp-att-400&quot;&gt;&lt;img alt=&quot;entities-properties&quot; class=&quot;alignnone size-medium wp-image-400&quot; data-mce-src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-properties-300x34.png&quot; src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-properties-300x34.png&quot; height=&quot;34&quot; style=&quot;height: auto; max-width: 100%;&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
Luego de tener las entidades con atributos pasaremos a verificar cuales serán las operaciones o métodos de&amp;nbsp;las mismas, los métodos los reconoceremos&amp;nbsp;por medio de verbos o acciones que según los&amp;nbsp;requerimientos ejecutan las entidades,&amp;nbsp;por lo que nuevamente actualizaremos el diagrama de clases el cual quedaría:&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;a data-mce-href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-operations.png&quot; href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-operations.png&quot; rel=&quot;attachment wp-att-401&quot;&gt;&lt;img alt=&quot;entities-operations&quot; class=&quot;alignnone size-medium wp-image-401&quot; data-mce-src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-operations-300x72.png&quot; src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-operations-300x72.png&quot; height=&quot;72&quot; style=&quot;height: auto; max-width: 100%;&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
Ya tenemos nuestra primera instancia del diagrama de clases según lo descrito en el documento, una vez teniendo esto hacemos una revisión para ver que todo este correcto y de no ser así realizaremos un reactory para que el diseño quede acorde a lo que se pide en el requerimiento, entonces manos al diagrama.&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
Lo primero viendo los atributos de la clase Artista se puede observar que tenemos el atributo rol de tipo string (no lo especificaron pero es lo primero que se ocurre por la descripción de especifican del mismo, muy obviamente se nota que rol es una asociación a un artista por lo que tendremos que sacar una entidad de este tipo, agregaremos también el método para añadir y eliminar el rol a la asociación, también realizaremos la asociación de Album hacia Artista ya que en el requerimiento se nos indica que al Album se le añaden los artistas asociados al mismo, lo siguiente es que las acciones &quot;Crear, modificar, borrar y listar&quot; son lo que normalmente llamamos CRUD y serán realizadas por medio de un ORM que utilicemos (en siguiente entrada&amp;nbsp;indicaremos cual en específico se utilizará) por lo que las sacaré a una entidad aparte que llamaré ORM, la misma tendrá las operaciones del CRUD, entonces nuestro diagrama de clase va quedando de la siguiente manera.&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;a data-mce-href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-refactory.png&quot; href=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-refactory.png&quot; rel=&quot;attachment wp-att-402&quot;&gt;&lt;img alt=&quot;entities-refactory&quot; class=&quot;alignnone size-medium wp-image-402&quot; data-mce-src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-refactory-300x115.png&quot; src=&quot;http://php.org.ve/wp-content/uploads/2016/01/entities-refactory-300x115.png&quot; height=&quot;115&quot; style=&quot;height: auto; max-width: 100%;&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #333333; font-family: Georgia, &#39;Times New Roman&#39;, &#39;Bitstream Charter&#39;, Times, serif; font-size: 16px; line-height: 24px;&quot;&gt;
Como podemos ver tenemos ya el diseño de lo que según el requerimiento de la aplicación necesitamos, si en algún momento se ve que se necesita algo más o hacer una modificación se realiza la refactorización del diagrama, aunque en general el mismo esta completo. Cualquier observación, sugerencia o modificación al diseño es bien recibida y/o debatida, saludos espero que la entrada sea de su interés y podamos debatir un poco sobre el proceso que se realizó&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/2927962121567046833/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2016/01/disenando-una-aplicacion-desde-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/2927962121567046833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/2927962121567046833'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2016/01/disenando-una-aplicacion-desde-un.html' title='Diseñando una aplicación desde un requerimiento (parte 1)'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-1055594640457182437</id><published>2012-12-03T22:27:00.000-04:30</published><updated>2012-12-03T22:27:02.558-04:30</updated><title type='text'>Zend y Symfomy el equipo perfecto</title><content type='html'>Una diapositiva muy interesante que conseguí leyendo un poco los temas que se trataron en la ZendCon 2012

&lt;script async=&quot;async&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;508894763727c30002002a68&quot; data-ratio=&quot;1.33507170795306&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

Espero que sirva un poco, para ver las cosas que se pueden hacer si se siguen bien los standares, saludos</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/1055594640457182437/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/12/zend-y-symfomy-el-equipo-perfecto.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/1055594640457182437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/1055594640457182437'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/12/zend-y-symfomy-el-equipo-perfecto.html' title='Zend y Symfomy el equipo perfecto'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-3405074603049411374</id><published>2012-08-08T15:12:00.001-04:30</published><updated>2012-08-08T15:13:27.230-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Script de comparación entre rangos de fechas</title><content type='html'>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

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;date_default_timezone_set(&#39;UTC&#39;);

$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-&amp;gt;diff($to1);    

    for($i = 0; $i &amp;lt;= $range1Diff-&amp;gt;days; $i++) {    
        if($from1 &amp;gt;= $from2 &amp;amp;&amp;amp; $from1 &amp;lt;= $to2) {
            $return[$from1-&amp;gt;format(&#39;d-m-Y&#39;)] =  &quot;in the range 
&quot;;
        } else {
            $return[$from1-&amp;gt;format(&#39;d-m-Y&#39;)] = &quot;out the range
&quot;;
        }
        $from1-&amp;gt;modify(&quot;+1 day&quot;);        
    }
    return $return;
};

&lt;/pre&gt;
El resultado es algo como esto
&lt;br /&gt;
&lt;pre&gt;Array
(
    [01-01-2012] =&amp;gt; out the range

    [02-01-2012] =&amp;gt; out the range

    [03-01-2012] =&amp;gt; out the range

    [04-01-2012] =&amp;gt; out the range

    [05-01-2012] =&amp;gt; out the range

    [06-01-2012] =&amp;gt; out the range

    [07-01-2012] =&amp;gt; out the range

    [08-01-2012] =&amp;gt; out the range

    [09-01-2012] =&amp;gt; out the range

    [10-01-2012] =&amp;gt; out the range

    [11-01-2012] =&amp;gt; out the range

    [12-01-2012] =&amp;gt; out the range

    [13-01-2012] =&amp;gt; out the range

    [14-01-2012] =&amp;gt; out the range

    [15-01-2012] =&amp;gt; in the range 

    [16-01-2012] =&amp;gt; in the range 

    [17-01-2012] =&amp;gt; in the range 

    [18-01-2012] =&amp;gt; in the range 

    [19-01-2012] =&amp;gt; in the range 

    [20-01-2012] =&amp;gt; in the range 

    [21-01-2012] =&amp;gt; in the range 

    [22-01-2012] =&amp;gt; in the range 

    [23-01-2012] =&amp;gt; in the range 

    [24-01-2012] =&amp;gt; in the range 

    [25-01-2012] =&amp;gt; in the range 

    [26-01-2012] =&amp;gt; in the range 

    [27-01-2012] =&amp;gt; in the range 

    [28-01-2012] =&amp;gt; in the range 

    [29-01-2012] =&amp;gt; in the range 

    [30-01-2012] =&amp;gt; in the range 

    [31-01-2012] =&amp;gt; in the range 

)
&lt;/pre&gt;
el que hacer con el resultado ya queda del desarrollador.

Espero que el script sea de utilidad, saludos</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/3405074603049411374/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/08/script-de-comparacion-entre-rangos-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/3405074603049411374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/3405074603049411374'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/08/script-de-comparacion-entre-rangos-de.html' title='Script de comparación entre rangos de fechas'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-731563444889665080</id><published>2012-07-26T20:18:00.000-04:30</published><updated>2012-07-26T20:20:50.360-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><category scheme="http://www.blogger.com/atom/ns#" term="YiiFramework"/><title type='text'>Temas más vistos y con más respuestas de MyBB Forum con YiiFramework</title><content type='html'>En esta entrada compartiré unos pequeños script que realice para la gente de&amp;nbsp;&lt;a href=&quot;http://www.yiiframeworkenespanol.org/&quot; target=&quot;_blank&quot;&gt;yiiframework en español&lt;/a&gt;, es&lt;span style=&quot;background-color: white;&quot;&gt;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,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp;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&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.mybb.com/&quot; style=&quot;background-color: white;&quot; target=&quot;_blank&quot;&gt;MyBB&lt;/a&gt;&lt;span style=&quot;background-color: white;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Aclarando que ya tenemos que tener configurado el foro de MyBB, pueden ver en el enlace que se dejo&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;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&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo primero es hacer la relación entre ambos
&lt;b&gt;models/Threads.php&lt;/b&gt;
&lt;br /&gt;
&lt;pre&gt;    /**
     * @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(
     &#39;posts&#39; =&gt; array(self::HAS_MANY, &#39;posts&#39;, &#39;tid&#39;),
 );
     }
&lt;/pre&gt;
&lt;b&gt;models/Posts.php&lt;/b&gt;
&lt;br /&gt;
&lt;pre&gt;    /**
     * @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(
            &#39;threads&#39; =&gt; array(self::BELONGS_TO, &#39;Threads&#39;, &#39;tid&#39;),     
 );
     }
&lt;/pre&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;/**
* hotThread return the hot threads of the foro
* @param  string  $type   [description]
* @param  integer $length [description]
* @return [type]          [description]
*/
public function hotThread($type = &#39;views&#39;, $length = 5)
{
    if($type == &#39;views&#39;) { //shows the hotpost for views
        $criteria = new CDbCriteria();
 $criteria-&gt;select = &#39;tid, subject, views, dateline, username&#39;;
 $criteria-&gt;with = array(
     &#39;posts&#39;=&gt;array(                     
         &#39;joinType&#39;=&gt;&#39;LEFT JOIN&#39;, 
         &#39;order&#39; =&gt; &#39;pid&#39;,                     
         ),
 );   
 $criteria-&gt;order = &#39;views DESC&#39;;
 $criteria-&gt;together = true;   
 $criteria-&gt;limit = $length;
        $dataProvider = new CActiveDataProvider($this, array(
            &#39;criteria&#39; =&gt; $criteria,                                    
            &#39;pagination&#39;=&gt;array(
                &#39;pageSize&#39;=&gt;20,
            ),
        ));            
    } elseif($type == &#39;answerd&#39;) { //show the hotpost by answerd
        $criteria = new CDbCriteria();
 $criteria-&gt;select = &#39;tid, COUNT(posts.tid) as length, subject, views, dateline, username&#39;;   
 $criteria-&gt;order = &#39;length DESC&#39;; 
 $criteria-&gt;with = array(
     &#39;posts&#39;=&gt;array(                    
         &#39;joinType&#39;=&gt;&#39;RIGHT JOIN&#39;,  
         &#39;order&#39; =&gt; &#39;pid&#39;,         
         ),
 );
 $criteria-&gt;together = true;   
 $criteria-&gt;group = &#39;posts.tid&#39;;
 $criteria-&gt;limit = $length;
        $dataProvider = new CActiveDataProvider($this, array(
            &#39;criteria&#39; =&gt; $criteria,                                                    
        ));
    }
    return $dataProvider;
}
&lt;/pre&gt;
&lt;br /&gt;
Como vemos estamos obteniendo un nuevo atributo para la categoría por respuesta, entonces tenemos que agregar a nuestra clase Threads el atributo length&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;class Threads extends CActiveRecord
{
    public $length;
    /*...*/   
&lt;/pre&gt;
Ya que obtuvimos los hotpost por su respectiva categoria (visitas y respuestas), ahora realizaremos el controller,
&lt;b&gt;controllers/SiteController.php&lt;/b&gt;
&lt;br /&gt;
&lt;pre&gt;public function actionHotpost()
{        
    $threads = new Threads();  
    $dataProviderVisitPost = $threads-&gt;hotThread(&#39;views&#39;);
    $dataProviderMostAnswerdPost = $threads-&gt;hotThread(&#39;answerd&#39;);
    $this-&gt;render(&#39;index-test&#39;,array(
        &#39;dataProviderVisitPost&#39;=&gt;$dataProviderVisitPost,
        &#39;dataProviderMostAnswerdPost&#39; =&gt; $dataProviderMostAnswerdPost)
    );                
}
&lt;/pre&gt;
&lt;br /&gt;
Ahora, hacemos la vista, esta consta de un&amp;nbsp;&lt;a href=&quot;http://www.yiiframework.com/doc/api/1.1/CListView&quot; target=&quot;_blank&quot;&gt;CListView&lt;/a&gt;,&lt;br /&gt;
&lt;b&gt;views/site/index-test.php&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;pre&gt;pageTitle=Yii::app()-&gt;name; ?&gt;

h1=&quot;&quot;&gt;
titulo de la pagina
/h1&gt;
h2=&quot;&quot;&gt;
Temas más Visitados
widget(&#39;zii.widgets.CListView&#39;, array(
    &#39;dataProvider&#39;=&gt;$dataProviderVisitPost,
    &#39;itemView&#39;=&gt;&#39;_hotpostitem&#39;, 
));?&gt;

h2=&quot;&quot;&gt;
Con mayor numero de respuesta /h2&gt;
widget(&#39;zii.widgets.CListView&#39;, array(
    &#39;dataProvider&#39;=&gt;$dataProviderMostAnswerdPost,
    &#39;itemView&#39;=&gt;&#39;_hotpostitemvisit&#39;,   
));?&gt;
&lt;/pre&gt;
&lt;br /&gt;
Disculpen los horrores en las etiquetas html, no le tengo instalado plugin para codigo al blog, por eso no esta el principio &amp;lt;.&lt;br /&gt;
&lt;br /&gt;
Ahora solo nos queda realizar el código de&lt;br /&gt;
&lt;b&gt;views/site/_hotpostitem.php&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;pre&gt;div class=&quot;view&quot;&gt;     
   h2&gt;subject); ?&gt;/h2&gt;
   span&gt;Creado por: username);?&gt; en la fecha dateline));?&gt;/span&gt;
   p&gt;Visto: views); ?&gt;/p&gt;  
   p&gt;posts[0]-&gt;message, 0, 350)); ?&gt;/p&gt;   
   a href=&quot;http://localhost/mybb/Upload/showthread.php?tid=tid)?&gt;&quot; alt=&quot;leer mas&quot;&gt;Leer mas/a&gt;
/div&gt;
&lt;/pre&gt;
Y de&amp;nbsp;&lt;b&gt;views/site/_hotpostitemvisit.php&lt;/b&gt;
&lt;br /&gt;
&lt;pre&gt;div class=&quot;view&quot;&gt;     
   h2&gt;subject); ?&gt;/h2&gt;
   span&gt;Creado por: username);?&gt; en la fecha dateline));?&gt;/span&gt;
   p&gt;Cantidad de Respuestas: length - 1); ?&gt;/p&gt;  
   p&gt;posts[0]-&gt;message, 0, 350)); ?&gt;/p&gt;   
   a href=&quot;http://localhost/mybb/Upload/showthread.php?tid=tid)?&gt;&quot; alt=&quot;leer mas&quot;&gt;Leer mas/a&gt;
/div&gt;
&lt;/pre&gt;
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</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/731563444889665080/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/07/temas-mas-vistos-y-con-mas-respuestas.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/731563444889665080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/731563444889665080'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/07/temas-mas-vistos-y-con-mas-respuestas.html' title='Temas más vistos y con más respuestas de MyBB Forum con YiiFramework'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-4533971283227340882</id><published>2012-07-14T20:44:00.001-04:30</published><updated>2012-07-14T20:44:50.365-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="extensiones"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="YiiFramework"/><title type='text'>CrugeMailer una extensión para enviar correos electrónicos con YiiFramework</title><content type='html'>Buenas esta entrada es para presentar la librería&amp;nbsp;&lt;a href=&quot;https://github.com/carlosbelisario/crugemailer&quot; target=&quot;_blank&quot;&gt;CrugeMailer&lt;/a&gt;, 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.&lt;br /&gt;
&lt;br /&gt;
¿Como la usamos?&lt;br /&gt;
&lt;br /&gt;
Clonamos la librería en la carpeta extensions de nuestra aplicación &quot;pathapplication/protected/extensions&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;cd /pathapp/protected/extensions/&lt;/pre&gt;
&lt;pre&gt;git clone https://github.com/carlosbelisario/crugemailer
&lt;/pre&gt;
&lt;br /&gt;
Necesitamos también la librería swiftmailer para esto realizamos los siguiente
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;git submodule init
git submodule update&lt;/pre&gt;
&lt;br /&gt;
Una vez tenemos la librería instalada la librería tenemos que hacer la configuración en el main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&#39;import&#39;=&amp;gt;array(
    &#39;application.models.*&#39;,
    &#39;application.components.*&#39;,
    &#39;application.extensions.crugemailer.*&#39;,        
),&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&#39;component&#39; =&amp;gt; array(&lt;/pre&gt;
&lt;pre&gt;/*...*/&lt;/pre&gt;
&lt;pre&gt;    &lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;&#39;crugemailer&#39;=&amp;gt;array(&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         &#39;class&#39; =&amp;gt; &#39;application.extensions.crugemailer.CrugeSwiftMailer&#39;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         &#39;mailfrom&#39; =&amp;gt; &#39;christiansalazarh@gmail.com&#39;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         &#39;transport&#39; =&amp;gt; &#39;gmail&#39; // gmail para usar el stmp de gmail (recomendado), no especificarlo trabajara la librería con la función mail de php&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         /**&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         *&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         * obligatorios si el transporte es gmail&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         */&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         &#39;gmailAcount&#39; =&amp;gt; &#39;carlos.belisario.gonzalez@gmail.com&#39;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         &#39;gmailPassword&#39; =&amp;gt; &#39;password de gmail&#39;,      &amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;         &#39;subjectprefix&#39; =&amp;gt; &#39;Prefijo que deseas agregar, es opcional - &#39;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;    ),&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;);&lt;/pre&gt;
Luego de tenerla configurada simplemente cuando necesitemos mandar un mail lo que debemos hacer es lo siguiente&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;Yii::app()-&amp;gt;crugemailer-&amp;gt;sendEmail(&#39;el cuerpo de lo que va a ser enviado en el mensaje&#39;,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;&amp;nbsp; &amp;nbsp; /*destinatario del mensaje*/array(&#39;carlos.belisario.gonzalez@gmail.com&#39;),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;&amp;nbsp; &amp;nbsp; array(&#39;contac@midominio.com&#39;),&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;/*opcional puede configurarse en&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; el application/config/main*/&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39;Asunto del Correo Electrónico&#39;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;/*opcional*/&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: 19px;&quot;&gt;);&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;br /&gt;
Y ya estamos enviando correos electrónicos desde YiiFramework con la librería swiftmailer&lt;br /&gt;
&lt;br /&gt;
Espero que la librería les sea útil, esta todavía en desarrollo para mas funcionalidades pero actualmente ya envia los correos, saludos</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/4533971283227340882/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/07/crugemailer-una-extension-para-enviar.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4533971283227340882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4533971283227340882'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/07/crugemailer-una-extension-para-enviar.html' title='CrugeMailer una extensión para enviar correos electrónicos con YiiFramework'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-770723218920812336</id><published>2012-06-30T17:33:00.002-04:30</published><updated>2012-06-30T17:33:36.810-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="YiiFramework"/><title type='text'>Configurando la Extensión YiiDoctrine2Orm</title><content type='html'>&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Buenas en esta
entrada indicaré cada uno de los pasos a seguir para configurar la
extensión &lt;/span&gt;&lt;b style=&quot;background-color: white;&quot;&gt;YiiDoctrine2Orm &lt;/b&gt;&lt;span style=&quot;background-color: white;&quot;&gt;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.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
Lo primero que tenemos que hacer claro esta es bajar los archivos de
la extensión desde &lt;a href=&quot;http://code.google.com/p/yii-doctrine2/downloads/list&quot; target=&quot;_blank&quot;&gt;la página del proyecto&lt;/a&gt;, también tenemos que tener instalado también&amp;nbsp;&lt;a href=&quot;http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/installation.html&quot; target=&quot;_blank&quot;&gt;Doctrine 2&lt;/a&gt; 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).&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
Una vez tenemos el ORM y la extensión de YiiFRamework, descomprimimos la carpeta&amp;nbsp;&lt;b&gt;d2ormext-1.0.1.zip, &lt;/b&gt;en la carpeta &quot;/applicationpath/protected/extensions/&quot;, una vez descomprimida ingresaremos a la carpeta&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;&quot;/applicationpath/protected/extensions/Wildkat/YiiExt/DoctrineOrm/vendor/Doctrine/&quot; y hacemos lo siguiente&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
ln -s /ruta/hacia/doctrine2/lib/vendor/doctrine-common Common&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
ln -s /ruta/hacia/doctrine2/lib/vendor/doctrine-dbal DBAL&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
ln -s /ruta/hacia/doctrine2/lib/vendor/doctrine-build-common&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;build-common&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;ln -s /ruta/hacia/&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;doctrine2/lib/Doctrine/ORM ORM&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
Ahora nos posicionamos en la carpeta &quot;&lt;span style=&quot;background-color: white;&quot;&gt;/applicationpath/protected/extensions/Wildkat/YiiExt/DoctrineOrm/vendor/Symfony&quot; y hacemos el siguiente enlace&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;ln -s /ruta/hacia/&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;doctrine2/lib/vendor/Symfony/Component Component&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
Una vez tenemos estos archivos debemos hacer lo siguiente en nuestro archivo applicationpath/protected/config/main.php y&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;applicationpath/protected/config/console.php&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;agregamos la siguiente linea antes del arreglo&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;pre&gt;Yii::setPathOfAlias(&#39;Wildkat&#39;, realpath(dirname(__FILE__) . &#39;/../extensions/Wildkat&#39;));&lt;/pre&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;luego en el indice componente del arreglo agregamos lo siguiente&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre&gt;&#39;components&#39;=&amp;gt;array(&lt;/pre&gt;
&lt;pre&gt;    // los componentes que ya tengamos configurados&lt;/pre&gt;
&lt;pre&gt;    &#39;doctrine&#39; =&amp;gt; array(
     &#39;class&#39; =&amp;gt; &#39;Wildkat\YiiExt\DoctrineOrm\DoctrineContainer&#39;,
     &#39;dbal&#39; =&amp;gt; array(
         &#39;default&#39; =&amp;gt; array(
             &#39;driver&#39; =&amp;gt; &#39;pdo_mysql&#39;,
             &#39;host&#39; =&amp;gt; &#39;localhost&#39;,
             &#39;dbname&#39; =&amp;gt; &#39;dbname&#39;,
             &#39;user&#39; =&amp;gt; &#39;userdb&#39;,
             &#39;password&#39; =&amp;gt; &#39;passworddb&#39;,
         ),
     ),
     &#39;cache&#39; =&amp;gt; array(
         &#39;default&#39; =&amp;gt; array(
             &#39;driver&#39; =&amp;gt; &#39;ArrayCache&#39;,
             &#39;namespace&#39; =&amp;gt; &#39;__app&#39;,
         ),
     ),
     &#39;entityManager&#39; =&amp;gt; array(
         &#39;default&#39; =&amp;gt; array(
             &#39;connection&#39; =&amp;gt; &#39;default&#39;,
             &#39;metadataCache&#39; =&amp;gt; &#39;default&#39;,
             &#39;queryCache&#39; =&amp;gt; &#39;default&#39;,
             &#39;entityPath&#39; =&amp;gt; &#39;application.models.entities&#39;,
             &#39;mappingDriver&#39; =&amp;gt; &#39;YamlDriver&#39;,
             &#39;mappingPaths&#39; =&amp;gt; array(
                 &#39;application.models.entities&#39;
             ),
             &#39;proxyDir&#39; =&amp;gt; &#39;application.data&#39;,
             &#39;proxyNamespace&#39; =&amp;gt; &#39;Proxy&#39;,
         ),
     ),
 ),&lt;/pre&gt;
&lt;/div&gt;
persomalmente cambie la carpeta donde que hace el mapping a la misma donde creo las entidades &quot;&lt;span style=&quot;background-color: white;&quot;&gt;application.models.entities&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&quot;, sin embargo cada quien puede configurarla donde desee.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Una vez tenemos esta configuración ahora tenemos que copiar el archivo&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;applicationpath/protected/extensions/Wildkat/YiiExt/DoctrineOrm/commands/DoctrineOrmCommand.php a la carpeta&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;applicationpath/protected/commands para tener disponible en yiic las ordenes para trabajar con doctrine.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
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</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/770723218920812336/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/configurando-la-extension.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/770723218920812336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/770723218920812336'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/configurando-la-extension.html' title='Configurando la Extensión YiiDoctrine2Orm'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-4018709807058434103</id><published>2012-06-24T15:01:00.002-04:30</published><updated>2012-06-24T15:46:14.153-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="YiiFramework"/><title type='text'>Comparación simple entre algunas extensiones para el control de acceso de YiiFramework</title><content type='html'>&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
Como lo prometido
es deuda, estuve jugando un poco con las extensiones para control de
acceso que me recomendaban en la &lt;a href=&quot;https://www.facebook.com/groups/171245476282742/&quot; target=&quot;_blank&quot;&gt;Página de facebook de YiiFramework en Español&lt;/a&gt;, 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&amp;nbsp;preámbulos vamos a la comparación&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;b&gt;&lt;a href=&quot;http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#role-based-access-control&quot; target=&quot;_blank&quot;&gt;AuthManager&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
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
&lt;a href=&quot;http://www.yiiframework.com/wiki/65/how-to-setup-rbac-with-a-php-file/&quot;&gt;http://www.yiiframework.com/wiki/65/how-to-setup-rbac-with-a-php-file/&lt;/a&gt;,
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 &lt;a href=&quot;https://www.facebook.com/groups/171245476282742/&quot; style=&quot;background-color: white;&quot; target=&quot;_blank&quot;&gt;Página de facebook de YiiFramework en Español&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
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.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;b&gt;&lt;a href=&quot;http://www.yiiframework.com/extension/srbac/&quot; target=&quot;_blank&quot;&gt;SRBAC&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
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&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&#39;class&#39;=&amp;gt;&#39;modules.srbac.components.SDbAuthManager&#39;&lt;/pre&gt;
” falto
colocar al principio el application al principio para que pudiera
el autoload cargarlo, sin embargo una vez configurado correctamente
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&#39;class&#39;=&amp;gt;&#39;application.modules.srbac.components.SDbAuthManager&#39;&lt;/pre&gt;
&lt;br /&gt;
, 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 &lt;b&gt;srbac &lt;/b&gt;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.
&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;b&gt;&lt;a href=&quot;http://www.yiiframework.com/extension/rights/&quot; target=&quot;_blank&quot;&gt;YiiRights&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
El
más recomendado en la&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/groups/171245476282742/&quot; style=&quot;background-color: white;&quot; target=&quot;_blank&quot;&gt;Página de facebook de YiiFramework en Español&lt;/a&gt;&lt;span style=&quot;background-color: white;&quot;&gt;,
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 &lt;/span&gt;&lt;a href=&quot;https://github.com/schmunk42/yii-rights&quot; style=&quot;background-color: white;&quot;&gt;https://github.com/schmunk42/yii-rights&lt;/a&gt;&lt;span style=&quot;background-color: white;&quot;&gt;
solo un git clone y ya tenemos nuestra extensión en la carpeta de la
aplicación&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;b&gt;&lt;a href=&quot;http://code.google.com/p/yii-user-management/&quot; target=&quot;_blank&quot;&gt;YUM&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
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
&lt;a href=&quot;http://code.google.com/p/yii-user-management/&quot;&gt;http://code.google.com/p/yii-user-management/&lt;/a&gt;
y por supuesto descargar y probar esta excelente extensión&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
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.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0cm;&quot;&gt;
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&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/4018709807058434103/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/comparacion-simple-entre-algunas.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4018709807058434103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4018709807058434103'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/comparacion-simple-entre-algunas.html' title='Comparación simple entre algunas extensiones para el control de acceso de YiiFramework'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-4335291139522450280</id><published>2012-06-17T18:39:00.000-04:30</published><updated>2012-06-24T15:46:30.883-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="YiiFramework"/><title type='text'>Lo nuevo que nos traerá YiiFramework 2</title><content type='html'>Como ya había comentado en el post anterior actualmente me estoy nutriendo mucho con YiiFramework, hoy leyendo en&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/&quot;&gt;http://www.linkedin.com/&lt;/a&gt;&amp;nbsp;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.&lt;br /&gt;
Dejo la presentación:&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;__ss_13072930&quot; style=&quot;width: 425px;&quot;&gt;
&lt;strong style=&quot;display: block; margin: 12px 0 4px;&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/samdark/alexander-makarov-yii2-whats-new&quot; target=&quot;_blank&quot; title=&quot;YiiConf 2012 - Alexander Makarov - Yii2, what&#39;s new&quot;&gt;YiiConf 2012 - Alexander Makarov - Yii2, what&#39;s new&lt;/a&gt;&lt;/strong&gt; &lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;355&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/13072930&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC;&quot; width=&quot;425&quot;&gt;&lt;/iframe&gt; &lt;br /&gt;
&lt;div style=&quot;padding: 5px 0 12px;&quot;&gt;
View more &lt;a href=&quot;http://www.slideshare.net/&quot; target=&quot;_blank&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/samdark&quot; target=&quot;_blank&quot;&gt;Alexander Makarov&lt;/a&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
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&amp;nbsp;&lt;a href=&quot;https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md&quot; target=&quot;_blank&quot;&gt;PSR-0&lt;/a&gt;&amp;nbsp;para los autoload, en fin la presentación ya lo dice todo.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Saludos espero que les sea de utilidad esta presentación</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/4335291139522450280/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/lo-nuevo-que-nos-traera-yiiframework-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4335291139522450280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4335291139522450280'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/lo-nuevo-que-nos-traera-yiiframework-2.html' title='Lo nuevo que nos traerá YiiFramework 2'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-882265567559280779</id><published>2012-06-12T18:05:00.000-04:30</published><updated>2012-06-24T15:47:05.908-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="framewokrs"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Introduciendonos en el mundo de los Frameworks PHP</title><content type='html'>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 &amp;nbsp;PHP que no se han adentrado en el mundo de los frameworks.&lt;br /&gt;
&lt;br /&gt;
Lo primero que debemos tener claro es que es un &lt;b&gt;framework PHP, &lt;/b&gt;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.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Porque un framework?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;¿Puedo hacer mi propio framework?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
Esta es la pregunta del millón, siempre que me la hacen mi respuesta es la siguiente &quot;Claro que pudieras hacer tu propio framework con buenas prácticas de programación&quot;, 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.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Que busco en un framework php?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sistema de plantillas fácil de manejar.&lt;br /&gt;
&lt;br /&gt;
Soporte por parte de la comunidad (es decir que no este en el olvido).&lt;br /&gt;
&lt;br /&gt;
Componentes o librerías que nos brinda el framework.&lt;br /&gt;
&lt;br /&gt;
Facilidad para integrar con librerías externas a lo que son el framework ejemplo (FPDF, Doctrine, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Es un framework un CMS?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Top tres de frameworks (opinión personal)?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://symfony.com/&quot; target=&quot;_blank&quot;&gt;Symfony 2&lt;/a&gt;: &lt;/b&gt;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&amp;nbsp;&lt;a href=&quot;http://symfony.com/&quot; target=&quot;_blank&quot;&gt;doctrine 2&lt;/a&gt;, 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.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://framework.zend.com/&quot; target=&quot;_blank&quot;&gt;ZendFramework&lt;/a&gt;:&lt;/b&gt; Muchos dicen que es el framework ofical de php ya que lo creo y da soporte la comunidad de los que desarrollan el php &quot;Zend&quot;, 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.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://www.yiiframework.com/&quot; target=&quot;_blank&quot;&gt;YiiFramewor&lt;/a&gt;: &lt;/b&gt;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.&lt;br /&gt;
&lt;br /&gt;
Personalmente utilizo yiiFramework actualmente, aunque cualquiera de los tres que acabo de nombrar los usaría con gusto.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/882265567559280779/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/introduciendonos-en-el-mundo-de-los.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/882265567559280779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/882265567559280779'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/06/introduciendonos-en-el-mundo-de-los.html' title='Introduciendonos en el mundo de los Frameworks PHP'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-577757389109600571</id><published>2012-05-13T12:51:00.002-04:30</published><updated>2012-05-13T20:12:12.378-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Excepciones"/><category scheme="http://www.blogger.com/atom/ns#" term="Exceptiom"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>Manejo de errores y excepciones PHP</title><content type='html'>Buenas en esta entrada intentaré explicar un poco &lt;b&gt;el manejo de errores y excepciones con PHP&lt;/b&gt;, comenzaremos definiendo un poco que es un error a nivel de programación.&lt;br /&gt;
Un &lt;b&gt;error&lt;/b&gt; 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 &quot;;&quot; a final de cada línea de instrucción.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Una &lt;b&gt;excepción&lt;/b&gt; 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

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;/**
*
* conexion con el servidor
*/
$dns = &#39;mysql:host=localhost;db=test&#39;;
$user = &#39;user&#39;;
$password = &#39;password&#39;;
// si vemos esta línea el interprete de php encuentra un error al no encontrar el final de línea &quot;;&quot;
$connect = new PDO($dns, $user, $password)
&lt;/pre&gt;
&lt;br /&gt;
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

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;/**
*
* conexion con el servidor
*/
$dns = &#39;mysql:host=localhost;db=test&#39;;
$user = &#39;user&#39;;
$password = &#39;password&#39;;
// si vemos esta línea el interprete de php encuentra un error al no encontrar el final de línea &quot;;&quot;
$connect = new PDO($dns, $user, $password);
&lt;/pre&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Lo primero que tenemos que conocer es la clase &lt;a href=&quot;http://www.php.net/manual/en/class.exception.php&quot; target=&quot;_blank&quot;&gt;Exception&lt;/a&gt; esta nos brinda la posibilidad de manejar todas las excepciones que lance el lenguaje.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Ahora hablaremos un poco de &lt;b&gt;throw:&lt;/b&gt; 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

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;function test($a) {
    if(!$a) {
        throw new Exception(&#39;Error al comparar a&#39;);
    } else  {
       echo $a;
    }
}
&lt;/pre&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;try/catch&lt;/b&gt; 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&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;try {
   test(0);
} catch(Exception $e) {
   $e-&amp;gt;getMessage(); 
}
&lt;/pre&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Para el caso de los objetos trabajaremos con una sencilla clase

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;/**
*
* 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(&#39;Debe de indicar un numero&#39;);
        }
        if(is_int($number)) {
            return true;
        } else {
            return false;
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
Entonces cuando nos toque utilizar este objeto deberíamos realizar lo siguiente

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;try {
    $test = new Test();
    $test-&amp;gt;testInteger(1);
    $test-&amp;gt;testInteger(&#39;hola&#39;);
} catch(TestException $e) {
    echo $e-&amp;gt;__toString();
}
&lt;/pre&gt;
&lt;br /&gt;
si ejecutamos el código nos dara como resultado algo como esto 

&lt;br /&gt;
&lt;blockquote&gt;
exception &#39;TestException&#39; with message &#39;Debe de indicar un numero&#39; in /var/www/loqueras/Test.php:22 Stack trace: #0 /var/www/loqueras/Test.php(35): Test-&amp;gt;testInteger(&#39;hola&#39;) #1 {main}&lt;/blockquote&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &quot;@&quot; 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.</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/577757389109600571/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/05/manejo-de-errores-y-excepciones-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/577757389109600571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/577757389109600571'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/05/manejo-de-errores-y-excepciones-php.html' title='Manejo de errores y excepciones PHP'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-3664464522979457527</id><published>2012-03-03T18:25:00.000-04:30</published><updated>2012-03-03T20:33:11.007-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Libreria"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>Presentación de mi mini Librería FileManager</title><content type='html'>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.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;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, &lt;a href=&quot;https://github.com/carlosbelisario/FileManager/tree/master/libs&quot;&gt;en mi repositorio publico de github&lt;/a&gt; encontramos la libreria y la utilizamos de la siguiente manera:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;archivo.csv&lt;br /&gt;
&amp;nbsp;campo1;campo2;campo3&lt;br /&gt;
&amp;nbsp;valor11;valor12;valor13&lt;br /&gt;
valor21;valor22;valor23&lt;br /&gt;
valor31;valor32;valor33&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;instanciamos la clase y le indicamos el archivo&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;    require_once &#39;filemanager/libs/FileManager.php&#39;;

    $file = new file(&#39;archivo.csv&#39;);
    $fileManager = new FileManager();
    $fileManager-&amp;gt;setFile($file);
&lt;/pre&gt;
&lt;br /&gt;
obtenemos el contenido del archivo en un arreglo

&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;    $contenido = $fileManager-&amp;gt;read();
    foreach($contenido as $linea =&amp;gt; $contenido) {
        echo &quot;$linea.- $contenido&quot;;
    }
&lt;/pre&gt;
&lt;br /&gt;
podemos mostrarlo o realizar cualquier trabajo que deseemos con el.

escribir nuevo contenido al archivo

&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;    $nuevoContenido = &quot;a;b;c\nd;e;f\n&quot;;
    $fileManager-&amp;gt;changeMode(&#39;w&#39;);
    $fileManager-&amp;gt;write($nuevoContenido);
&lt;/pre&gt;
&lt;br /&gt;
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

&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;    $nuevoContenido = &quot;a;b;c;&quot;;
    $fileManager-&amp;gt;changeMode(&#39;a&#39;);
    $fileManager-&amp;gt;addNewLine($nuevoContenido);
&lt;/pre&gt;
&lt;br /&gt;
como su nombre lo indica agrega una nueva linea.

Actualización del archivo 
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;    //el contenido
    $nuevoContenido = &quot;a;b;c;&quot;;
    //la linea a actualizar
    $line = 1;
    $fileManager-&amp;gt;changeMode(&#39;w&#39;);
    $fileManager-&amp;gt;update($line, $nuevoContenido);
&lt;/pre&gt;
&lt;br /&gt;
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

&lt;br /&gt;
&lt;pre class=&quot;bursh: php;&quot;&gt;    //el contenido
    $nuevoContenido = &quot;a;b;c;&quot;;
    //la linea a actualizar
    $line = 1;
    $fileManager-&amp;gt;changeMode(&#39;w&#39;);
    //hace lo mismo que write,
    $fileManager-&amp;gt;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-&amp;gt;save($nuevoContenido, 1);
&lt;/pre&gt;
&lt;br /&gt;
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.

&lt;br /&gt;
&lt;pre class=&quot;bursh: php;&quot;&gt;    
    $fileManager-&amp;gt;delete();
&lt;/pre&gt;
&lt;br /&gt;
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 &#39;r&#39;, 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
&lt;br /&gt;
&lt;pre class=&quot;bursh: php;&quot;&gt;    
    $fileManager-&amp;gt;changeMode(&#39;w&#39;);
&lt;/pre&gt;
&lt;br /&gt;
mas información sobre los modos de apertura de un archivo &lt;a href=&quot;http://www.php.net/manual/es/function.fopen.php&quot;&gt;aca&lt;/a&gt;.


espero que la librería les sea de utilidad, saludos cualquier comentario es bien aceptado</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/3664464522979457527/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/03/presentacion-de-mi-mini-libreria.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/3664464522979457527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/3664464522979457527'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/03/presentacion-de-mi-mini-libreria.html' title='Presentación de mi mini Librería FileManager'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-8358204247389088243</id><published>2012-02-24T22:17:00.000-04:30</published><updated>2012-02-24T22:17:02.829-04:30</updated><title type='text'>Rutas en PHP</title><content type='html'>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 &lt;b&gt;rutas en PHP&lt;/b&gt; podemos decir que tenemos dos maneras de implementarlas

1.- &lt;b&gt;Rutas Absolutas:&lt;/b&gt; 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
&lt;pre class=&quot;brush: php;&quot;&gt;
$hola = &quot;Hola Mundo!!&quot;;
&lt;/pre&gt;
index.php
&lt;pre class=&quot;brush: php;&quot;&gt;
require_once(&#39;http://tusitio.com/archivos/incluir.php&#39;);
echo $hola;
&lt;/pre&gt;

el resultado sería hola mundo en nuestro navegador, ya que incluimos el archivo por medio de una ruta absoluta, fácil verdad??

2.- &lt;b&gt;Rutas Relativas:&lt;/b&gt; 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
&lt;pre class=&quot;brush: php;&quot;&gt;
require_once(&#39;procesos/miProceso.php&#39;);
&lt;/pre&gt;
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 &#39;../&#39; 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

&lt;pre class=&quot;brush: php;&quot;&gt;
require_once(&#39;../class/myClass.php&#39;);
&lt;/pre&gt;
    
que hicimos??

al hacer &quot;../&quot; 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 (&quot;class/&quot;) 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</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/8358204247389088243/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/02/rutas-en-php.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/8358204247389088243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/8358204247389088243'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/02/rutas-en-php.html' title='Rutas en PHP'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-7559913097923350818</id><published>2012-01-22T13:37:00.002-04:30</published><updated>2012-01-22T13:37:55.911-04:30</updated><title type='text'>Clase para gestión de Usuario</title><content type='html'>En una Discusión que se formo en un aporte que hizo un compañero de &lt;a href=&quot;http://www.forosdelweb.com/f18/aporte-clase-inicio-sesion-para-cualquier-pagina-con-mysql-970994/&quot;&gt;forosdelweb&lt;/a&gt;, 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 
&lt;pre class=&quot;brush: php;&quot;&gt;

error_reporting(E_ALL);
/**
 * 
 * clase para gestionar Usuarios
 * @author Carlos Belisario &lt;carlosbelisario.com&gt;
 * @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-&gt;db = $db;
    }

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

    public function setError($k, $error)
    {
        $this-&gt;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(&quot;/(^[a-z]{1,20})(?!\s)([\w-\.]{0,20}$)/i&quot;,  $this-&gt;getUsuario())){
            $sql = &quot;SELECT * FROM usuarios WHERE usuario = :usuario AND password = :password&quot;;
            try {
                // hacemos la consulta
                $query = $this-&gt;db-&gt;prepare($sql);            
                $query-&gt;bindParam(&#39;:usuario&#39;, $this-&gt;getUsuario());
                $query-&gt;bindParam(&#39;:password&#39;, $this-&gt;getPassword());
                $query-&gt;execute();
                $row = $query-&gt;fetchObject();
                //verificamos que el usuario exista en la base de datos y la password sea correcta
                if(!empty($row)) {                                                                                  
                    $this-&gt;setRol($row-&gt;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-&gt;setEstatus($row-&gt;estatus);
                        
                    /* o podemos incluirlo en los errores, de manera que no haga login
                    if($row-&gt;estatus == &quot;habilitado&quot;) {
                        $this-&gt;setRol($row-&gt;rol);                                                                 
                    } else {
                        $this-&gt;setError (&#39;userEstatus&#39;, &#39;El Usuario no esta habilitado&#39;);
                    }*/                          
                    
                } else {
                    $this-&gt;setError(&#39;errorLogin&#39;, &#39;El Usuario o la Contraseña no es Correcta&#39;);
                }    
            
             } catch( PDOException $e) {
                 $e-&gt;getMessage();
             }                     
        } else {
            $this-&gt;setError(&#39;erroFormato&#39;, &#39;Formato de usuario no permitido&#39;);
        }   
    }
}

/**
* como usar
*/
try {
//establecemos la conexion con PDO
    $db = new PDO(&#39;mysql:host=localhost; dbname=prueba&#39;, &#39;root&#39;, &#39;123&#39;);   
} catch(PDOException $e) {
   echo $e-&gt;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-&gt;setUsuario(&#39;carlos&#39;);
$class-&gt;setPassword(&#39;123456&#39;);
//indicamos que realice el login
$class-&gt;login();
//sino existe algn error 
if(count($class-&gt;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 &quot;&lt;pre&gt;&quot;;
    print_r($class-&gt;getError());
    echo &quot;&lt;/pre&gt;&quot;;
}

&lt;/pre&gt;
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</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/7559913097923350818/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2012/01/clase-para-gestion-de-usuario.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/7559913097923350818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/7559913097923350818'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2012/01/clase-para-gestion-de-usuario.html' title='Clase para gestión de Usuario'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-5294137586125381307</id><published>2011-06-09T17:20:00.001-04:30</published><updated>2011-06-09T17:22:09.529-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Comenzando con PHP -  Operadores</title><content type='html'>En esta entrada, continuando con la serie de artículos introductorios al &lt;b&gt;PHP, &lt;/b&gt;estaremos hablando de los operadores en &lt;b&gt;PHP&amp;nbsp; &lt;/b&gt;y lo que podemos ir logrando con ellos, también hablaremos un poco de la concatenación de string, variables profundizando un poco más en el lenguaje en si, aunque todavía no hemos hecho ninguna aplicación :-).&lt;br /&gt;
&lt;br /&gt;
Los operadores no son mas que los carácteres que nos permiten realizar ciertas operaciones, en PHP podemos realizar desde operaciones básicas(suma, resta, etc) hasta algunas un poco más complejas, para no extendernos tanto en el tema comencemos a conocer los operadores básicos en PHP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Operadores Aritméticos&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Como su mismo nombre lo indica son los operadores que nos permiten realizar operaciones aritméticas en nuestros programas, estos son sencillos, ya que son los que diariamente nos encontramos, entre ellos tenemos:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;+ (Suma): El signo de mas(+) es el operador que utilizamos para realizar la suma en nuestras operaciones, un ejemplo:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$resultado = 1 + 1;
echo $resultado;
&lt;/pre&gt;Sencillo, nada que no hallamos conocido hasta ahora :-).&lt;/li&gt;
&lt;li&gt;- (resta): El signo - como es de imaginar lo utilizamos para restar, también nos brinda la sencilles de operaciones que ya hemos realizado.&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$resultado = 3 - 1;
echo $resultado;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;* (multiplicación): Para los que no han tenido ninguna relación con un lenguaje de programación normalmente el simbolo del asterisco (*) es el que se utiliza para hacer referencia a la multiplicación, &lt;b&gt;PHP&lt;/b&gt; no es la excepción.&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$resultado = 3 * 5;
echo $resultado;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;/ (división): Si como lo podemos ver tenemos el slash(/) como signo para identificar la división, ejemplo&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$resultado = 4 / 2;
echo $resultado;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;% (modulo): En este momento es cuando los que estamos comenzando empezamos a conocer operadores, para los que no lo conocen el módulo es el residuo que queda de una división, este es muy utilizado al momento de saber si un numero es par o impar, pongamos un ejemplo:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$modulo = 10 % 2;
if($modulo == 0){
   echo &quot;el numero es par y su residuo es $modulo&quot;;
}
$modulo1 = 9 % 2;
if($modulo1 == 0){
   echo &quot;el numero es par&quot;;
}
else{
    echo &quot;el numero es impar y su residuo es $modulo1&quot;;
}
echo $resultado;
&lt;/pre&gt;Que es lo que hace el modulo?? divide el numero de la izquierda entre el numero después del símbolo del porcentaje, y retorna como resultado el residuo que quede de esta división, en el primer caso retornaria &lt;b&gt;&quot;el numero es par y su residuo es 0&quot;&lt;/b&gt;, en el segundo caso&amp;nbsp; &lt;b&gt;&quot;el numero es impar y su residuo es 1&quot;&lt;/b&gt;, para probarlo hagan una división a mano y vean el residuo y entenderan un poco mas (a practicar matemáticas jaja XD).&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Operador de Concatenación de String.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para concatenar dos string e incluso una variable utilizamos el punto (.)&lt;b&gt;&amp;nbsp;&lt;/b&gt;&amp;nbsp; seguido del string que deseemos concatenar un ejemplo.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$variable = &quot;hola&quot;;
echo &#39;yo deseo que se imprima lo que dice la variable y esto es &#39; . $variable;
&lt;/pre&gt;&lt;br /&gt;
El resultado seria &lt;b&gt;&quot;yo deseo que se imprima lo que dice la variable y esto es hola&quot;, &lt;/b&gt;esta es una simple concatenación para irnos familiarizando, esto lo utilizaremos bastante eso lo aseguro :-).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Operador de Asignación&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
El operador de asignación en PHP es el signo igual &lt;b&gt;&quot;=&quot;&lt;/b&gt;, lo utilizamos para asignar valores a las variables, aunque se ve bastante sencillo PHP nos permite varias formas de asignar valores a nuestras variables, veamos algunas de ellas.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;= (Igual): Asigna el valor a la variable, ejemplo:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$variable = &quot;hola&quot;;
&lt;/pre&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; .= (  punto seguido del signo igual): Asigna un valor a la variable, si la variable ya contiene un valor, el resultado seria el valor actual de la variable concatenado con el valor que deseamos agregar a esta, un ejemplo:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$variable = &quot;hola &quot;;
$variable .= &quot;Como estas&quot;;
echo $variable;
&lt;/pre&gt;El resultado seria &lt;b&gt;&quot;hola Como estas&quot;&lt;/b&gt;, fácil verdad??&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;+= (símbolo de mas seguido del igual): Al igual que con el punto lo que hacemos es sumar al valor que ya contiene la variable (lo que es igual a un acumulador), si hacemos algo como esto &lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$i = 0;
$i += 5;
$i += 10;
echo $i;
&lt;/pre&gt;Si como ya deben de saber el resultado seria 15.&lt;/li&gt;
&lt;/ul&gt;Para no extendernos con este tipo de asignación podemos realizar la misma forma de asignar con cada uno de los operadores aritméticos ya indicados y estos harán la respectiva operación con el valor y luego la asignación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Operadores de Comparación&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los operadores de comparación como bien su nombre lo indica se utilizan para hacer comparaciones, estos retornan un valor booleano true / false, mayormente lo utilizamos en los condicionales (ya hablaremos de estos), veamos cuales operadores podemos utilizar:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;== Doble Igual (Igual que): Colocando el == Indicamos al interprete de PHP que estamos haciendo una comparación de que el valor de la izquierda es igual al valor de la derecha, ejemplo.&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;var_dump(2 == 2);
//retorna true
var_dump(2 == 1);
//retorna false
&lt;/pre&gt;Si copiamos este código y lo vemos en el navegador obtendriamos algo como esto &lt;br /&gt;
&lt;blockquote&gt;bool(true) bool(false) &lt;/blockquote&gt;Si es el retorno de nuestras comparaciones.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;! (cierre exclamación): Con este operador indicamos al navedador que debe negar una operacion si hacemos algo como esto&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;var_dump(! 2 == 2);
&lt;/pre&gt;Obtendremos bool(false) ya que estamos negando el valor que nos da ese resultado.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;!= cierre exclamación igual (diferente): Si como imaginan estamos negando el igual, así que este operador lo utilizamos para indicar que un valor sea diferente, si tomamos el ejemplo inicial &lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;var_dump(2 != 2);
//retorna false
var_dump(2 != 1);
//retorna true&lt;/pre&gt;Ahora obtendriamos el resultado inverso al que colocábamos en la comparación inicial.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&amp;lt;&amp;gt; (diferente): Si es equivalente al operador anterior por lo que podemos utilizar el que deseemos.&lt;/li&gt;
&lt;li&gt;&amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;= estos signos creo que todos en algún momento los hemos visto, pondré un ejemplo del uso de cada uno.&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;var_dump(2 &amp;lt; 5);
//retorna true
var_dump(5 &amp;lt; 2);
//retorna false
var_dump(2 &amp;gt; 5);
//retorna false
var_dump(5 &amp;gt; 2);
//retorna true
var_dump(5 &amp;lt;= 2);
//retorna false
var_dump(2 &amp;lt;= 5);
//retorna true
var_dump(2 &amp;lt;= 2);
//retorna true
var_dump(5 &amp;gt;= 2);
//retorna true
var_dump(2 &amp;gt;= 5);
//retorna false
var_dump(2 &amp;gt;= 2);
//retorna true
&lt;/pre&gt;Fácil verdad??.&lt;/li&gt;
&lt;li&gt;=== (identico): este operador es muy similar al igual cuando estamos comparando, la gran diferencia es que este evalúa que sean del mismo tipo y el mismo caracter, veamos un ejemplo básico&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;var_dump(&quot;1&quot; == 1);
//retorna true
var_dump(&quot;1&quot; === 1);
//retorna false
&lt;/pre&gt;pero porque?? si es el mismo numero??&lt;br /&gt;
Como se dijo anteriormente las cadenas de carácteres siempre estan entre comillas (así sean números) y los caracteres numéricos no, entonces al preguntar si es igual evalúa que es el mismo caracter, pero si evaluamos si son idénticos al no ser del mismo tipo retorna false.&lt;/li&gt;
&lt;li&gt;!== (no identico): al igual que en el anterior este evalúa el tipo de dato que estamos evaluando, en sí este evalúa si no son iguales y que no sean del mismo tipo, ejemplo: &lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;var_dump(&quot;1&quot; !== 1);
//retorna true
var_dump(1 !== 1);
//retorna false&lt;/pre&gt;como podemos observar es todo lo contrario al anterior.&lt;/li&gt;
&lt;/ul&gt;Operadores de Incremento:&lt;br /&gt;
&lt;br /&gt;
En PHP podemos incrementar el numero de una variable muy fácilmente, utilizando este tipo de operador, hay cuatro de este tipo y los presentamos a continuación&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Pre-incremento ++$i: Cuando hacemos el pre-incremento primero hacemos el incremento en uno a la variable y luego la retornamos ejemplo:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$i = 0;
echo ++$i;
echo &quot; 

&quot; . $i;
&lt;/pre&gt;esto me retornara &lt;br /&gt;
&lt;blockquote&gt;1&lt;br /&gt;
1&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
Post-Incremento $i++: Este operador hace lo inverso al anterior, retorna el valor y luego incrementa en uno a la variable veamos un ejemplo:&lt;br /&gt;
&lt;pre brush:=&quot;&quot; php;=&quot;&quot;&gt;$i = 0;
echo $i++;
echo &quot; 

&quot; . $i;
&lt;/pre&gt;&lt;blockquote&gt;0&lt;br /&gt;
1&lt;/blockquote&gt;En lo personal mayormente cuando trabajajo con bucles utilizo este operador, aunque cada uno tiene el caso en el cual puede ser usado.&lt;/li&gt;
&lt;li&gt;Pre-decremento --$i: Cuando hacemos el pre-incremento primero  hacemos un decremento en uno a la variable y luego la retornamos  ejemplo:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$i = 10;
echo --$i;
echo &quot; 

&quot; . $i;
&lt;/pre&gt;esto me retornara &lt;br /&gt;
&lt;blockquote&gt;9&lt;br /&gt;
9&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt; Post-Incremento $i--: Igualmente este operador hace lo inverso al descrito anteriormente, retorna  el valor y luego decrementa en uno a la variable veamos un ejemplo:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$i = 10;
echo $i--;
echo &quot; 

&quot; . $i;
&lt;/pre&gt;&lt;blockquote&gt;10&lt;br /&gt;
9&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ul&gt;Estos son algunos de los operadores en PHP, los más básicos con los que podemos empezar a hacer nuestros programas, más adelante iremos dando y viendo la utilidad que tienen estos, un saludo y hasta una próxima entrada.</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/5294137586125381307/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-operadores.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5294137586125381307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5294137586125381307'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-operadores.html' title='Comenzando con PHP -  Operadores'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-5519048539739581801</id><published>2011-06-07T21:00:00.000-04:30</published><updated>2011-06-07T21:00:17.939-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Comenzando con PHP -  Variables y Constantes</title><content type='html'>En el &lt;a href=&quot;http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-mi-primer-codigo.html&quot; target=&quot;_blank&quot;&gt;artículo anterior &lt;/a&gt; hicimos nuestro primer código &lt;b&gt;PHP&lt;/b&gt;, este fue el popular hola mundo, en el día de hoy vamos a profundizar un poco más en el lenguaje, tocaremos el tema de &lt;b&gt;&quot;Las Variables y las Constantes en PHP&quot;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Lo primero que hay que tener claro es:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Que es una variable?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Una &lt;b&gt;variable&lt;/b&gt; no es mas que una posición en memoria que guardara un dato específico dentro de nuestro código, en &lt;b&gt;PHP&lt;/b&gt; las variables son declaradas con el signo dollar &lt;b&gt;&quot;$&quot;&lt;/b&gt; seguido de una palabra que haga referencia al valor que deseamos que esta contenga, un ejemplo de esto seria.&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$nombre = &quot;Carlos&quot;;
$apellido = &quot;Belisario&quot;;
&lt;/pre&gt;&lt;br /&gt;
Fácil no??&lt;br /&gt;
&lt;br /&gt;
Como vemos en PHP no hace falta la declaración del tipo de variable que se debe hacer normalmente en lenguajes como &lt;b&gt;JAVA&lt;/b&gt; o &lt;b&gt;Lenguaje C&lt;/b&gt;, el interprete de &lt;b&gt;PHP&lt;/b&gt; entiende el tipo de dato al que pertenece la variable por medio del valor que este contiene.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tipos de Datos que puede contener una variable&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;String o Cadenas de Carácteres:&amp;nbsp;&lt;/b&gt; Como su nombre lo indica son variables cuyo valor contiene una cadena de carácteres, para definir las cadenas como se dijo en el artículo&amp;nbsp;anterior deben de estar entre comillas Dobles &lt;b&gt;&quot; &quot;&lt;/b&gt; o comillas simples &lt;b&gt;&#39; &#39;&lt;/b&gt;, ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$string = &quot;Esto es una cadena o string&quot;;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Números Enteros&lt;/b&gt;: Son variables que como su nombre lo indican contienen un número entero (sin decimal) dentro de ellas, para declarar estas variables solo hace falta asignar el número a la variable sin comillas, ejemplo&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$entero = 10;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Numeros Reales o Punto flotante: &lt;/b&gt;Son variables que contienen un numero real o con decimal dentro de ellos, al igual que los enteros se declaran asignando el valor numérico a la variable sin necesidad de que este entre comillas, el separador entre la parte entera y la parte decimal es el punto &lt;b&gt;&quot;.&quot;&lt;/b&gt; &lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$real = 15.5;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bool: &lt;/b&gt;Los variables con datos de tipo bool almacenan los valores de verdadero (true) o falso (false), son mayormente utilizadas para hacer condicionales (tema del que hablaremos en una próxima entrada). &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Array o Arreglos: &lt;/b&gt;En PHP como en algunos otros lenguajes tenemos este tipo de variable, útil al momento de guardar múltiples resultados de un solo tipo, este tipo de variable crea un &lt;a href=&quot;http://es.wikipedia.org/wiki/Vector_%28inform%C3%A1tica%29&quot; target=&quot;_blank&quot;&gt;vector&lt;/a&gt;&amp;nbsp; con los datos almacenados, los cuales pueden ser de diferentes tipos sin que esto sea considerado como un error, para crear un arreglo podemos hacerlo de diferentes formas veamos los casos:&lt;br /&gt;
&lt;b&gt;caso 1:&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$arreglo = array(&quot;dato del primer indice&quot;,&quot;dato del segundo indice&quot;,15);
&lt;/pre&gt;En este caso asignamos al arreglo los valores, indicando la palabra array seguido de los valores dentro de paréntesis, para acceder a un valor de un array debemos hacerlo por medio de los índices del mismo, cuando se crean de esta manera los índices son numéricos y comienzan desde el indice 0 (cero), hasta la cantidad de elementos que tenga el array, en este ejemplo seria &lt;br /&gt;
0 =&amp;gt; &quot;Dato del primer indice&quot;,&lt;br /&gt;
1 =&amp;gt; &quot;Dato del segundo indice&quot;,&lt;br /&gt;
2 =&amp;gt; 15&lt;br /&gt;
La forma de acceder a un valor de un array es por medio de su índice, esto lo hacemos indicando la variable seguida de el índice que deseamos mostrar, entonces si deseamos mostrar el valor del segundo índice tendríamos que hacer algo como esto &lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$arreglo = array(&quot;dato del primer indice&quot;,&quot;dato del segundo indice&quot;,15);
echo $arreglo[1]; 
&lt;/pre&gt;lo que daría como resultado una salida en el navegador diciendo &lt;b&gt;&quot;dato del segundo indice&quot;&lt;/b&gt;&lt;br /&gt;
Fácil verdad&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Caso 2:&lt;/b&gt;&lt;br /&gt;
Asignación dinámica del array&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$arreglo[] = &quot;Datos del primer índice&quot;;
$arreglo[] = &quot;Datos del segundo índice&quot;;
$arreglo[] = 15;
&lt;/pre&gt;Como vemos aca asignamos los datos de una manera dinámica, sin necesidad de indicar la palabra array, solo debemos abrir y cerrar corchete (sin índice en el medio) y este automáticamente tomara el indice que deseemos.&lt;br /&gt;
&lt;b&gt;Nota:&lt;/b&gt; Si deseamos podemos indicar el índice que queremos que tenga el valor en el array, aunque cuando se están creando de manera dinámica esto no es necesario.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Caso 3:&lt;/b&gt;&lt;br /&gt;
Arreglos asociativos:&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$arreglo[&#39;nombre&#39;] = &quot;Carlos&quot;;
$arreglo[&#39;apellido&#39;] = &quot;Belisario&quot;;
$arreglo[&#39;edad&#39;] = 24;
&lt;/pre&gt;Los arreglos asociativos son una de las mas maravillosas formas de crear un arreglo, ya que mediante este podemos indicar el índice con el nombre asociado al valor que estamos almacenando, en el caso que acabamos de mostrar, se veria de esta manera&lt;br /&gt;
&lt;br /&gt;
&#39;nombre&#39; =&amp;gt; &quot;Carlos&quot;,&lt;br /&gt;
&#39;apellido&#39; =&amp;gt; &quot;Belisario&quot;,&lt;br /&gt;
&#39;edad&#39; =&amp;gt; 23&lt;br /&gt;
&lt;br /&gt;
Pero como accedemos a sus valores?? Igualmente con el índice, la única diferencia es que este sera un valor asociativo (string), si quiero saber el nombre como lo haríamos?? &lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;echo $arreglo[&#39;nombre&#39;]
&lt;/pre&gt;Los arreglos son una de las partes fundamentales del lenguaje ya que con este tipo de datos es que mayormente se obtienen los resultados de consultas a las base de datos (ya llegaremos alla :-))&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Objetos:&lt;/b&gt; Los objetos son un tipo de dato más complejo, para los que están comenzando en el mundo de la programación decirle que es un objeto y hablarles de métodos, atributos sería correrlos (un poco de humor :-)), pero para los que gusten en un &lt;a href=&quot;http://desphpparatodos.blogspot.com/2011/03/hablando-de-clases-y-objetos-poo.html&quot; target=&quot;_blank&quot;&gt;artículo anterior &lt;/a&gt;se toco ese tema.&lt;/li&gt;
&lt;/ul&gt;Ahí tenemos alguno de los tipos de datos que podemos tener en una variable, una vez que entendemos el funcionamiento de las variables, ahora veamos lo que son las constantes.&lt;br /&gt;
&lt;br /&gt;
Una constante como su nombre lo indica es un valor que siempre sera el mismo dentro de un sistema, en PHP las definimos por medio de la funcion define(), son un poco menos utilizadas que las variables, pero si tienen su funcionalidad :-), veamos la definición de estas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;define(&#39;constante&#39;,&quot;Valor de la Constante&quot;);
echo constante;
&lt;/pre&gt;Como podemos ver las constantes se definen fácilmente, tenemos que tener claro que una constante solo es definida una vez, su valor luego no puede ser modificado.&lt;br /&gt;
&lt;br /&gt;
Fácil o no??&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hay que destacar que hay que cosas que tenemos que tener en cuenta al momento de declarar una constante, colocaremos algunas a continuación &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Las Constantes solo pueden ser definidas una vez, si en algún momento necesitáramos variar su valor entonces ya no tendría razón crear una constante sino crear una variable, hacer algo como esto&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;define(&#39;constante&#39;,&quot;Valor de la Constante&quot;);
define(&#39;constante&#39;,&quot;Otro valor&quot;);
echo constante;
&lt;/pre&gt;Sería un esfuerzo perdido para no decir error ya que el interprete de PHP no mostraría ninguno, pero el resultado siempre sera &lt;b&gt;&quot;Valor de la Constante&quot; &lt;/b&gt;porque son constantes :-).&lt;/li&gt;
&lt;li&gt;Las constantes solo contienen valores escalares, que quiere decir esto?? que no contendrán array ni objetos dentro de ellas.&lt;/li&gt;
&lt;/ul&gt;Una vez tenemos un poco más claro lo que son las &lt;b&gt;variables y constantes &lt;/b&gt;hagamos un pequeño programita, sencillo pero donde implementemos lo hablado hoy.&lt;br /&gt;
calculo del área de un circulo&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&lt;form action=&quot;&quot; method=&quot;post&quot; name=&quot;form&quot;&gt;Indique el Radio: &lt;input name=&quot;radio&quot; type=&quot;text&quot; /&gt;

&lt;input type=&quot;submit&quot; value=&quot;calcular Radio&quot; /&gt;
&lt;/form&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos es un pequeño programa donde calculamos el área de un circulo, fácil verdad.&lt;br /&gt;
&lt;pre&gt;Un poco fuera del tema principal como se puede notar PHP no trabaja solo ya que es un lenguaje de servidor, la parte visual que ve el cliente la hacemos con el HTML, en el programa que acabamos de hacer embebimos el PHP dentro de las etiquetas HTML.

&lt;/pre&gt;En conclusión hablamos de lo que son &lt;b&gt;las variables y constantes en PHP, &lt;/b&gt;espero que se entienda lo que se quiso transmitir en este tercer artículo para los que se inician con el &lt;b&gt;PHP&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/5519048539739581801/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-variables-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5519048539739581801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5519048539739581801'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-variables-y.html' title='Comenzando con PHP -  Variables y Constantes'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-5215837080305126381</id><published>2011-06-06T20:53:00.000-04:30</published><updated>2011-06-06T20:53:49.361-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Comenzando con PHP - MI Primer Código</title><content type='html'>En esta entrada comenzaremos a escribir código &lt;b&gt;PHP&lt;/b&gt;, para los que no lo conocen &lt;b&gt;PHP&lt;/b&gt; es un lenguaje de tipo &lt;b&gt;Scripter(Interpretado)&lt;/b&gt; que se ejecuta del lado del servidor, desarrollado para realizar aplicaciones web dinámicas, combinándolo con el lenguaje de etiquetas HTML y un servidor de base de datos como MySQL que es del que estaremos hablando a medida que vayamos creando artículos relacionados(un poco de teoría nunca puede faltar :-)).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Como podemos escribir código PHP??&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para empezar a escribir código &lt;b&gt;PHP&lt;/b&gt; hay una serie de programas que hacen falta, de los cuales hablamos en el artículo &lt;a href=&quot;http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-que-debemos-tener.html&quot; target=&quot;_blank&quot;&gt;anterior&lt;/a&gt;, una vez instalados todos estos artículos solo nos queda comenzar a escribir nuestro código.&lt;br /&gt;
&lt;br /&gt;
Para que nuestro navegador interprete el código que vayamos escribiendo es necesario encerrar entes entre la etiqueta de apertura y cierre de PHP, las cuales presentamos a continuación:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;lt;?php&lt;/span&gt; Etiqueta natural del Lenguaje: Es la etiqueta de apertura (opent_tags) del lenguaje, es la más recomendada de todas las formas que existen para indicar que utilizaremos código PHP. &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;lt;?&lt;/span&gt;&amp;nbsp; Etiqueta corta: Con esta etiqueta igual que la anterior indicamos a nuestro navegador que debe intrepertar el código como código &lt;b&gt;PHP, &lt;/b&gt;esta etiqueta esta desaconsejada debido a que hay muchos web-hosting que traen deshabilitado el short_open_tags lo cual puede traer problemas al momento de implementar nuestro archivo un poco mas de información sobre este tema &lt;a href=&quot;http://www.carlosbelisario.netai.net/php/usas-el-short_tag/&quot; target=&quot;_blank&quot;&gt;aca&lt;/a&gt;, además de que esta forma trae problemas con la apertura del documento &lt;b&gt;XML&lt;/b&gt; ejemplo &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF8&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;lt;?=&lt;/span&gt; &quot;string&quot; &lt;span style=&quot;color: red;&quot;&gt;?&amp;gt;&lt;/span&gt; Con esta etiqueta indicamos al navegador que imprima lo que se encuentra después del signo igual lo que nos mostraría en el navegador &quot;string&quot;, como es parte del short_open_tag esta desaconsejado totalmente.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: red;&quot;&gt;?&amp;gt;&lt;/span&gt; etiqueta de cierre de &lt;b&gt;PHP&lt;/b&gt;, si tal y como lo imaginas con esta etiqueta cerramos el código PHP que hallamos generado.&lt;/li&gt;
&lt;/ul&gt;Como podemos&amp;nbsp; ver existen varias maneras para que nuestro navegador interprete que el código es de &lt;b&gt;PHP, &lt;/b&gt;como se indico la manera más recomendable y la que utilizaremos sera &lt;span style=&quot;color: red;&quot;&gt;&amp;lt;?php&amp;nbsp; ?&amp;gt;&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Una vez establecido el como indicamos que estamos trabajando con &lt;b&gt;PHP&lt;/b&gt;, llega el momento mas esperado, el momento de poner manos a la obra.&lt;br /&gt;
&lt;br /&gt;
Lo primero que vamos a hacer es crear un sitio que hará referencia a nuestro código&amp;nbsp; &lt;b&gt;PHP &lt;/b&gt;que generemos, esto lo haremos creando una carpeta en la carpeta /VAR/WWW/ si estamos en linux y seguimos el tutorial&amp;nbsp; &lt;a href=&quot;http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-que-debemos-tener.html&quot; target=&quot;_blank&quot;&gt;anterior&lt;/a&gt; o en la carpeta HTDOCS si estamos en windows e instalamos el XAMPP para windows como se indico en el artículo &lt;a href=&quot;http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-que-debemos-tener.html&quot; target=&quot;_blank&quot;&gt;anterior&lt;/a&gt;. Entonces en la carpeta que sea su caso creemos una caperta llamada comenzando, dentro de esta carpeta van a ir todos los archivos HTML,PHP que vayamos generando, entonces dentro de nuestra carpeta &lt;b&gt;comenzando&lt;/b&gt; creemos un archivo llamado index.php, este archivo contendrá nuestro primer programa, este sera el clásico Hello World o Hola mundo, y&amp;nbsp; escribiremos el siguiente código&lt;br /&gt;
&lt;b&gt;index.php&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&lt;?php 
echo &quot;Hola Mundo!&quot;;
?&gt;
&lt;/pre&gt;Si en nuestro navegador colocamos&lt;br /&gt;
&lt;br /&gt;
http:/localhost/comenzando&lt;br /&gt;
&lt;br /&gt;
obtendremos en el la palabra &lt;b&gt;Hola Mundo!&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Nota&lt;/b&gt;: En este caso no se indico el archivo .php porque todo archivo index es considerado el archivo inicial a ejecutar, si hubieramos llamado al archivo &lt;b&gt;comenzando.php&lt;/b&gt; tendríamos que haber indicado la dirección al navegador de esta manera&lt;br /&gt;
&lt;br /&gt;
http:/localhost/comenzando/comenzando.php&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Fácil no??&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pero familiaricémonos con la sintaxis de &lt;b&gt;PHP&lt;/b&gt;, la primera línea como vemos tenemos la etiqueta de apertura &amp;lt;?php, en la segunda linea tenemos la funcion &lt;b&gt;echo&lt;/b&gt;, esta función lo que haces es enviar una salida al navegador, en este caso la palabra Hola Mundo, como es una cadena de carácteres o string esta cadena va entre comillas, bien sean simples &#39; &#39;, o dobles &quot; &quot; y el final de la línea tenemos el &lt;b&gt;;&lt;/b&gt;, que indica que finalizo la línea de instrucción de nuestro código de PHP, fácil verdad??&lt;br /&gt;
&lt;br /&gt;
Como vemos la sintaxis de PHP es bastante sencilla, pero claro no vamos a utilizar PHP  solo para hacer un programa con el Hola Mundo, más adelante iremos adentrándonos un poco más en este maravilloso lenguaje, un saludo y hasta la próxima entrada.</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/5215837080305126381/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-mi-primer-codigo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5215837080305126381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5215837080305126381'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-mi-primer-codigo.html' title='Comenzando con PHP - MI Primer Código'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-6120666559022155349</id><published>2011-06-05T15:08:00.001-04:30</published><updated>2011-06-05T15:25:52.108-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Comenzando con PHP - que debemos tener para empezar</title><content type='html'>En esta entrada vamos a hablar sobre lo que tenemos que tener para comenzar a trabajar con &lt;b&gt;PHP&lt;/b&gt;, de tal manera que no tengamos problemas al momento de comenzar a desarrollar nuestros proyctos.&lt;br /&gt;
&lt;br /&gt;
Lo primero que tenemos que tener es un servidor &lt;b&gt;Apache&lt;/b&gt;, &lt;b&gt;IIS&lt;/b&gt; entre algunos otros, siendo en mi opinión personal trabajando con el &lt;b&gt;PHP&lt;/b&gt; el más utilizado el &lt;b&gt;Apache&lt;/b&gt; y este el que vamos a indicar como instalar, en este artículo, además de este debemos instalar también el &lt;b&gt;PHP5&lt;/b&gt; con su la librería para apache2, también un servidor y un cliente de&amp;nbsp; base de datos en este caso trabajaremos con &lt;b&gt;MySQL&lt;/b&gt;, sin más preámbulo pongamos manos a la obra:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;En los sistemas linux lo hacemos de la siguiente manera:&lt;/b&gt;&lt;br /&gt;
Lo primero que debemos de hacer es colocarnos como usuario root para tener permisos para instalar en programas en nuestro equipo esto lo hacemos  con las siguientes lineas &lt;br /&gt;
&lt;pre&gt;sudo su
&lt;/pre&gt;este comando nos pedirá la contraseña de administrador&lt;br /&gt;
&lt;pre&gt;[sudo] password for tuusuario:
&lt;/pre&gt;una vez que estamos como root en nuestra terminal empezamos la descarga del software por medio del comando apt-get de la siguiente manera.&lt;br /&gt;
&lt;pre&gt;#con esta línea instalamos el servidor apache en nuestro equipo
apt-get install apache2
#con esta línea instalamos el el PHP a nuestro equipo
apt-get install php5
#Ahora instalamos el modulo de apache para PHP5
apt-get install libapache2-mod-php5
#instalamos el modulo de PHP para trabajar con MySQL
apt-get install php5-mysql
#Ahora instalamos el soporte para la librería GD de PHP
apt-get install php5-gd
#Instalamos la librería DOM de PHP
apt-get install php5-dom
&lt;/pre&gt;Ya teniendo instalado el Apache y el PHP, para probar debemos de colocar en nuestro navegador &lt;br /&gt;
&lt;a href=&quot;http://localhost&quot; target=&quot;_blank&quot;&gt;http://localhost&lt;/a&gt; y en este nos debe de salir la frase&lt;br /&gt;
&lt;quote&gt;&lt;br /&gt;
&lt;b&gt;It works!&lt;/b&gt;&lt;br /&gt;
&lt;/quote&gt;&lt;br /&gt;
Ya con esto podemos empezar a crear nuestros sitios con PHP, para esto debemos de crear las carpetas de nuestros sitios dentro de la carpeta /var/www y llamarla por el navegador, ejemplo&lt;br /&gt;
suponiendo que tenemos un este árbol de carpeta /var/www/misitio/, la dirección dentro del navegador sería &lt;br /&gt;
http://localhost/misitio&lt;br /&gt;
esto llamaría al archivo index creado dentro de la carpeta misitio en /var/www.&lt;br /&gt;
Ahora nos queda instalar el Servidor de Base de datos MySQL.&lt;br /&gt;
&lt;pre&gt;#procedemos a instalar el servidor mysql
apt-get install mysql-server
#aunque el MySQL trae un cliente para el terminal, instalaremos el PHPMYADMIN un cliente que se trabaja por el navegador
apt-get install phpmyadmin
&lt;/pre&gt;&lt;br /&gt;
Una vez instalado el PHPMYADMIN para que pueda ser llamado por el navegador debemos de colocar un enlace simbólico a este, de la siguiente manera &lt;br /&gt;
&lt;pre&gt;ln -s /usr/share/phpmyadmin /var/www/
&lt;/pre&gt;lo que hace este comando es crear un enlace simbolico desde /usr/share/phpmyadmin que es donde queda instalado el PHPMYADMIN a /var/www de tal manera que cree un sitio con el nombre PHPMYADMIN.&lt;br /&gt;
&lt;br /&gt;
Luego de estos pasos ya tenemos listo nuestro equipo para realizar aplicaciones con PHP y MySQL &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pero los usuarios de Windows que??&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para hacer la instalación del Apache, PHP y MySQL en windows es un poco mas sencillo ya que existen programas como xampp, wampserver, appserver que traen un paquete con cada uno de estos programas instalados, incluso trae por defecto el PHPMYADMIN, en lo personal me gusta mas trabajar con el XAMPP, por lo cual es el que indicare en este artículo:&lt;br /&gt;
Paso 1:&lt;br /&gt;
Descargar desde la web oficial: &lt;a href=&quot;http://www.apachefriends.org/en/xampp-windows.html&quot; target=&quot;_blank&quot;&gt;Apache Friends&lt;/a&gt;&lt;br /&gt;
Paso 2:&lt;br /&gt;
Instalar Xampp, este programa te pedirá una ruta a instalar, personalmente lo trabajo en la raíz por lo que crearía una carpeta de esta forma en C:\xampp.&lt;br /&gt;
Paso 3: Una vez instalados los paquetes este te mostrara un panel de control donde puedes iniciar o detener cada uno de los servidores instalados.&lt;br /&gt;
&lt;br /&gt;
Luego de tener instalado el xampp y funcionando correctamente solo nos queda crear nuestros sitios en la carpeta HTDOCS ubicada dentro de la carpeta c:\xampp\, quedando por ejemplo&lt;br /&gt;
c:\xampp\htdocs\misitio&lt;br /&gt;
&lt;br /&gt;
cuando queramos ver estos sencillamente debemos colocar en el navegador &lt;br /&gt;
&lt;a href=&quot;http://localhost/misitio&quot; target=&quot;_blank&quot;&gt;http://localhost/misitio&lt;/a&gt;&lt;br /&gt;
y esto nos direccionara a la página index creada en la carpeta misitio.&lt;br /&gt;
&lt;br /&gt;
Luego de esto solo nos queda instalar un IDE con soporte para PHP, personalmente trabajo con &lt;a href=&quot;http://www.eclipse.org/downloads/&quot; target=&quot;_blank&quot;&gt;eclipse&lt;/a&gt; y su plugin para PHP, pero tambien existe &lt;a href=&quot;http://www.aptana.com/products/studio3/download&quot;&gt;Aptana&lt;/a&gt;, &lt;a href=&quot;http://netbeans.org/features/php/&quot; target=&quot;_blank&quot;&gt;netbeans para PHP&lt;/a&gt;, entre algunos otros&lt;br /&gt;
Espero que halla podido explicar bien esto ya que lo más importante para comenzar a trabajar con una aplicación es tener correctamente instalado los programas que vamos a utilizar.</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/6120666559022155349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-que-debemos-tener.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/6120666559022155349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/6120666559022155349'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/06/comenzando-con-php-que-debemos-tener.html' title='Comenzando con PHP - que debemos tener para empezar'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-675537628663412397</id><published>2011-05-19T20:47:00.002-04:30</published><updated>2011-05-19T20:51:03.673-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>Conociendo las clases POO setter y getter</title><content type='html'>En el día de hoy vamos a hablar un poco de un tema que aunque básico es importante al momento de crear nuestras clases y estos son los &lt;b&gt;&quot;setter y los geter&quot;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Para dar una pequeña introducción al tema vamos a explicar que son cada uno de ellos, comenzando por el setter. Un &lt;b&gt;setter&lt;/b&gt; es un método de una clase que sirve para asignarle un valor a un atributo de una clase.&lt;br /&gt;
&lt;br /&gt;
Un poco de repaso de &lt;b&gt;POO&lt;/b&gt;, un atributo son las características de un objeto, estos por buena práctica deben de ser de acceso privado, de tal manera que solo puedan ser modificados por la misma clase de la que son características y no por otra.&lt;br /&gt;
&lt;br /&gt;
Continuando con lo que se refiere al metodo setter, cuando creamos este tipo de método estamos dando acceso a otros objetos o lugar de nuestra aplicación a indicar el valor de un atributo de nuestra clase, un ejemplo de este.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;class MiClase
{
    private $atrbibutoClase;
    private $otroAtributo;
    public function setAtributoClase($atrbibutoClase)
    {
        $this-&amp;gt;atrbibutoClase = $atrbibutoClase;
    }   
    public function setOtroAtributo($otroAtributo)
    {
        $this-&amp;gt;otroAtributo = $otroAtributo;
    }   
}
&lt;/pre&gt;&lt;br /&gt;
Como posemos ver son metodos que asignan valor a cada atributo de nuestra clase &lt;br /&gt;
MiClase, de tal manera que podamos trabajar con los datos de esta.&lt;br /&gt;
&lt;br /&gt;
Hasta aca esta sencillo nuestro trabajo con los setter, pero que con los tipos de datos que estos pueden recibir??&lt;br /&gt;
&lt;br /&gt;
En &lt;b&gt;Java &lt;/b&gt;por ejemplo este tipo de métodos se les indica el tipo de valor que reciben en el parámetro ya que java es exigente en cuanto a los tipos de datos que se le asignan a las variables y atributos, pero que con nuestro amado &lt;b&gt;PHP&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Hasta el día de hoy nunca había tomado en cuenta la validación de tipo de dato que se da a los setter ya que tengo una &lt;a href=&quot;http://desphpparatodos.blogspot.com/2011/03/clase-validacion-de-datos.html&quot; target=&quot;_blank&quot;&gt;clase&lt;/a&gt; con la que valido los datos al momento de estar trabajand, pero en el día de hoy foreando un poco en &lt;a href=&quot;http://www.forosdelweb.com/f68/validacion-valores-seteados-clase-913964/&quot; target=&quot;_blank&quot;&gt;este tema &lt;/a&gt;en específico entendí que se puede o mejor dicho debe hacer la validación en nuestros métodos setter. Entonces como quedarian nuestros setter con validaciones??&lt;br /&gt;
&lt;br /&gt;
Suponiendo que uno de los datos sea de tipo numerico quedaria de la siguiente manera.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&amp;lt;?php 
class MiClase
{
    private $atrbibutoClase;
    private $otroAtributo;
    public function setAtributoClase($atrbibutoClase)
    {
        if(is_numeric($atrbibutoClase)){
           $this-&amp;gt;atrbibutoClase = $atrbibutoClase;
        }
        else{
             throw new Exception(&quot;EL dato debe de ser numerico&quot;);
        }
    }       
}
$class = new MiClase();
$class-&amp;gt;setAtributoClase(&quot;hola&quot;);
?&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
como vemos hacemos una validacion y sino lanzamos una excepcion indicando que el tipo de dato no es el correcto para este atributo de nuestra clase.&lt;br /&gt;
&lt;br /&gt;
Como vemos aunque son métodos sencillos los setter en &lt;b&gt;PHP &lt;/b&gt;tienen que tener un poco de lógica para hacer la validación de tipo de datos del mismo.&lt;br /&gt;
&lt;br /&gt;
Ahora hablemos un poco de los getter, los &lt;b&gt;getter&lt;/b&gt; son los métodos que retornan o muestran el valor de un atributo de nuestra clase. Entonces como quedaria nuestro getter??&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;public function getAtrbibutoClase()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; return $this-&amp;gt;atrbibutoClase;
}
&lt;/pre&gt;De esta manera al momento de tener una instancia de nuestro objeto MiClase solo con llamar a este método obtendriamos el valor de el atributo especificado.&lt;br /&gt;
&lt;br /&gt;
Estos métodos de los que hablamos hoy son valiosamente útiles al momento de declarar nuestras clases ya que nos dan acceso a los atríbutos de la misma.&lt;br /&gt;
&lt;br /&gt;
Espero que esta entrada sea de su agrado y que halla explicado bien la misma, cualquier sugerencia o corrección me la hacen saber, saludos.</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/675537628663412397/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/05/conociendo-las-clases-poo-setter-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/675537628663412397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/675537628663412397'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/05/conociendo-las-clases-poo-setter-y.html' title='Conociendo las clases POO setter y getter'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-4290717398343582071</id><published>2011-04-01T23:02:00.000-04:30</published><updated>2011-04-01T23:02:36.331-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PARTONES DE DISEÑO"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>Entendiendo el MVC II</title><content type='html'>Siguiendo un poco el consejo del amigo &lt;b&gt;&lt;a href=&quot;http://www.blogger.com/profile/03966207618813004871&quot; rel=&quot;nofollow&quot;&gt;mr_robb&lt;/a&gt;&lt;/b&gt; me dispuse a llevar un poco lo que hicimos a &lt;b&gt;POO&lt;/b&gt; en &lt;b&gt;PHP&lt;/b&gt;, para ir mostrando como trabajar los modelos y controladores con esta forma de programar, naturalmente cambia todo lo que es nuestro código anterior ya que ahora trabajaremos clases para nuestros modelos y controladores, aunque en lo que es el trabajo deberian de llevar a lo mismo un pequeño login.&lt;br /&gt;
&lt;br /&gt;
Como lo que se quiere es mostrar como trabajar con los controladores y modelos y no hemos creado una clase base para estos ni para la vista incluiremos e instanciaremos los mismos en el momento que sea el caso pertinente, bueno acontinuación el nuevo código de nuestros modelos&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;usuario.php&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;/**
*
*Clase Modelo para gestionar los Usuarios
*/
/*Traemos la clase para trabajar las conexiones con la base de datos*/
require_once(&quot;db.php&quot;);
class Usuario 
{
 /**
 *
 *Definicion de atributos
 */
 private $_connection;
 /**
 *
 * Metodo Constructor para inicializar la conexion con la DB
 */
 public function __construct()
 {  
  $this-&gt;_connection = new db();
 }
 /**
 *
 *Metodo que gestiona el login de la aplicacion
 */
 public function login($user,$password)
 {
  $login = $this-&gt;_connection-&gt;selectAll(&#39;users&#39;,array(&#39;user&#39;=&gt;$user,&#39;password&#39;=&gt;$password));
  if(count($login &gt; 0)){
   if($login[0][&#39;estatus&#39;] === &#39;habilitado&#39;){
    return true;
   }
   else{
    return &quot;deshabilitado&quot;;
   }
  }
  else{
   return false;
  }
 }
 /**
 *
 * Metodo para agregar los usuarios 
 */
 public function agregarUsuario($datos = array())
 {
  if(!is_array($datos)){
   return false;
  }
  $insert = $this-&gt;_connection-&gt;insert(&#39;users&#39;,$datos);  
  if($insert){
   return true;
  }
  else{
   return &quot;fallo&quot;;
  }  
 } 
 /**
 *
 *Metodo para deshabilitar los usuarios
 */
 public function deshabilitarUsuario($user)
 {
  $update = $this-&gt;_connection-&gt;update(&#39;users&#39;,array(&#39;estatus&#39;=&gt;&#39;deshabilitado&#39;),array(&#39;user&#39;=&gt;$user));  
  if($insert){
   return true;
  }
  else{
   return &quot;fallo&quot;;
  }  
 }
}
&lt;/pre&gt;Como podemos observar es una clase donde hacemos toda la lógica que tiene que ver con la gestión de usuarios, dentro de la misma se instancia la clase DB para trabajar con la base de datos (la clase DB es la implementada en este &lt;a href=&quot;http://desphpparatodos.blogspot.com/2010/12/clase-para-conexion-utilizando-pdo-el.html&quot; target=&quot;__blank&quot;&gt;artículo&lt;/a&gt;). &lt;br /&gt;
 &lt;br /&gt;
&lt;b&gt;UsuariosController.php&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;session_start();
require_once(&quot;model/usuario.php&quot;);
class UsuariosController
{
 private $model = new Usuario(); 
 public function login($user,$pass)
 {
  if($_SERVER[&#39;REQUEST_METHOD&#39;] == &quot;POST&quot;){ 
   $login = $this-&gt;model-&gt;login($user,$pass);
   if($login){
    $_SESSION[&#39;login&#39;] = &quot;si&quot;;
    header(&quot;location: index.php&quot;);
    exit;
   }
   elseif($login === &quot;deshabilitado&quot;){
    unset($_SESSION[&#39;login&#39;]);
    $_SESSION[&#39;messaje&#39;] = &quot;Usuario Deshabilitado&quot;;
    header(&quot;location:index.php&quot;);
    exit;
   }
   else{
    unset($_SESSION[&#39;login&#39;]);
    $_SESSION[&#39;messaje&#39;] = &quot;Usuario o Contraseña incorrecto&quot;;
    header(&quot;location:index.php&quot;);
    exit;
  }
  else{
   header(&quot;location:login.php&quot;);
   exit;
  }
 } 
}
&lt;/pre&gt;&lt;br /&gt;
En el caso del controlador podemos visualizar que es una clase que instancia el modelo y llama a sus métodos de la lógica segun una acción, en este caso solo indicamos la del login para no extendernos tanto, lo importante es que se vea que el controlador no tiene ninguna lógica del negocio como plantean algunas personas, sino que en este se llama a la lógica del mismo según la acción indicada y según el caso este llamara a la vista correspondiente.&lt;br /&gt;
&lt;br /&gt;
También es importante destacar que por cada acción (método) del controlador que realicemos debemos de crear una vista (código html) de tal manera que este tenga a donde redirigir y mandar los mensajes al usuario si esto es pertinente.&lt;br /&gt;
&lt;br /&gt;
Como podemos ver el MVC es más útil cuando se trabaja de manera orientada a objetos, aunque esta es solo una aplicación sencilla de un login, podemos ver algo mas avanzado sobre este patrón en este artículo &lt;a href=&quot;http://web2development.blogspot.com/2007/05/patron-mvc.html&quot;&gt;MVC avanzado&lt;/a&gt; donde el autor nos muestra como crear las clases para gestionar controladores y vistas de una gran manera, espero que esta pequeña introducción a este patrón de diseño les sirva como base en lo referente a este patrón, saludos</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/4290717398343582071/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/04/entendiendo-el-mvc-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4290717398343582071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/4290717398343582071'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/04/entendiendo-el-mvc-ii.html' title='Entendiendo el MVC II'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-6724918143789714717</id><published>2011-03-28T23:18:00.000-04:30</published><updated>2011-03-28T23:18:38.080-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PARTONES DE DISEÑO"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>Entendiendo el MVC</title><content type='html'>En esta entrada vamos a hablar un poco del MVC, con la intención de hacerlo entendible a personas que se estén iniciando con este patrón de diseño lo llevaremos desde un punto de vista sencillo y entendible para cualquiera que tenga nociones de programación.&lt;br /&gt;
&lt;br /&gt;
Pondremos manos a la obra haciendo una pequeña definición de este patrón de diseño.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpiBG6m_lPG4_kK4OW7v8NtduuuxBC0cx2cN6mGI52uClz9YSq0NwfAfmf5cIQDwz7jMam-L6k8X6xQkTMX3Z-Kg2YnFMxrsmH8qcJ657jFpu9Lz9DrVPrSMqARdSMXA4GGupwzJxuOsQ/s1600/mvc.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpiBG6m_lPG4_kK4OW7v8NtduuuxBC0cx2cN6mGI52uClz9YSq0NwfAfmf5cIQDwz7jMam-L6k8X6xQkTMX3Z-Kg2YnFMxrsmH8qcJ657jFpu9Lz9DrVPrSMqARdSMXA4GGupwzJxuOsQ/s320/mvc.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;El Patrón MVC &lt;/b&gt;sus siglas en ingles significan &lt;b&gt;Model View Controller&lt;/b&gt; que significa &lt;b&gt;Modelo Vista Controlador&lt;/b&gt;, es una arquitectura de &lt;b&gt;Software &lt;/b&gt;que define la separación de los datos que conforman la vista de la lógica de una aplicación.&lt;br /&gt;
&lt;br /&gt;
Esto se hace con la finalidad de que cada una de las partes de una aplicación solo realice lo que está en su responsabilidad, además de que le da mayor entendimiento  a nuestros desarrollos y los hace más fácil de mantener, ya que la parte del diseño solo tiene la cantidad de código de programación que necesita al igual que en la parte que conforma nuestro código del negocio solo se va a encontrar lógica de programación en el lenguaje que estemos trabajando (PHP en nuestro caso) y no como algunos estamos acostumbrados muchos a hacer cosas como estas:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&lt;?php 
mysql_query(&quot;INSERT INTO tabla VALUES(&#39;&quot;.$_POST[&#39;campo&#39;].&quot;&#39;)&quot;);
?&gt;
&lt;h1&gt;Insertar un registro&lt;/h1&gt;&lt;form action=&quot;&quot; method=&quot;post&quot; name=&quot;formulario&quot;&gt;&lt;label&gt;Campo: &lt;/label&gt;&lt;input name=&quot;campo&quot; type=&quot;text&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;enviar&quot; /&gt;
&lt;/form&gt;&lt;/pre&gt;&lt;br /&gt;
Como vemos tenemos el código de nuestro negocio que es la inserción del registro y la vista en un mismo archivo cosa que no es de lo mas recomendable y es lo que este patrón desea evitar.&lt;br /&gt;
&lt;br /&gt;
Ya sabemos que es lo que no quiere el &lt;b&gt;MVC&lt;/b&gt; pero veamos en si lo que está detrás de sus siglas.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;V&lt;/b&gt; (View o Vista): Aunque la primera letra del patrón es la M decidí mejor hablar primero de la vista ya que es lo más sencillo de explicar al momento de trabajar con este patrón.&lt;br /&gt;
&lt;p&gt;La vista como su nombre lo indica es la parte visual, lo que el usuario final visualizara en su aplicación.&lt;/p&gt;&lt;p&gt;La vista podemos establecerla como la primera fase de este patrón ya que la vista es la que comunica al usuario lo que quiere ver, esta tiene acceso directo al modelo como podemos observar en la imagen que tenemos en la parte superior y es esta la que transmite los datos a la aplicación para hacer el proceso que necesitemos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;M&lt;/b&gt; (Model o Modelo):El modelo es lugar donde se encuentra la lógica del negocio de nuestro desarrollo, es ahí donde se procesan todos los datos provenientes de la vista.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;C&lt;/b&gt; (Controller o Controlador): Es el encargado de hacer la conexión entre la parte visual y la lógica del negocio de nuestro desarrollo (MODELO), este se encarga de pasar los datos de la vista hacia el modelo y según la respuesta que este le entregue selecciona la vista a cargar pasando los datos provenientes del modelo.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Bien hasta ahora hemos visto la teoría de este patrón pero como se construye una aplicación con él??&lt;br /&gt;
&lt;br /&gt;
Vamos a trabajar de la manera más básica posible, para ello vamos a trabajar un poco el PHP de manera estructurada aunque mayor provecho a este patrón se saca trabajando OOP; Planteemos un ejemplo que todo sistema debe de tener una gestión de usuarios, entonces normalmente cuando trabajábamos sin el patrón hacíamos algo como esto &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&lt;?php 
session_start();
require_once(&quot;conectar.php&quot;);
if(isset($_POST[&#39;usuario&#39;])){
 $query = mysql_query(&quot;SELECT * FROM usuarios WHERE user = &#39;&quot;.$_POST[&#39;usuario&#39;].&quot;&#39; AND password = &#39;&quot;.$_POST[&#39;usuario&#39;].&quot;&#39;&quot;);
 if(mysql_num_rows($query)){
  header(&quot;location:login.php?error=si&quot;);
  exit;
 }
 else{
  $_SESSION[&#39;autentificado&#39;] = &quot;si&quot;;
  $_SESSION[&#39;usuario&#39;] = $_POST[&#39;user&#39;];
  header(&quot;location:inicio.php&quot;);
  exit;
 }
}
?&gt;
&lt;!-- &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Documento sin título&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;--&gt;
&lt;form name=&quot;registro_usuario&quot; action=&quot;#&quot; method=&quot;post&quot;&gt;&lt;input type=&quot;text&quot; name=&quot;usuario&quot; /&gt;
&lt;input type=&quot;password&quot; name=&quot;password&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;ingrersar&quot; /&gt;
&lt;/form&gt;&lt;!-- &lt;/body&gt;
&lt;/html&gt;--&gt;
&lt;/pre&gt;Como podemos observar es un login básico que hace todo el proceso en la misma página, si llegara un usuario y se logueara correctamente lo haría, pero como vemos tenemos lo que yo llamo un arroz con mango en nuestro código, pasemos este pequeño login al patrón MVC.&lt;br /&gt;
&lt;br /&gt;
Comencemos con la vista&lt;br /&gt;
&lt;br /&gt;
login.php&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&lt;!--&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Documento sin título&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;--&gt;
&lt;form name=&quot;registro_usuario&quot; action=&quot;usuariosController.php?action=login&quot; method=&quot;post&quot;&gt;&lt;input type=&quot;text&quot; name=&quot;usuario&quot; /&gt;
&lt;input type=&quot;password&quot; name=&quot;password&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;ingrersar&quot; /&gt;
&lt;/form&gt;&lt;!-- &lt;/body&gt;
&lt;/html&gt;--&gt;
&lt;/pre&gt;Como podemos observar la vista de nuestro pequeño sistema de login es todo lo que corresponde al HTML dejando todo el proceso ya que este corresponde a la lógica de nuestro negocio la cual estará en el modelo.&lt;br /&gt;
&lt;br /&gt;
Ahora nuestro modelo.&lt;br /&gt;
usuario.php&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;
&lt;?php 
session_start();
require_once(&quot;conectar.php&quot;);
function login($user = NULL,$pass = NULL){
 if(empty($user) || empty($pass)){
    return &quot;debe ingresar un usuario&quot;;
 }
 $query = mysql_query(&quot;SELECT * FROM usuarios WHERE user = &#39;&quot;.$_POST[&#39;usuario&#39;].&quot;&#39; AND password = &#39;&quot;.$_POST[&#39;usuario&#39;].&quot;&#39;&quot;);
 if(mysql_num_rows($query)){
  $_SESSION[&#39;autentificado&#39;] = &quot;si&quot;;
  $_SESSION[&#39;usuario&#39;] = $_POST[&#39;user&#39;];
  $return = &quot;echo&quot;;
 }
 else{ 
             $return = &quot;no-existe&quot;;
 }
 return $return;
}
?&gt;
&lt;/pre&gt;Como vemos en nuestro modelo hicimos una función ya que el modelo del usuario debería tener toda la lógica que corresponde a la gestión de estos, como registrar, modificar y eliminar usuarios, para el ejemplo fuera lo más sencillo posible trabaje con el login ya que es algo que normalmente se hace en cualquier tipo de sistema.  &lt;br /&gt;
&lt;br /&gt;
Pero el controlador donde queda?? &lt;br /&gt;
&lt;br /&gt;
Como vemos ya tenemos la parte visual de nuestro login y tenemos la parte del negocio de nuestra aplicación pero para que el controlador y donde queda?? Como ya definimos el controlador comunica los datos de la vista al modelo entonces como debe de ser este?? Algo como esto&lt;br /&gt;
&lt;br /&gt;
usuariosController.php&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;&lt;?php
require_once(&quot;usuario.php&quot;);
if(isset($_GET[&#39;action&#39;])){
   $do=$_GET[&#39;action&#39;];#trae el que indica la url
}
else{
 $do=&quot;vista&quot;;#por defecto muestra la vista
}
if($do==&quot;vista&quot;){
   require_once(&quot;vista.php&quot;);
}
elseif($do==&quot;login&quot;){
   $retorno = login($_POST[&#39;usuario&#39;], $_POST[&#39;password&#39;]);   
   if($retorno == &quot;echo&quot;){
    header(&quot;location:inicio.php&quot;);
    exit;
   }
   elseif($retorno == &quot;no-existe&quot;){
    header(&quot;location:vista.php?error=no-existe&quot;);
    exit;
   }
   else{
    header(&quot;location:vista.php?error=vacio&quot;);
    exit;
   }
}?&gt;
&lt;/pre&gt;&lt;br /&gt;
Con este pequeño controlador podemos observar cual es la función de este, sencillamente pasar datos de la vista al modelo y según la respuesta cargar la vista que se necesite según los datos obtenidos del modelo, sencillo no??&lt;br /&gt;
&lt;br /&gt;
Espero que esta entrada ayude a los que están comenzando a conocer este patrón de diseño a entenderlo un poco mejor lo hice lo más sencillo posible según mi criterio :-), saludos hasta una próxima entrada.</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/6724918143789714717/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/03/entendiendo-el-mvc.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/6724918143789714717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/6724918143789714717'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/03/entendiendo-el-mvc.html' title='Entendiendo el MVC'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpiBG6m_lPG4_kK4OW7v8NtduuuxBC0cx2cN6mGI52uClz9YSq0NwfAfmf5cIQDwz7jMam-L6k8X6xQkTMX3Z-Kg2YnFMxrsmH8qcJ657jFpu9Lz9DrVPrSMqARdSMXA4GGupwzJxuOsQ/s72-c/mvc.png" height="72" width="72"/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-5125552659081308535</id><published>2011-03-25T22:32:00.001-04:30</published><updated>2011-03-26T16:49:16.009-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>Hablando de Clases y Objetos POO</title><content type='html'>En un artículo anterior habíamos tocado el tema de las clases y los objetos desde el punto de vista del &lt;b&gt;PHP&lt;/b&gt; aunque muy generalizado, en el día de hoy vamos a tocarlo un poco mas general de tal manera que podamos tener claro que son.&lt;br /&gt;
&lt;br /&gt;
Cuando hablamos de un &lt;b&gt;Objeto &lt;/b&gt;la teoría nos indica que es la instancia de una clase, en &lt;b&gt;PHP &lt;/b&gt;mayormente asignado a una variable de esta manera&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$objeto = new Clase();
var_dump($objeto)
&lt;/pre&gt;el resultado seria &lt;br /&gt;
&lt;pre&gt;object(Clase)#1 (1) { [&quot;var&quot;:&quot;Clase&quot;:private]=&amp;gt; NULL } 
&lt;/pre&gt;&lt;br /&gt;
Como vemos la variable $objeto se convirtió justamente en eso en un Objeto o una instancia de la clase Clase donde por medio de esta instancia podemos acceder a sus métodos y atributos públicos por cierto. &lt;br /&gt;
&lt;br /&gt;
Ok el concepto de objeto sencillo la instancia de una clase, pero entonces que es una clase, es ahí donde muchos autores nos complican la vida literalmente diciéndonos que es una abstracción de datos, donde el concepto de abstracción de datos es algo muy complicado por lo que muchos o huimos del concepto o sencillamente nos quedamos con dudas sobre este concepto.&lt;br /&gt;
&lt;br /&gt;
En lo personal tenía algunas dudas con lo que era el concepto de una clase y abstracciones de datos pero esta semana creo que se me aclaro mucho por lo que decidí hacer este post, entonces comencemos con los conceptos que tanto nos cuesta a algunos.&lt;br /&gt;
&lt;br /&gt;
Una clase: es simplemente una entidad compleja llevada a lo resumido pero como es esto?? Un ejemplo pudiera ser cuando necesitamos trabajar con animales, todos conocemos que existen muchas clasificaciones de los animales, ejemplo por lo que comen (herbívoros, carnívoros....) o por la forma que nacen (ovíparos, mamíferos...) pero todo esta complejidad la resumimos en una sola palabra es decir Animales. Que fácil no??, también podríamos decir que una clase es un tipo de datos creados por el desarrollador, pero como así?? Explico un poco mi experiencia y la de algunos profesores que he tenido, no sé si en algún momento alguien ha visto algo como esto&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;public function miMetodo(Animales $animal){
/*grupo de sentencias del metodo miMetodo*/
}
&lt;/pre&gt;Como podemos observar el parámetro del método miMetodo es de tipo Animales pero donde está definido este tipo de datos??? En una clase que creamos llamada Animales, entonces también podríamos definir a una clase como la declaración de un tipo de dato creada por el desarrollador, un ejemplo de esto es en &lt;b&gt;JAVA &lt;/b&gt;los desarrolladores de este lenguaje notaron que no había un buen soporte para el trabajo con las variables de tipo carácter, por esto crearon una clase llamada String que define este tipo de datos ejemplo&lt;br /&gt;
&lt;pre class=&quot;brush: java;&quot;&gt;String var;
&lt;/pre&gt;y así indicamos al lenguaje que trabajaremos la variable var como de tipo String una clase creada por &lt;b&gt;JAVA &lt;/b&gt;y podemos acceder a todos sus métodos y atributos de esta.&lt;br /&gt;
&lt;br /&gt;
Aunque la explicación de que es una clase fue algo larga creo que lleva lo complicado a lo simple tal cual como lo hace una clase, pero entonces en donde esta lo abstracto de las clases o mejor dicho que es una abstracción?? El concepto de abstracción va ligado al de la clase, como es esto?? Sencillamente lleva lo complejo a lo sencillo ya que se enfoca en el que hace y no en como lo hace con todo lo complejo que esto pueda ser.&lt;br /&gt;
&lt;br /&gt;
Bueno espero que esta entrada sea del agrado de todos, es sencillamente un artículo que intenta llevar lo complicado del concepto de una clase a ser entendido de manera fácil tal cual y como lo hace una clase.</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/5125552659081308535/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/03/hablando-de-clases-y-objetos-poo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5125552659081308535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5125552659081308535'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/03/hablando-de-clases-y-objetos-poo.html' title='Hablando de Clases y Objetos POO'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3643110465101310094.post-5389749057280028325</id><published>2011-03-14T22:05:00.003-04:30</published><updated>2011-03-16T21:58:42.189-04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><title type='text'>clase validación de datos</title><content type='html'>Buenas un poco abandonado el blog el día de hoy compartire una clase que realice para hacer validaciones, esta clase surge de &lt;a href=&quot;http://www.forosdelweb.com/f68/duda-concepto-mvc-893946/&quot;&gt; un tema que planteaba en forosdelweb &lt;/a&gt;por una duda correspondiente al &lt;b&gt;patrón MVC&lt;/b&gt;, según tenía entendido por un poco de experiencia con el framework &lt;b&gt;cakePHP,&lt;/b&gt; la lógica de nuestros sistemas se encuentra en el controlador según entendia yo :-), resulta que esto era un error de concepto que tenia y los amigos del foro me ayudaron a entender y ver este error, luego de entender este concepto me genero otra duda donde realizar las validaciones?? en el controlador?? en el modelo?? según mi criterio si en el &lt;b&gt;patrón MVC&lt;/b&gt; toda la lógica y el trabajo con los datos se hace con el modelo entonces las validaciones de los datos deve de ser en el modelo, entonces me dispuse a crear una clase para hacer las validaciones es una primera versión que hace la validación de manera correcta lo unico que se debe es llamar al método de la clase e indicar los parámetros para realizar la validacion&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;/**
/**
* Clase para realizar validaciones en el modelo
* Es utilizada para realizar validaciones en el modelo de nuestras clases.
*
* @author Carlos Belisario
*/
class Validacion
{
 protected $_atributos;
 protected $_error;
 public $mensaje;
 
 /**
 * Metodo para indicar la regla de validacion
 * El método retorna un valor verdadero si la validación es correcta, de lo contrario retorna el objeto 
 * actual, permitiendo acceder al atributo Validacion::$mensaje ya que es publico
 */
 public function rules($rule = array(),$data)
 {
  
  if(!is_array($rule)){
   $this-&gt;mensaje = &quot;las reglas deben de estar en formato de arreglo&quot;;
   return $this;
  }  
  foreach($rule as $key =&gt; $rules){
   $reglas = explode(&#39;,&#39;,$rules[&#39;regla&#39;]);
   if(array_key_exists($rules[&#39;name&#39;],$data)){
    foreach($data as $indice =&gt; $valor){     
     if($indice === $rules[&#39;name&#39;]){
      foreach($reglas as $clave =&gt; $valores){ 
       $validator = $this-&gt;_getInflectedName($valores);        
       if(!is_callable(array($this, $validator))){
          throw new BadMethodCallException(&quot;No se encontro el metodo actual&quot;);
       }
       $respuesta = $this-&gt;$validator($rules[&#39;name&#39;], $valor);        
      }
      break;
     }
    }
   }
   else{
    $this-&gt;mensaje[$rules[&#39;name&#39;]] = &quot;el campo $value no esta dentro de la regla de validación o en el formulario&quot;;    
   }
  }  
  if(!$respuesta){
   return $this;
  }
  else{
   return true;
  }
 } 
 
 /**
 * Metodo inflector de la clase 
 * por medio de este metodo llamamos a las reglas de validacion que se generen
 */
 private function _getInflectedName($text)
 {
  $_validator = preg_replace(&#39;/[^A-Za-z0-9]+/&#39;,&#39; &#39;,$text);
  $arrayValidator = explode(&#39; &#39;,$_validator);    
  if(count($arrayValidator) &gt; 1){
   foreach($arrayValidator as $key =&gt; $value){     
    if($key == 0){
     $validator .= &quot;_&quot;.$value; 
    }
    else{     
     $validator .= ucwords($value);
    }
   }
  }
  else{
   $validator = &quot;_&quot;.$_validator;
  }    
  return $validator;
 }
  
 /**
 * Metodo de verificacion de que el dato no este vacio o NULL
 * El metodo retorna un valor verdadero si la validacion es correcta de lo contrario retorna un valor falso
 * y llena el atributo validacion::$mensaje con un arreglo indicando el campo que mostrara el mensaje y el 
 * mensaje que visualizara el usuario
 */
 protected function _noEmpty($campo,$valor)
 {   
  if(isset($valor) &amp;&amp; !empty($valor)){   
   return true;   
  }
  else{   
   $this-&gt;mensaje[$campo][] = &quot;el campo $campo debe de estar lleno&quot;;
   return false;
  }
 }
 /**
 * Metodo de verificacion de tipo numerico
 * El metodo retorna un valor verdadero si la validacion es correcta de lo contrario retorna un valor falso
 * y llena el atributo validacion::$mensaje con un arreglo indicando el campo que mostrara el mensaje y el 
 * mensaje que visualizara el usuario
 */
 protected function _numeric($campo,$valor)
 {   
  if(is_numeric($valor)){
   return true;
  }  
  else{
   $this-&gt;mensaje[$campo][] = &quot;el campo $campo debe de ser numerico&quot;;
   return false;
  }
 }
 
 /**
 * Metodo de verificacion de tipo email
 * El metodo retorna un valor verdadero si la validacion es correcta de lo contrario retorna un valor falso
 * y llena el atributo validacion::$mensaje con un arreglo indicando el campo que mostrara el mensaje y el 
 * mensaje que visualizara el usuario
 */
 protected function _email($campo,$valor)
 {
  if(preg_match(&quot;/^[a-z]+([\.]?[a-z0-9_-]+)*@[a-z]+([\.-]+[a-z0-9]+)*\.[a-z]{2,}$/&quot;,$valor)){     
   return true;
  } 
  else{
   $this-&gt;mensaje[$campo][] = &quot;el campo $campo de estar en el formato de email usuario@servidor.com&quot;;
   return false;
  }
 }
}
&lt;/pre&gt;el uso de la clase es muy sencillo aca dejo las pruebas que realice a la clase &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;$_POST[&#39;campo1&#39;] = 1;
$_POST[&#39;campo2&#39;] = &quot;usuario@hotmail.com&quot;;
$datos = $_POST;
$validacion =  new Validacion();
$regla = array(
   array(&#39;name&#39;=&gt;&#39;campo1&#39;,&#39;regla&#39;=&gt;&#39;no-empty,numeric&#39;),
   array(&#39;name&#39;=&gt;&#39;campo2&#39;,&#39;regla&#39;=&gt;&#39;no-empty,email&#39;)
  );
$validaciones = $validacion-&gt;rules($regla,$datos);
print_r($validaciones);
&lt;/pre&gt;&lt;br /&gt;
por ahora solo tengo tres reglas de validación son muy básicas y sencillas, espero que sea de su agrado si tienen alguna corrección o critica que hacer a la clase no hay ningun problema, saludos</content><link rel='replies' type='application/atom+xml' href='http://desphpparatodos.blogspot.com/feeds/5389749057280028325/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desphpparatodos.blogspot.com/2011/03/clase-validacion-de-datos.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5389749057280028325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3643110465101310094/posts/default/5389749057280028325'/><link rel='alternate' type='text/html' href='http://desphpparatodos.blogspot.com/2011/03/clase-validacion-de-datos.html' title='clase validación de datos'/><author><name>Carlos Belisario</name><uri>http://www.blogger.com/profile/16127611272882266024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPxUjxMa5YOS3oiydN2s68Axsx93jjY9IBkLgfmS28DaNl8r2kmMqCFx4I-kYUZgmneQldQw8ljbOx9QOIIxCsz05LvuLtn5fAEKPRwBM6xvuDuykhiAX7UwcTXrTZ5hhKRCR49wOeKQSNuQRfPnUElfOKjGvEVvCNIZNHUDtD2E1o/s220/perfil.png'/></author><thr:total>9</thr:total></entry></feed>