<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>Pensando en Red &#187; php</title> <atom:link href="http://pensandoenred.com/category/php/feed/" rel="self" type="application/rss+xml" /><link>http://pensandoenred.com</link> <description>nada es tan fácil como parece serlo</description> <lastBuildDate>Mon, 02 Jan 2012 08:35:01 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Drupal personalizando un detalle con el resultado de una vista</title><link>http://pensandoenred.com/2010/11/16/drupal-personalizando-un-detalle-con-el-resultado-de-una-vista/</link> <comments>http://pensandoenred.com/2010/11/16/drupal-personalizando-un-detalle-con-el-resultado-de-una-vista/#comments</comments> <pubDate>Tue, 16 Nov 2010 08:07:26 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Drupal]]></category> <category><![CDATA[php]]></category> <category><![CDATA[theme]]></category> <category><![CDATA[views]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=665</guid> <description><![CDATA[Drupal tiene el módulo context, muy util al poder definir reglas para mostrar bloques por contexto. El bloque puede ser el resultado de una view. Las views pueden recibir parámetros, pero cuando es un bloque hay que hacer "ñapa" para recibir el parámetro de la url, por lo que si deseamos mostrar en el detalle [...]]]></description> <content:encoded><![CDATA[<p>Drupal tiene el módulo <a
href="http://drupal.org/project/context" target="_blank">context</a>, muy util al poder definir reglas para mostrar bloques por contexto. El bloque puede ser el resultado de una view. Las views pueden recibir parámetros, pero cuando es un bloque hay que hacer "ñapa" para recibir el parámetro de la url, por lo que si deseamos mostrar en el detalle del contenido un listado de otros contenidos según la regla de negocio tenemos dos opciones.</p><p>Crear una view de tipo bloque y después por context definir la regla para pintar la view o crear una variable en el preprocess del nodo con el resultado de una vista.</p><p>La ventaja de hacerlo con context, es que no tiras una línea de código pero el problema es que el bloque lo tienes que ubicar en una de las regiones definidas en el theme. Por otro lado si la vista necesita parámetros, como el $node-&gt;nid es algo más complejo.</p><p>Pongamos como ejemplo "noticia" (que original), donde va a mostrar el listado de las 5 noticias más recientes que tengan los mismos tag's que la noticia que estamos visualizando.</p><p>1.- Creamos la vista que recibe como parámetro el $node-&gt;nid para obtener los tags y luego consulta al resto de noticias para obtener el resultado de las 5 noticias a mostrar.</p><p>2.- Preprocess de nodo noticia:</p><pre class="brush: php; ">
function _THEMENAME_preprocess_node__noticia(&amp;$vars){
$nid = $vars[&#039;node&#039;]-&gt;nid;
$view_name = &#039;noticias&#039;;
$display = &#039;noticias_relacionadas_por_tags&#039;;
$args = array($nid);
$view = views_get_view($view_name);
$view-&gt;set_arguments($args);
$view-&gt;build($display);
$view-&gt;execute($display);
$block = $view-&gt;render();
$vars[&#039;noticias_relacionadas&#039;] = $block ;
}
</pre><p>Ahora en la plantilla de nodo noticia, tenemos una variable <strong>$noticias_relacionadas</strong> con el resultado de la vista. Esto nos da más control de personalización del detalle, ya que con context estamos "limitados" a las regiones del theme, pero de esta manera la personalización del html en el detalle de la noticia está más controlado.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2010/11/16/drupal-personalizando-un-detalle-con-el-resultado-de-una-vista/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Drupal crear variables en nodos para personalizar el detalle de un contenido</title><link>http://pensandoenred.com/2010/11/16/drupal-crear-variables-en-nodos-para-personalizar-el-detalle-de-un-contenido/</link> <comments>http://pensandoenred.com/2010/11/16/drupal-crear-variables-en-nodos-para-personalizar-el-detalle-de-un-contenido/#comments</comments> <pubDate>Tue, 16 Nov 2010 07:34:06 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Drupal]]></category> <category><![CDATA[php]]></category> <category><![CDATA[nodo]]></category> <category><![CDATA[theme]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=650</guid> <description><![CDATA[Cuando trabajamos en la personalización del detalle de contenido, nos puede surgir la necesidad según requisitos de crear alguna lógica para mostrar los atributos de este contenido. Es muy fácil caer en aplicar esa lógica y creación de variables en la propia plantilla php (phptemplates), pero en la medida de los posible lo correcto sería [...]]]></description> <content:encoded><![CDATA[<p>Cuando trabajamos en la personalización del detalle de contenido, nos puede surgir la necesidad según requisitos de crear alguna lógica para mostrar los atributos de este contenido. Es muy fácil caer en aplicar esa lógica y creación de variables en la propia plantilla php (phptemplates), pero en la medida de los posible lo correcto sería evitar "codificar" en la plantilla.</p><p>Pongamos el ejemplo de que estamos mostrando el detalle de un contenido noticia, en donde tiene dos atributos a los que hay que darle importancia:<br
/> - Imagen<br
/> - Vídeo</p><p><em>Requisitos:<br
/> Si la noticia tiene vídeo, mostrar el vídeo y en caso contrario pintar la imagen.</em></p><p>Sería muy sencillo aplicar la lógica en el phptemplate:</p><pre class="brush: php; ">
if($field_noticia_video_rendered){
print $field_noticia_video_rendered;
}else{
print $field_noticia_imagen_rendered;
}
</pre><p>Como ya sabéis, si el tipo de contenido tiene un definido el campo con nombre <strong>field_noticia_imagen</strong> y el widget del atributo es de tipo imagen, al pintar <strong>$field_noticia_imagen_rendered</strong> te pinta el html necesario para renderizar la imagen, lo mismo ocurre con el vídeo.</p><p>Bien, hasta aquí hemos cumplido la funcionalidad. Pero... ¿es la manera correcta? tal vez no debería mojarme en decir "correcta" ya que ambas  funcionan, pero queda mucho más ordenado si en vez de pintar ese churro lineas en la plantilla simplemente pintamos:</p><pre class="brush: php; ">
print $field_noticia_multimedia_rendered;
</pre><p>Ahora bien, el tipo de contenido noticia no tiene el atributo multimedia y antes de que interprete la plantilla tenemos que crear la variable.</p><p>Es muy improbable que estés haciendo un tema de Drupal de cero, así que en este paso vamos a abrir<strong> template.php.</strong></p><p>Normalmente en este fichero si partes de un tema base, ya tendrás la función:</p><pre class="brush: php; ">
THEMENAME_preprocess_node(&amp;$vars, $hook){
...
$function = &#039;_THEMENAME_preprocess_node&#039;.&#039;__&#039;. $vars[&#039;node&#039;]-&gt;type;
if (function_exists($function)) {
$function(&amp;$vars);
}
}
</pre><p>Antes de procesar un nodo se ejecuta esta función, en donde comprobamos si tenemos declarada una función especifica para preprocesar un nodo de un tipo de contenido determinado, como en este caso el type es "noticia" tendremos la función <em>"_THEMENAME_preprocess_node__noticia"</em>. Al declarar la función con un guión bajo al inicio del nombre, es una manera de indicar que es una función de ámbito privado y que no es un <a
href="http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/6" target="_blank">hook</a> que lo entienda el core.</p><pre class="brush: php; ">
_THEMENAME_preprocess_node__noticia($vars){
...
}
</pre><p>El parámetro que recibe es un array asociativo que contiene toda la información que necesitamos. Si creamos una nueva key en este array asociativo, lo que vamos a conseguir es que en la plantilla de nodo exista una variable con el nombre de la key que hemos creado en el array.</p><pre class="brush: php; ">
_THEMENAME_preprocess_node__noticia($vars){
if($vars[&#039;field_noticia_video][0][&#039;value&#039;]){
$vars[&#039;field_noticia_multimedia_rendered&#039;] = $vars[&#039;field_noticia_video&#039;][0][&#039;view&#039;];
}else{
$vars[&#039;field_noticia_multimedia_rendered&#039;] = $vars[&#039;field_noticia_imagen&#039;][0][&#039;view&#039;];
}
}
</pre><p>Una vez creado el preprocess para el tipo de contenido noticia, en la plantilla del nodo noticia tenemos que pintar la variable<strong> $field_noticia_multimedia_rendered</strong>.</p><pre class="brush: php; ">
print $field_noticia_multimedia_rendered;
</pre><p>Nos olvidamos de la lógica en la plantilla, para cuando pase diseño a modificarla no se encuentre con esos churros que a veces metemos <img
src='http://pensandoenred.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p>La idea de llamar a la nueva variable <strong>$field_noticia_multimedia_rendered</strong> es por seguir un poco la nomenclatura de las variables que utiliza <strong>Drupal</strong>, pero puede ser sólo <strong>$multimedia</strong> ya que a <strong>otra persona que vaya a ver la plantilla le puede llevar a confusión entendiendo que es un atributo del contenido</strong>. Esto queda a elección de cada uno.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2010/11/16/drupal-crear-variables-en-nodos-para-personalizar-el-detalle-de-un-contenido/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Drupal el incomprendido y desconocido CMS</title><link>http://pensandoenred.com/2010/08/12/drupal-el-incomprendido-y-desconocido-cms/</link> <comments>http://pensandoenred.com/2010/08/12/drupal-el-incomprendido-y-desconocido-cms/#comments</comments> <pubDate>Thu, 12 Aug 2010 16:50:37 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Drupal]]></category> <category><![CDATA[php]]></category> <category><![CDATA[Software Libre]]></category> <category><![CDATA[cms]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=607</guid> <description><![CDATA[Hace ya bastante tiempo, desde que me muevo en la tecnología LAMP, que conozco Drupal. Nunca le dediqué el tiempo necesario para ser conocedor de esa potencia interna que cuando miramos las tripas nos hace dudar que tenga. Drupal es un CMS agnóstico en contenido y que gracias a su extensa comunidad hay una cantidad [...]]]></description> <content:encoded><![CDATA[<p><img
class="aligncenter size-medium wp-image-608" style="float: left; padding: 10px;" title="DrupalMan" src="http://www.pensandoenred.com/wp-content/uploads/2010/08/DrupalMan-199x300.jpg" alt="" width="199" height="300" />Hace ya bastante tiempo, desde que me muevo en la tecnología LAMP, que conozco Drupal. Nunca le dediqué el tiempo necesario para ser conocedor de esa potencia interna que cuando miramos las tripas nos hace dudar que tenga. Drupal es un CMS agnóstico en contenido y que gracias a su extensa comunidad hay una cantidad de módulos y documentación (a veces demasiada) sobre como hacer proyectos en Drupal.</p><p>Tal vez, el problema de no haber invertido más tiempo en Drupal es por su sencillez tras la instalación y no conocer lo que realmente podía ofrecer. Una de las razones también muy importantes por las que no me decidía a investigarlo era la parte técnica, donde escasea la POO y hace algo muy raro <img
src='http://pensandoenred.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p>Recientemente en el entorno laboral nos ha surgido la oportunidad de invertir tiempo en conocerlo, realmente me ha sorprendido. La primera sensación en la toma de contacto con el CMS es que se puede desarrollar sites dinámicos sin tirar una línea de código. Esta sensación duró hasta que nos enfrentamos a un proyecto real, en donde funcionalmente podíamos atacar muchos requisitos del proyecto pero a la hora de entrar en las tripas para personalizarlo nos dimos cuenta que hay algo más allá. El código es prácticamente funciones, y el core (no se como lo hace) simula la sobrecarga de métodos pero con  funciones en donde parece ser que sólo puede existir una sobre-escritura.</p><p>La verdad es que ahora mismo tengo un poco de fascinación por Drupal, y cuando hace unos 3 años un amigo me intentaba vender la "moto" de Drupal yo siempre le ignoraba <img
src='http://pensandoenred.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> lo siento Diego! ha tenido que ser tres años más tarde.</p><p>Supongo que a partir de ahora, retomaré el blog con algún que otro artículo de Drupal.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2010/08/12/drupal-el-incomprendido-y-desconocido-cms/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Cambiar el path de la carpeta Web de Symfony</title><link>http://pensandoenred.com/2010/04/25/cambiar-el-path-de-la-carpeta-web-de-symfony/</link> <comments>http://pensandoenred.com/2010/04/25/cambiar-el-path-de-la-carpeta-web-de-symfony/#comments</comments> <pubDate>Sun, 25 Apr 2010 13:07:01 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Configuraciones]]></category> <category><![CDATA[php]]></category> <category><![CDATA[Symfony]]></category> <category><![CDATA[Web]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=597</guid> <description><![CDATA[A veces el servidor donde vamos a hospedar el proyecto nos puede condicionar los paths del proyecto. En un hosting compartido normalmente no puedes indicar cual es el path del document_root si no que ya te ofrecen por defecto una estructura de directorios y tienes que adaptar tu desarrollo a ello. Bien, con symfony es [...]]]></description> <content:encoded><![CDATA[<p>A veces el servidor donde vamos a hospedar el proyecto nos puede condicionar los paths del proyecto. En un hosting compartido normalmente no puedes indicar cual es el path del document_root si no que ya te ofrecen por defecto una estructura de directorios y tienes que adaptar tu desarrollo a ello.</p><p>Bien, con symfony es muy sencillo cambiar el path del web dir.</p><p>Tenemos que editar el fichero ProyectConfiguration.class.php y cambiaremos el web dir:</p><blockquote><p>$this-&gt;setWebDir($this-&gt;getRootDir().'/public_html');</p></blockquote><p>Teniendo en cuenta que el proyecto se encuentra en /home/projects el document_root en symfony sería /home/projects/web, pero al agregar esa línea en el fichero de configuración nos intentaría localizar en /home/projects/public_html.</p><p>Por otro lado si queremos meter toda la estructura de symfony en una carpeta, al estilo de:</p><blockquote><p>public_html //El document root<br
/> source //Toda la estructura del proyecto symfony</p></blockquote><p>Tendríamos que configurar el path de public_html así:</p><blockquote><p>$this-&gt;setWebDir($this-&gt;getRootDir().'/../public_html');</p></blockquote><p>Ya que el $this-&gt;getRootDir() ya te ubica donde tienes el código.</p><p>Aquí dejo una chuletilla <img
src='http://pensandoenred.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> para cuando me vuelva a hacer falta, si os es de utilidad pues mejor.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2010/04/25/cambiar-el-path-de-la-carpeta-web-de-symfony/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Métodos mágicos en PHP5</title><link>http://pensandoenred.com/2009/12/20/metodos-magicos-en-php5/</link> <comments>http://pensandoenred.com/2009/12/20/metodos-magicos-en-php5/#comments</comments> <pubDate>Sun, 20 Dec 2009 11:50:06 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[php]]></category> <category><![CDATA[magicos]]></category> <category><![CDATA[metodos]]></category> <category><![CDATA[oop]]></category> <category><![CDATA[php5]]></category> <category><![CDATA[poo]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=479</guid> <description><![CDATA[Desarrollar en PHP5 con orientación a objetos cada vez es más parecido a desarrollar con Java, los "javeros" siempre comentan que PHP no hace más que "copiar" y la verdad es que razón no les falta ^_^ pero una de las particularidades que tiene el desarrollar con POO en PHP5 son los métodos mágicos. Los [...]]]></description> <content:encoded><![CDATA[<p>Desarrollar en PHP5 con orientación a objetos cada vez es más parecido a desarrollar con Java, los "javeros" siempre comentan que PHP no hace más que "copiar" y la verdad es que razón no les falta ^_^ pero una de las particularidades que tiene el desarrollar con POO en PHP5 son los <a
href="http://php.net/manual/en/language.oop5.magic.php" target="_blank">métodos mágicos</a>. Los usan cada vez con más frecuencia los frameworks de desarrollo en PHP5 y es por la flexibilidad que ofrecen en los desarrollos.</p><p>Quien no ha utilizado en algún momento en PHP5 el <em>new stdClass()</em>, al hacer una instancia de esta clase predefinida en el core de PHP5 estamos creando una clase estándar en donde las propiedades se generan de manera dinámica.</p><p>En el ejemplo del que mostraré a continuación se trata de una clase estándar donde encapsularemos el acceso a las propiedades de la clase. Utilizaremos el la encapsulación y el principio de la ocultación en la <a
href="http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos" target="_blank">Programación Orientada a Objetos</a> para el desarrollo de esta clase con <a
href="http://es.php.net/manual/en/language.oop5.magic.php" target="_blank">métodos mágicos</a>. No exponiendo el acceso a las propiedades en ámbito público.</p><p>La clase que vamos a crear no entiende de las posibles propiedades que puede tener el objeto, ni tampoco de los valores que almacenará y menos de acciones sobre propiedades. Simplemente almacenará N valores en diferentes propiedades de manera dinámica, simulando el comportamiento de "stdClass".</p><pre class="brush: php; ">
/**
* Clase estándar con propiedades de ámbito privado, en donde
* para acceder a las propiedades es necesario invocar métodos
* set/get bien para inicializar la propiedad o recuperar.
*
* @author mariotux
* @date 20/12/2009
*/
class MyStdClass {
private $properties;
private function __get($name) {
$name = strtolower($name);
if (array_key_exists ( $name, $this-&gt;properties)) {
return $this-&gt;properties [$name];
}else{
throw new Exception(&#039;Unknown property  &#039;. $name);
}
}
private function __set($name, $value) {
$name = strtolower($name);
if(count($value) == 1){
$this-&gt;properties [$name] = $value[0];
}else{
$this-&gt;properties [$name] = $value;
}
}
public function __call($name, $arguments) {
$methodType = substr($name, 0, 3);
$nameMethod = substr($name,3);
switch ($methodType){
case &#039;get&#039;:{
return $this-&gt;$nameMethod;
break;
}
case &#039;set&#039;:{
$this-&gt;$nameMethod = $arguments;
break;
}
default:{
throw new Exception(&#039;Unknown method  &#039;. $name);
}
}
}
public function __construct() {
$this-&gt;properties = array ();
}
}
</pre><p>Cómo podemos observar en la clase, en cuanto se intenta invocar a un método que no sea get o set generamos una excepción, al igual que también lo hacemos cuando se intenta acceder a una propiedad que no ha sido inicializada al invocar el método get de la propiedad. En el set no realizamos la comprobación ,ya que al estar asignando un valor a una propiedad siempre la trataremos como una propiedad nueva en caso de que no exista.</p><p>Este es un ejemplo de como utilizar métodos mágicos, en donde sólo estamos utilizando <em>__construct, __call, __set, __get</em> pero existen más <a
href="http://php.net/manual/en/language.oop5.magic.php" target="_blank">métodos mágicos</a> que podríamos utilizar para extender el comportamiento de la clase.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2009/12/20/metodos-magicos-en-php5/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>¿Por qué usar Symfony?</title><link>http://pensandoenred.com/2009/12/07/%c2%bfpor-que-usar-symfony/</link> <comments>http://pensandoenred.com/2009/12/07/%c2%bfpor-que-usar-symfony/#comments</comments> <pubDate>Mon, 07 Dec 2009 09:15:57 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Framework]]></category> <category><![CDATA[php]]></category> <category><![CDATA[Doctrine]]></category> <category><![CDATA[Symfony]]></category> <category><![CDATA[Zend]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=473</guid> <description><![CDATA[Empezaremos por 10 razones por las que una empresa debería utilziar Symfony Framework en sus desarrollos de PHP, citando: Escalable: Symfony es infinitamente escalable si se disponen de los recursos necesarios. Yahoo utiliza Symfony para programar aplicaciones con 20 millones de usuarios y 12 idiomas ¿de verdad necesitas más? Probado: Symfony ha sido probado con [...]]]></description> <content:encoded><![CDATA[<p>Empezaremos por<a
href="http://www.symfony.es/2008/04/28/10-razones-por-las-que-tu-empresa-deberia-utilizar-symfony/" target="_blank"> 10 razones por las que una empresa debería utilziar Symfony</a> Framework en sus desarrollos de PHP, citando:</p><div><ol><blockquote><li><strong>Escalable</strong>: Symfony es <em>infinitamente</em> escalable si se disponen de los recursos necesarios. <a
href="http://www.symfony.es/2007/05/26/yahoo-elige-symfony-para-delicious-yahoo-answers-y-yahoo-bookmarks/">Yahoo utiliza Symfony</a> para programar aplicaciones con 20 millones de usuarios y 12 idiomas ¿de verdad necesitas más?</li><li><strong>Probado</strong>: Symfony ha sido probado con éxito durante varios años en aplicaciones muy diferentes. Desde sitios web con millones de usuarios (del.icio.us, Yahoo Bookmarks, Yahoo Answers) hasta otros <a
href="http://trac.symfony-project.com/wiki/ApplicationsDevelopedWithSymfony">miles de sitios</a> pequeños y medianos.</li><li><strong>Soporte</strong>: Symfony sigue una política de tipo LTS (<em>long term support</em>). Las versiones estables se mantienen durante 3 años sin cambios pero con una continua corrección de los errores conocidos. Tus clientes estarán siempre contentos y a ti no te costará nada hacerlo.</li><li><strong>Licencia</strong>: Symfony utiliza una <a
href="http://es.wikipedia.org/wiki/Licencia_MIT">licencia MIT</a>, con la que puedes hacer aplicaciones web comerciales, gratuitas y/o de software libre.</li><li><strong>Compromiso</strong>: la empresa que ha creado Symfony no vive del framework, sino de las aplicaciones que hace con él. Esto significa que a ellos les interesa tanto como a tí aspectos como el rendimiento, la buena documentación, el soporte muy largo, etc.</li><li><strong>Código</strong>: Desde su primera versión Symfony ha sido creado para PHP 5, desechando la versión PHP 4 (que ha sido declarada obsoleta recientemente). Echa un vistazo a su código fuente y verás lo bien que se puede llegar a programar con PHP.</li><li><strong>Seguro</strong>: Se puede controlar hasta el último acceso a la información e incluye por defecto protección contra ataques XSS y CSRF.</li><li><strong>Documentado</strong>: se trata del framework PHP mejor documentado: miles de páginas en el <a
href="http://trac.symfony-project.com/wiki">wiki oficial</a>, <a
href="http://www.symfony-project.org/askeet/1_0/">tutoriales</a> de hasta 250 páginas y un <a
href="http://www.symfony-project.org/book/1_0/">libro gratuito</a> de casi 500 páginas. Además, el libro está completamente <a
href="http://www.librosweb.es/symfony/index.html">traducido al español</a>.</li><li><strong>Calidad</strong>: su código fuente incluye más de 8.000 pruebas unitarias y funcionales. ¿Vas a jugártela utilizando otro framework con pocas pruebas unitarias o que ni siquiera las utilice?</li><li><strong>Internacionalización</strong>: Se pueden crear aplicaciones en varios idiomas. La <a
href="http://www.librosweb.es/symfony/capitulo13.html">internacionalización</a> está integrada en el framework, funciona bien, sigue los estándares (XLIFF), es muy completa y está probada en aplicaciones reales.</li></blockquote></ol></div><div>¿No has terminado de convencerte? El aplicar una una hoja de estilo para desarrollo, no siempre es sencillo y si tienes un gran equipo es más complicado. Todo programador tiene sus manías, sean buenas o malas, pero todos sabemos identificar el código fuente de un compañero de trabajo tras haber colaborado en algún proyecto.</div><div>A la hora de codificar en Symfony inculca las buenas prácticas a la hora de desarrollar, donde no encontrarás deberías encontrarte una consulta a pelo, si no que tiene que pasar siempre por su ORM y en las acciones de los módulos sólo la lógica de los objetos. Si, parece muy sencillo decirlo pero cuando somos pocos y estamos todos de acuerdo no hay problema, pero y cuando no es así...</div><div>Es un Framework CRUDL, pensado para el desarrollo ágil y es divertido programar con él ya que no tienes que "preocuparte" por cosas básicas y repetitivas que podemos ir desarrollando en uno y otro y otro proyecto <img
src='http://pensandoenred.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , sólo la lógica!</div><div>Vale, todavía no... que prefieres Zend porque el framework es el "Oficial". Convencete que lo oficial no siempre es lo mejor, tampoco es que sea malo pero compara:</div><blockquote><div>- La documentación de Zend no es tan extensa como la de Symfony.</div><div>- Zend tenía su propio ORM, pero se ha dado por vencido y va a implantar Doctrine.</div><div>- El abandono del ORM própio de Zend fue por falta de "potencia de desarrollo", la comunidad de Symfony es más grande, más fuerte.</div><div>- Si, en internet todos andamos con el Inglés para arriba y abajo... pero la documentación de Symfony está en varios idiomas, y su comunidad es muy activa.</div></blockquote><p>Todavía no estás convencido? bien, la mejor manera es que analices tus necesidades y te pongas con la documentación de Symfony, el libro está muy bien pero donde más rápido vas a ver su potencia es en su ejemplo práctico <a
href="http://www.symfony-project.org/jobeet/1_4/Doctrine/es/" target="_blank">Jobeet</a>. Cuéntame tu impresión cuando estés en el 5º capítulo <img
src='http://pensandoenred.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2009/12/07/%c2%bfpor-que-usar-symfony/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Sintetizar texto a voz con Festival en Web</title><link>http://pensandoenred.com/2009/12/04/sintetizar-texto-a-voz-con-festival-en-web/</link> <comments>http://pensandoenred.com/2009/12/04/sintetizar-texto-a-voz-con-festival-en-web/#comments</comments> <pubDate>Thu, 03 Dec 2009 22:58:24 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[php]]></category> <category><![CDATA[festival]]></category> <category><![CDATA[mp3]]></category> <category><![CDATA[tts]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=466</guid> <description><![CDATA[En este post doy por hecho que sabemos hacer la instalación del servicio de Festival en nuestro equipo linux, si no es así siempre podéis pasar por Festival, de texto a voz en linux. Después de unos post "filosóficos" hoy pasamos nuevamente a la parte ténica, en donde con un par de ficheros podremos generar [...]]]></description> <content:encoded><![CDATA[<p>En este post doy por hecho que sabemos hacer la instalación del servicio de Festival en nuestro equipo linux, si no es así siempre podéis pasar por <a
href="http://www.pensandoenred.com/2007/08/22/festival-de-texto-a-voz-en-linux/" target="_self">Festival, de texto a voz en linux</a>.</p><p>Después de unos post "filosóficos" hoy pasamos nuevamente a la parte ténica, en donde con un par de ficheros podremos generar un fichero mp3 sintetizado con Festival mediante un texto de un formulario web.</p><p>El ejemplo que expongo a continuación es una página web sencilla que tras rellenar el texto en un textarea lo envía a si misma y retorna la descarga de un fichero mp3 con el texto sintetizado, siempre que tengamos el servicio de festival configurado.</p><p>El ejemplo de página web sería:</p><pre class="brush: php; ">
&lt;?php
if($_POST[&#039;texto&#039;]){
   $filename = md5($_POST[&#039;texto&#039;]);
   $txtFile=$filename;
   $mp3File=$filename.&quot;.mp3&quot;;
   $fp = fopen($txtFile, &#039;w&#039;);
   fwrite($fp,$_POST[&#039;texto&#039;]);
   fclose($fp);
   exec(&quot;./lanza.sh $txtFile&quot;);
   if(file_exists($mp3File)){
      $fp = fopen($mp3File,&#039;r&#039;);
      if (filesize($mp3File)) {
        $mp3 = fread($fp, filesize($mp3File));
      }
      fclose($fp);
   }
   if(isset($mp3)){
      header(&#039;Content-Type: audio/x-mp3&#039;);
      header(&#039;Content-Disposition: attachment; filename=&quot;&#039;.$mp3File);
      header(&#039;Content-Length: &#039;. filesize($mp3File));
      echo $mp3;
      unlink($mp3File);
      unlink($txtFile);
   }
}else{
?&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
 &lt;head&gt;
   &lt;title&gt;Demo&lt;/title&gt;
 &lt;/head&gt;
&lt;body&gt;
 &lt;h1&gt;Demo&lt;/h1&gt;
 &lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
   &lt;textarea name=&quot;texto&quot; rows=&quot;10&quot; cols=&quot;50&quot;&gt;&lt;/textarea&gt;
   &lt;br /&gt;
   &lt;input type=&quot;submit&quot; name=&quot;enviar&quot; value=&quot;enviar&quot; /&gt;
 &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;?
}
?&gt;
</pre><p>Como podemos ver, lanzamos un script para generar el fichero mp3, que es la parte más importante ya que cualquier programador y más si hablamos de alguien experto en PHP puede observar que el código es realmente sencillo. Pero lo más divertido fue crear el script sh para generar el fichero mp3.</p><pre class="brush: c; ">
#!/bin/sh
TEXT=`cat $1`
PAR1=&quot;(Parameter.set &#039;Wavefiletype &#039;riff)n&quot;
PAR2=&quot;(let ((utt (Utterance Text &quot;$TEXT&quot;))) (begin (utt.synth utt) (utt.save.wave utt &quot;$1.wav&quot;))) n&quot;
echo Inicio festival!
echo $PAR1$PAR2 | festival -b --pipe --language spanish
lame -hf $1.wav $1.mp3
rm $1.wav
</pre><p>Aquí en el script, lo que hacemos es indicarle a Festival que la salida la queremos en un fichero Wav. De todas formas no tenemos todo resuelto! tenemos que generar el mp3, y con lame lo hacemos de una manera sencilla <img
src='http://pensandoenred.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p>Espero que os pueda ser de utilidad esta mini-receta, cualquier duda siempre podéis plasmarla en un comentario.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2009/12/04/sintetizar-texto-a-voz-con-festival-en-web/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Desarrollo web orientado a servicios</title><link>http://pensandoenred.com/2009/12/02/desarrollo-web-orientado-a-servicios/</link> <comments>http://pensandoenred.com/2009/12/02/desarrollo-web-orientado-a-servicios/#comments</comments> <pubDate>Wed, 02 Dec 2009 13:37:34 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Internet]]></category> <category><![CDATA[Pensamientos]]></category> <category><![CDATA[php]]></category> <category><![CDATA[facebook]]></category> <category><![CDATA[Twitter]]></category> <category><![CDATA[Web]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=458</guid> <description><![CDATA[Aunque no me considero de los "viejos" en Internet está claro que todo el que está envuelto en el desarrollo de aplicaciones web y/o usuario de los "últimos" servicios disponibles se estará dando cuenta. Facebook, en su día fue una novedad y es cierto que ahora tiene muchos usuarios registrados y en donde puedes encontrar [...]]]></description> <content:encoded><![CDATA[<p>Aunque no me considero de los "viejos" en Internet está claro que todo el que está envuelto en el desarrollo de aplicaciones web y/o usuario de los "últimos" servicios disponibles se estará dando cuenta.</p><p>Facebook, en su día fue una novedad y es cierto que ahora tiene muchos usuarios registrados y en donde puedes encontrar a mucha gente al igual que mantenerte en contacto. Pero entrar en Facebook es una locura, que si fulanito es tal pelicula... No obstante el post no va orientado hacia la funcionalidad de Facebok.</p><p>Tengo claro que el "futuro" de los desarrollos de aplicaciones web y/o servicios sociales tienen que tener una orientación a servicios web. El ejemplo claro lo podemos encontrar en <a
href="http://twitter.com" target="_blank">Twitter</a>. Una aplicación Web que tras publicar un API para desarrollar, la comunidad de desarrolladores y/o empresas de software le han sacado partido lanzando un sinfin de aplicaciones y widgets para el uso del servicio. No solo hace más cómodo en parte el utilizar este servicio, si no que deja a la mano del usuario final como quiere utilizarlo.</p><p>Estoy seguro que si para utilizar <a
href="http://twitter.com">Twitter</a> sólo se pudiera mediante su web, el éxito no sería tan rotundo!</p><p>No sólo de aplicaciones web sociales vive el hombre! también de productos, ya no tanto los desarrollos a medida que hasta hace un par de años era lo que se imponía en el desarrollo de aplicaciones o páginas web a nivel corporativo. Ahora se busca la estandarización y la creación de un producto que agilice la tarea. Aquí es donde viene el tema!</p><p>Si un producto web lo orientamos a servicios, teniendo "mini" productos Web descentralizamos el servicio y su mantenimiento. Todo esto no solo condiciona el desarrollo si no también la infraestructura que lo soporte.</p><p>Está muy al día el conceptualizar a la Web 3.0 como la Web Semantica, pero creo que antes de llegar hasta la Web Semantica tenemos que tener "un Internet" más usuable, más accesible sin depender de dispositivos/ordenadores en particular. Una revolución en la comunicación tiene que venir dada por la estrategia de los proyectos que verán la luz en Internet.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2009/12/02/desarrollo-web-orientado-a-servicios/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Symfony 1.4 estable</title><link>http://pensandoenred.com/2009/12/02/symfony-1-4-estable/</link> <comments>http://pensandoenred.com/2009/12/02/symfony-1-4-estable/#comments</comments> <pubDate>Tue, 01 Dec 2009 22:03:47 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[Framework]]></category> <category><![CDATA[php]]></category> <category><![CDATA[Software Libre]]></category> <category><![CDATA[Symfony]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=453</guid> <description><![CDATA[Ya tenemos disponible la versión estable de Symfony 1.4, como es de esperar también acompañada de una amplia documentación en varios idiomas en el lanzamiento de la versión estable. En la web de Symfony de habla hispana nos da información al respecto. Y cito de: http://www.symfony.es/2009/12/01/mas-con-symfony-el-libro-definitivo/ La gran novedad es que este libro es el [...]]]></description> <content:encoded><![CDATA[<p>Ya tenemos disponible la versión estable de <a
href="http://www.symfony-project.org/" target="_blank">Symfony 1.4</a>, como es de esperar también acompañada de una amplia documentación en varios idiomas en el lanzamiento de la versión estable. En la web de Symfony de habla hispana nos da información al respecto. Y cito de: <a
href="http://www.symfony.es/2009/12/01/mas-con-symfony-el-libro-definitivo/" target="_blank">http://www.symfony.es/2009/12/01/mas-con-symfony-el-libro-definitivo/</a></p><blockquote><p>La gran novedad es que este libro es el primero que <strong>se ha escrito específicamente para los usuarios avanzados de Symfony</strong>, por lo que en este libro no te encontrarás la enésima explicación de cómo instalar Symfony o de cómo funciona la arquitectura MVC.</p></blockquote> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2009/12/02/symfony-1-4-estable/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>$GLOBALS vs Static method en PHP 5.2.1</title><link>http://pensandoenred.com/2009/11/11/globals-vs-static-method-en-php-5-2-1/</link> <comments>http://pensandoenred.com/2009/11/11/globals-vs-static-method-en-php-5-2-1/#comments</comments> <pubDate>Tue, 10 Nov 2009 22:15:04 +0000</pubDate> <dc:creator>mariotux</dc:creator> <category><![CDATA[php]]></category> <category><![CDATA[global]]></category> <category><![CDATA[static]]></category> <guid
isPermaLink="false">http://www.pensandoenred.com/?p=439</guid> <description><![CDATA[Hoy en el trabajo ha surgido la conversación de si es más efectivo el utilizar clases con métodos estáticos para tener una colección de objetos o variables $GLOBAL. No he utilizado en ninguno de mis desarrollos variables globales por lo que en el trayecto a casa vine dándole vueltas a como poder realizar la prueba [...]]]></description> <content:encoded><![CDATA[<p>Hoy en el trabajo ha surgido la conversación de si es más efectivo el utilizar clases con métodos estáticos para tener una colección de objetos o variables $GLOBAL. No he utilizado en ninguno de mis desarrollos variables globales por lo que en el trayecto a casa vine dándole vueltas a como poder realizar la prueba de rendimiento entre variables globales y método estático.</p><p>Lo que se me ocurrió fue crear dos clases idénticas, a diferencia de que una tiene método estático y la otra no. La no estática la instanciaré en una variable global y entonces comprobaré el uso de memoria.</p><p>Ambas clases con una propiedad que almacena el string y con sus métodos de GET y SET. Utilizando el string " Hola Mundo! "</p><p>Resultado:</p><blockquote><h2>Static</h2><p>54.1 Kb<br
/> Hola Mundo!<br
/> Memoria usada: 54.5 KB de 256 KB<br
/> <strong>Memoria consumida:0.4 KB<br
/> </strong>0.000107 sec</p></blockquote><blockquote><h2>Globals</h2><p>54.1 Kb<br
/> Hola Mundo!<br
/> Memoria usada: 54.8 KB de 256 KB<br
/> <strong>Memoria consumida:0.7 KB<br
/> </strong>0.000126 sec</p></blockquote><p>La conclusión es clara, Globals consume 0.3Kb más que un método estático y es algo más lento. Esta prueba se ha realizado con un simple string pero si la hiciéramos en una aplicación los datos de memoria y de tiempo tendrían una diferencia más notable.</p> ]]></content:encoded> <wfw:commentRss>http://pensandoenred.com/2009/11/11/globals-vs-static-method-en-php-5-2-1/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss>
