<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title><![CDATA[Vabadus. Consultoría Symfony y Drupal]]></title>
        <link>https://vabadus.es/blog</link>
        <description>Blog de Vabadus. Consultoría Symfony y Drupal</description>
        <atom:link href="https://vabadus.es/blog/feed" rel="self"></atom:link>
                <language>es</language>
        <lastBuildDate>Fri, 08 Mar 2019 11:00:00 +0100</lastBuildDate>
                <item>
            <title>Añadir ordenación por relaciones toMany en consultas usando Doctrine con Symfony</title>
            <link>https://vabadus.es/blog/anadir-ordenacion-por-relaciones-tomany-en-consultas-usando-doctrine-con-symfony</link>
            <guid isPermaLink="true">https://vabadus.es/blog/anadir-ordenacion-por-relaciones-tomany-en-consultas-usando-doctrine-con-symfony</guid>
                        <category>Symfony</category>
                        <category>Doctrine</category>
                        <description>&lt;p&gt;Al construir consultas complejas con &lt;strong&gt;Doctrine&lt;/strong&gt; en proyectos &lt;strong&gt;Symfony&lt;/strong&gt;, hemos podido comprobar que genera bastantes dudas cómo añadir ordenación por relaciones entre entidades, ya sean &lt;em&gt;OneToMany&lt;/em&gt; o &lt;em&gt;ManyToMany&lt;/em&gt;. Es por esto, que vamos a intentar explicar en este artículo, cómo puede implementarse de una forma sencilla.&lt;/p&gt;
&lt;p&gt;Como ejemplo, vamos a suponer que tenemos un modelo de datos con dos entidades, &lt;code&gt;Articulo&lt;/code &gt; y &lt;code&gt;Comentario&lt;/code&gt;, entre las que existe una relación &lt;i&gt;OneToMany&lt;/i&gt;, tal y como se muestra a continuación:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
class Articulo {
   // ...

   /**
    * @ORM\Column(type=&quot;string&quot;, length=255)
    */
   protected $titulo;

   /**
    * @ORM\OneToMany(targetEntity=&quot;AppBundle\Entity\Comentario&quot;, mappedBy=&quot;articulo&quot;)
    */
   protected $comentarios;

   // ...
}

class Comentario {
   // ...

   /**
    * @ORM\ManyToOne(targetEntity=&quot;AppBundle\Entity\Articulo&quot;, inversedBy=&quot;comentarios&quot;)
    * @ORM\JoinColumn(referencedColumnName=&quot;id&quot;)
    */
   protected $articulo;

   // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Una consulta básica para obtener un listado de todos los artículos almacenados en base de datos, ordenados por el campo &lt;code&gt;titulo&lt;/code&gt;, podría ser esta:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$articulos = $articuloRepository-&gt;createQueryBuilder(&#039;a&#039;)
   -&gt;orderBy(&#039;a.titulo&#039;, &#039;ASC&#039;)
   -&gt;getQuery()
   -&gt;getResult()
;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obteniendo un array de objetos &lt;code&gt;Articulo&lt;/code&gt; similar a este:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
array [
   0 =&gt; Articulo {#1}
   1 =&gt; Articulo {#2}
   2 =&gt; Articulo {#3}
   ...
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pero qué ocurre si queremos ordenar esta consulta para mostrar primero aquellos artículos que tengan mayor número de comentarios. Lo primero que se nos puede ocurrir es añadir a la consulta un &lt;code&gt;COUNT&lt;/code&gt; con los comentarios, y ordenar por ese resultado, es decir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$articulos = $articuloRepository-&gt;createQueryBuilder(&#039;a&#039;)
   -&gt;addSelect(&#039;COUNT(c.id) AS numComentarios&#039;)
   -&gt;leftJoin(&#039;a.comentarios&#039;, &#039;c&#039;)
   -&gt;orderBy(&#039;numComentarios&#039;, &#039;DESC&#039;)
   -&gt;getQuery()
   -&gt;getResult()
;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pero si ejecutamos este código, lo que obtendremos es un error similar a este:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column &#039;articulo.id&#039;; this is incompatible with sql_mode=only_full_group_by
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;¿Por qué se produce este error? Porque MySQL no permite consultas en las cuales se refiera a columnas no agregadas en la cláusula GROUP BY. Entendido, entonces solo faltaría añadir el &lt;code&gt;GROUP BY&lt;/code&gt; a la consulta:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$articulos = $articuloRepository-&gt;createQueryBuilder(&#039;a&#039;)
   -&gt;addSelect(&#039;COUNT(c.id) AS numComentarios&#039;)
   -&gt;leftJoin(&#039;a.comentarios&#039;, &#039;c&#039;)
   -&gt;orderBy(&#039;numComentarios&#039;, &#039;DESC&#039;)
   -&gt;groupBy(&#039;a.id&#039;)
   -&gt;getQuery()
   -&gt;getResult()
;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La respuesta es sí y no. Añadiendo &lt;code&gt;GROUP BY&lt;/code&gt; evitamos el error de MySQL, pero no tenemos el resultado final que nos gustaría. En la consulta anterior, tenemos un &lt;code&gt;SELECT&lt;/code&gt; implícito en &lt;code&gt;-&gt;createQueryBuilder(&#039;a&#039;)&lt;/code&gt;, con todos los campos de la entidad &lt;code&gt;Articulo&lt;/code&gt; y un &lt;code&gt;SELECT&lt;/code&gt; añadido con el número de comentarios asociado a cada &lt;code&gt;Articulo&lt;/code&gt;, es decir, estaríamos obteniendo un array de arrays similar a este:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
array [
   0 =&gt; array:2 [
      0 =&gt; Articulo {#28}
      &quot;numComentarios&quot; =&gt; &quot;354&quot;
   ]
   1 =&gt; array:2 [
      0 =&gt; Articulo {#97}
      &quot;numComentarios&quot; =&gt; &quot;295&quot;
   ]
   2 =&gt; array:2 [
      0 =&gt; Articulo {#106}
      &quot;numComentarios&quot; =&gt; &quot;265&quot;
   ]
   ...
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;¿Cómo conseguimos unificar en un array todos los datos necesarios? Una forma podría ser añadir un &lt;code&gt;SELECT&lt;/code&gt; con los campos que necesitemos, es decir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$articulos = $articuloRepository-&gt;createQueryBuilder(&#039;a&#039;)
   -&gt;select(&#039;a.id, a.titulo, ..., COUNT(c.id) AS numComentarios&#039;)
   -&gt;leftJoin(&#039;a.comentarios&#039;, &#039;c&#039;)
   -&gt;orderBy(&#039;numComentarios&#039;, &#039;DESC&#039;)
   -&gt;groupBy(&#039;a.id&#039;)
   -&gt;getQuery()
   -&gt;getResult()
;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Con lo que obtendríamos un resultado similar a este, que es lo que perseguíamos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
array [
   0 =&gt; array [
      &quot;id&quot; =&gt; 28
      ...
      &quot;numComentarios&quot; =&gt; &quot;354&quot;
   ]
   1 =&gt; array [
      &quot;id&quot; =&gt; 97
      ...
      &quot;numComentarios&quot; =&gt; &quot;295&quot;
   ]
   2 =&gt; array [
      &quot;id&quot; =&gt; 106
      ...
      &quot;numComentarios&quot; =&gt; &quot;265&quot;
   ]
   ...
]
&lt;/code&gt;&lt;/pre&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Fri, 08 Mar 2019 11:00:00 +0100</pubDate>
        </item>
                <item>
            <title>Añade efectos a tu web con la librería AOS</title>
            <link>https://vabadus.es/blog/anade-efectos-a-tu-web-con-la-libreria-aos</link>
            <guid isPermaLink="true">https://vabadus.es/blog/anade-efectos-a-tu-web-con-la-libreria-aos</guid>
                        <category>Javascript</category>
                        <category>CSS</category>
                        <category>Software libre</category>
                        <category>Configuración</category>
                        <category>Librería</category>
                        <category>aos</category>
                        <description>&lt;p&gt;Esta vez hemos preparado un artículo que os podrá ayudar a darle un toque más original y moderno a vuestra web o sitios que estéis desarrollando. Se trata de la librería &lt;strong&gt;AOS (Animate On Scroll)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Como su nombre en inglés indica, esta librería nos proporciona una serie de animaciones a los bloques de nuestro &lt;em&gt;html&lt;/em&gt; cuando nos situemos en la posición del elemento haciendo &lt;em&gt;scroll&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La primera funcionalidad que se le viene a la cabeza a todo el mundo que descubre esta librería, es animar la aparición de los elementos de un listado: noticias, productos, contactos… Pero ¿cómo animamos nuestros elementos?&lt;/p&gt;

&lt;p&gt;Lo primero que tenemos que hacer es descargarnos la librería y añadirla a nuestro proyecto.  &lt;a target=&quot;_blank&quot; href=&quot;https://michalsnik.github.io/aos/&quot;&gt;Desde el sitio oficial&lt;/a&gt;  podemos descargar los archivos &lt;em&gt;aos.css&lt;/em&gt; y &lt;em&gt;aos.js&lt;/em&gt; para incluirlos en nuestro sitio.&lt;/p&gt;
&lt;p&gt;En el caso de &lt;strong&gt;Drupal&lt;/strong&gt; lo haremos en la carpeta de css y js de nuestro tema. Recordad que debemos incluir la carga de esto ficheros desde el  &lt;em&gt;.info &lt;/em&gt; de dicho tema.&lt;/p&gt;

&lt;p&gt;Supongamos que tenemos un contenedor de noticias con un &lt;em&gt;html&lt;/em&gt; parecido a este:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;div class=&quot;news-container&quot;&amp;gt
    &amp;lt;div class=&quot;news&quot;&amp;gt
        ...
        ...
    &amp;lt;/div&amp;gt
    &amp;lt;div class=&quot;news&quot;&amp;gt
        ...
        ...
    &amp;lt;/div&amp;gt
    &amp;lt;div class=&quot;news&quot;&amp;gt
        ...
        ...
    &amp;lt;/div&amp;gt
    &amp;lt;div class=&quot;news&quot;&amp;gt
        ...
        ...
    &amp;lt;/div&amp;gt
&amp;lt;/div&amp;gt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para darle los efectos a los elementos simplemente hay que añadir atributos &lt;em&gt;html&lt;/em&gt; que proporciona la librería a los &lt;em&gt;divs&lt;/em&gt; con clase &lt;em&gt;news&lt;/em&gt;. Por ejemplo, para que los elementos aparezcan de abajo arriba con un efecto de &lt;em&gt;fade&lt;/em&gt; el código anterior quedaría así:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;div class=&quot;news-container&quot;&amp;gt
	&amp;lt;div data-aos=&quot;fade-up&quot; class=&quot;news&quot;&amp;gt
		...
		...
	&amp;lt;/div&amp;gt
	&amp;lt;div data-aos=&quot;fade-up&quot; class=&quot;news&quot;&amp;gt
		...
		...
	&amp;lt;/div&amp;gt
	&amp;lt;div data-aos=&quot;fade-up&quot; class=&quot;news&quot;&amp;gt
		...
		...
	&amp;lt;/div&amp;gt
	&amp;lt;div data-aos=&quot;fade-up&quot; class=&quot;news&quot;&amp;gt
		...
		...
	&amp;lt;/div&amp;gt
&amp;lt;/div&amp;gt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por último, hay que añadir el siguiente &lt;em&gt;script&lt;/em&gt; que inicializa la clase &lt;em&gt;AOS&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;
 AOS.init();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El ejemplo anterior puede ser el más sencillo que se os ocurra pero podemos dar estos efectos a cualquier elemento de nuestro &lt;em&gt;html&lt;/em&gt;. En el atributo &lt;em&gt;data-aos&lt;/em&gt; seleccionamos la animación del elemento: &lt;em&gt;fade-up, fade-left, flip-right, flip-down&lt;/em&gt;…&lt;/p&gt;
&lt;p&gt;Efecto de entrada &lt;em&gt;fade, flip y zoom&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/todos.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hay más atributos que personalizan tu animación a tu gusto, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;data-aos-duration&lt;/strong&gt;: valores de 0 a 3000 que indican la duración en &lt;em&gt;ms&lt;/em&gt; de la animación.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;data-aos-easing&lt;/strong&gt;: velocidad de la animación.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;data-aos-offset&lt;/strong&gt;: píxeles de desplazamiento para que se inicie la animación al hacer &lt;em&gt;scroll&lt;/em&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;data-aos-delay&lt;/strong&gt;: retrasa la animación tantos &lt;em&gt;ms&lt;/em&gt; como como indique este valor, de 0 a 3000.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas opciones también se pueden poner en la función &lt;em&gt;init&lt;/em&gt; para que afecten a todos los elementos &lt;em&gt;data-aos&lt;/em&gt; que tengamos en el &lt;em&gt;html&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;
 AOS.init({
	    offset: 120,
	    delay: 500,
	    duration: 400,
	    easing: &#039;ease&#039;
  });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otro ejemplo que queda podría resultar curioso, es añadir el atributo &lt;em&gt;data-aos=&quot;fade-up&quot;&lt;/em&gt; en la etiqueta &lt;em&gt;body&lt;/em&gt; de todas las páginas de la web. Esto hace que todo el sitio aparezca con esta animación al cambiar de página.&lt;/p&gt;
&lt;p&gt;En la documentación oficial tenéis detalladas todas las opciones de &lt;a target=&quot;_blank&quot; href=&quot;https://github.com/michalsnik/aos&quot;&gt;personalización&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si te gustan las animaciones y novedosas para tu web, no dudes en contactar con nosotros, ya sabes que estaremos encantados de  &lt;a href=&quot;https://vabadus.es/contacto&quot;&gt;hablar&lt;/a&gt;.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Fri, 22 Feb 2019 08:38:00 +0100</pubDate>
        </item>
                <item>
            <title>Notificaciones push para Android y iOS en Drupal 7</title>
            <link>https://vabadus.es/blog/notificaciones-push-para-android-y-ios-en-drupal-7</link>
            <guid isPermaLink="true">https://vabadus.es/blog/notificaciones-push-para-android-y-ios-en-drupal-7</guid>
                        <category>Drupal</category>
                        <category>Módulos</category>
                        <category>Dispositivos móviles</category>
                        <description>&lt;p&gt;Buenas drupaleros,&lt;/p&gt;

&lt;p&gt;hoy vamos a dar unas pinceladas de cómo desarrollar &lt;strong&gt;notificaciones push&lt;/strong&gt; para sistemas Android y iOS desde nuestro &lt;strong&gt;Drupal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Debemos distinguir entre notificaciones push a sistemas Android y iOS. Utilizaremos distintos módulos y configuraciones para las distintas plataformas.&lt;/p&gt;

&lt;p&gt;Necesitaremos cuatro módulos&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/services&quot; target=&quot;_blank&quot;&gt;Services&lt;/a&gt;&lt;/li&gt; 
&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/push_notifications&quot; target=&quot;_blank&quot;&gt;Push notificacations&lt;/a&gt;&lt;/li&gt; 
&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/firebase&quot; target=&quot;_blank&quot;&gt;Firebase Push Notification&lt;/a&gt;&lt;/li&gt; 
&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/libraries&quot; target=&quot;_blank&quot;&gt;Libraries&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lo primero que debemos hacer es instalar y activar el módulo Services, recordemos que el módulo services tiene dependencia &lt;a href=&quot; https://www.drupal.org/project/ctools&quot;target=&quot;_blank&quot;&gt;Ctools&lt;/a&gt;. Debemos activar también el submódulo REST SERVER.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/push-1.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;Lo siguiente sería activar el módulo push notifications y libraries.&lt;/p&gt;

&lt;p&gt;Seguidamente lo que debemos hacer es un crear endpoint en el REST SERVICES. Lo haremos desde la configuración del submódulo que hemos comentado. Debemos asignarle nombre al nuevo endpoint, seleccionar en tipo de server REST, el path y guardar. Ahora editaremos los recursos y en el endpoint que hemos creado activaremos el “crear y borrar”. Ahora ya se pueden crear y borrar token&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/push-2.png&quot;&gt;&lt;/p&gt;

&lt;strong&gt;Cofiguración Firebase&lt;/strong&gt;

&lt;p&gt;Lo primero será obtener la &lt;a href=&quot;https://firebase.google.com/?hl=es-419&quot;&gt;Firebase Server Key&lt;/a&gt; que será a que nos permita enviar notificaciones push. Una vez obtenida la deberemos introducir en la configuración del módulo la Key y el Firebase endpoint&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/push-3.png&quot;&gt;&lt;/p&gt;
&lt;strong&gt;Apple Store&lt;/strong&gt;
&lt;p&gt;En el Apple Store debemos generar el certificado y registrar ID de la APP. Recuerda que debe ser un  fichero .pem y lo debes subir /tusitio/sites/all/modules/push_notifications/certificates&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/push-4.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;Uno de los problemas del módulo push notificacations, es que soporta Supports GCM (Google Cloud Messaging), Supports C2DM (Cloud 2 Device Messaging), pero no Firebase. Por lo que nosotros decidimos hacer un patch, para que enviase a través del módulo Firebase. &lt;p&gt;
&lt;p&gt;Para enviar las notificaciones, lo debes hacer desde la opción del módulo push notificacations, “Send push”. Seleccionaremos los destinatarios y el idioma (si procede)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/push-5.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;Como habéis podido observar, es una explicación a grandes rasgos de cómo utilizando una serie de módulos contribuidos podemos desarrollar notificaciones push desde nuestro &lt;strong&gt;Drupal 7&lt;strong&gt;&lt;p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/push-6.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;Seguramente en otro post entraremos más en detalle en los problemas que nos hemos encontrado y comentaremos el código que tuvimos que desarrollar para unificar el funcionamiento.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Mon, 11 Feb 2019 17:44:00 +0100</pubDate>
        </item>
                <item>
            <title>Proyecto Symfony: Agencia de viajes online</title>
            <link>https://vabadus.es/blog/proyecto-symfony-agencia-de-viajes-online</link>
            <guid isPermaLink="true">https://vabadus.es/blog/proyecto-symfony-agencia-de-viajes-online</guid>
                        <category>Vabadus</category>
                        <category>Symfony</category>
                        <category>Comercio electrónico</category>
                        <category>CRM</category>
                        <description>&lt;p&gt;Desde hace ya varios años venimos trabajando con &lt;a href=&quot;https://www.geographica.es&quot; title=&quot;Ir a la web de Geographica&quot;&gt;&lt;b&gt;Geographica Travel &amp; Trek&lt;/b&gt;&lt;/a&gt;, una agencia de viajes de montaña, dedicada a organizar actividades de senderismo, montañismo, bicleta, esquí nórdico y esquí de montaña, por todo el mundo. Empezamos a colaborar con ellos manteniendo su antigua aplicación web, desarrollada con &lt;strong&gt;Symfony&lt;/strong&gt; 1.4.&lt;/p&gt;
&lt;p&gt;Geographica es una agencia de viajes 100% online, con lo que todo su negocio depende y se apoya en internet, y la antigua aplicación Symfony 1.4 a parte de desfasada, tenía muchas carencias, no facilitaba el trabajo diario e impedía el crecimiento del negocio online de Geographica.&lt;/p&gt;
&lt;p&gt;Con la experiencia de todos estos años de funcionamiento, estaban perfectamente localizadas las carencias y definidos todos los procesos que eran necesarios para mejorar el trabajo diario y la relación con los clientes. A partir de ahí, empezamos a definir lo que sería una evolución de su aplicación, multiplicando su funcionalidad, desarrollándola desde cero con la última versión de &lt;strong&gt;Symfony&lt;/strong&gt;, aprovechando para actualizar su imagen con un portal web moderno, facilitando a los usuarios su navegación para localizar y contratar de una forma sencilla viajes de su interés y ofreciendo las herramientas necesarias para mantener una comunicación fluida con el personal de Geographica y para gestionar sus reservas.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/2018.geographica.es.jpg&quot; title=&quot;Portal web de Geographica&quot; alt=&quot;Portal web de Geographica&quot;&gt;&lt;/p&gt;
&lt;p&gt;El auténtico motor se encuentra en el backend desde donde el personal de Geographica gestiona toda la información de usuarios, reservas, planifica los viajes, realiza la contabilidad, presupuestos, seguimientos,… y un largo etcétera de funcionalidad disponible para optimizar todos sus procesos de trabajo. Además, tratándose de un desarrollo modular y a medida, nos permite seguir evolucionando la aplicación, mejorándola y añadiéndole nuevos módulos que faciliten el trabajo al personal de Geographica.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Fri, 18 Jan 2019 11:24:00 +0100</pubDate>
        </item>
                <item>
            <title>Buscamos programador Junior PHP. Drupal y Symfony</title>
            <link>https://vabadus.es/blog/buscamos-programador-junior-php-drupal-y-symfony</link>
            <guid isPermaLink="true">https://vabadus.es/blog/buscamos-programador-junior-php-drupal-y-symfony</guid>
                        <category>Vabadus</category>
                        <category>Symfony</category>
                        <category>Drupal</category>
                        <category>Empleo</category>
                        <description>&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/oferta-empleo.jpg&quot; title=&quot;Oferta de empleo&quot; alt=&quot;Oferta de empleo&quot;&gt;&lt;/p&gt;
&lt;p&gt;En &lt;strong&gt;Vabadus&lt;/strong&gt; buscamos talento, buscamos gente joven, recién titulados con estudios técnicos de Informática, Telecomunicaciones, Matemáticas,... con conocimientos de programación. Buscamos perfiles junior, sin experiencia, pero con &lt;strong&gt;ganas de aprender, que le apasione programar&lt;/strong&gt; y que quiera desarrollar una carrera profesional en consultoría IT orientada al desarrollo y programación de proyectos.&lt;/p&gt;
&lt;p&gt;Si cumples este perfil y crees que tienes capacidad analítica, ganas de aprender, capacidad para trabajar en equipo y que puedes contribuir a crear buen ambiente, envíanos tu curriculum al correo electrónico hola arroba vabadus punto es.&lt;/p&gt;
&lt;p&gt;Te proponemos pasar a formar parte de la plantilla de Vabadus en &lt;strong&gt;Cáceres&lt;/strong&gt;, con un &lt;strong&gt;contrato indefinido&lt;/strong&gt;, a &lt;strong&gt;jornada completa&lt;/strong&gt; pero con un &lt;strong&gt;horario realmente flexible&lt;/strong&gt;. Aprenderás y participarás en el desarrollo y programación de portales &lt;strong&gt;PHP&lt;/strong&gt; con &lt;strong&gt;Drupal&lt;/strong&gt; y &lt;strong&gt;Symfony&lt;/strong&gt; y a maquetar diseños responsive con HTML, CSS (Sass) y Javascript. &lt;/p&gt;
&lt;p&gt;Si tienes conocimiento de diseño, te manejas bien en entornos Linux y tienes conocimientos de inglés, tendrás ganados algunos puntos extra.&lt;/p&gt;
&lt;p&gt;Te esperamos.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Fri, 13 Oct 2017 12:16:00 +0200</pubDate>
        </item>
                <item>
            <title>Cuando los sueños se cumplen. Canal Extremadura</title>
            <link>https://vabadus.es/blog/cuando-los-suenos-se-cumplen-canal-extremadura</link>
            <guid isPermaLink="true">https://vabadus.es/blog/cuando-los-suenos-se-cumplen-canal-extremadura</guid>
                        <category>Vabadus</category>
                        <category>Drupal</category>
                        <description>&lt;p&gt;Hace ya más de cuatro años, &lt;strong&gt;Vabadus&lt;/strong&gt; comenzó su andadura en el mundo del  &lt;a href=&quot;https://vabadus.es/blog/empezamos-a-sonar&quot; title=&quot;Empezamos a soñar&quot;&gt;desarrollo web&lt;/a&gt;. Cómo se puede ser un soñador en &lt;a href=&quot;https://www.youtube.com/watch?v=xYaWYuKKq_E&quot; title=&quot;Los Suaves&quot;&gt;estos tiempos de hierro&lt;/a&gt;, nos preguntábamos una y otra vez, y siempre teníamos la misma respuesta: &lt;strong&gt;Ilusión.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ilusión por hacer las cosas de forma diferente, ilusión por tratar a los clientes como personas, ilusión por crecer, ilusión por programar, ilusión por diseñar, ilusión por sentir los proyectos como nuestros, ilusión por cambiar corbatas por camisetas… Ilusión.&lt;/p&gt;

&lt;p&gt;Y llegó el día. Conseguimos el mantenimiento de  &lt;a href=&quot;http://www.canalextremadura.es/&quot; title=&quot;Canal Extremadura&quot;&gt;Canal Extremadura&lt;/a&gt;, un importante proyecto para nosotros. No es el mejor contrato que hemos tenido en estos 4 años, pero en &lt;strong&gt;Vabadus&lt;/strong&gt; la cuestión económica no tiene la máxima prioridad. Si lo fuera, seguramente tendríamos otro tipo de empresa. &lt;strong&gt;Canal Extremadura&lt;/strong&gt; era “nuestro proyecto”, siempre lo fue.

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/canalextremadura.png&quot; title=&quot;Canal Extremadura&quot; alt=&quot;Canal Extremadura&quot;&gt;&lt;/p&gt;

&lt;p&gt;Cada día estamos más convencidos que las empresas pequeñas podemos competir con las “grandes”. No creemos en el mundo de las subcontratas de las subcontratas, en el que los intermediarios se llevan su “cacho”, y al final el desarrollo lo acaba haciendo la misma empresa pequeña. No creemos en la estructura vertical de las empresas antiguas (tecnológicas), somos firmes defensores de la horizontalidad de nuestra empresa. Programamos y tomamos decisiones, somos personas, no cargos apartados de la realidad. Los problemas de nuestros clientes son nuestros problemas y no tenemos que escalarlos a un nivel superior para solucionarlos. &lt;/p&gt;

&lt;p&gt;En definitiva, más de cuatro años han pasado y en &lt;strong&gt; &lt;a href=&quot;https://vabadus.es/&quot; title=&quot;Vabadus&quot;&gt;Vabadus&lt;/a&gt;&lt;/strong&gt; seguimos siendo lo mismo que cuando empezamos: &lt;strong&gt;Compromiso, Alegría, Trabajo e Ilusión&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;¡Seguimos soñando!&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Fri, 21 Apr 2017 12:34:00 +0200</pubDate>
        </item>
                <item>
            <title>Motor de reservas hoteleras Symfony para Hotel Rural El Labriego</title>
            <link>https://vabadus.es/blog/motor-de-reservas-hoteleras-symfony-para-hotel-rural-el-labriego</link>
            <guid isPermaLink="true">https://vabadus.es/blog/motor-de-reservas-hoteleras-symfony-para-hotel-rural-el-labriego</guid>
                        <category>Vabadus</category>
                        <category>Symfony</category>
                        <category>Comercio electrónico</category>
                        <description>&lt;p&gt;Desde hace unas semanas el &lt;a href=&quot;http://www.hotelrurallabriego.com&quot; title=&quot;Ir a la web de Hotel Rural El Labriego&quot;&gt;&lt;b&gt;Hotel Rural El Labriego&lt;/b&gt;&lt;/a&gt; cuenta con un nuevo portal web 100% responsive, optimizado para buscadores, multidioma y autogestionable, gracias a nuestro motor de reservas para hoteles desarrollado con &lt;strong&gt;Symfony&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/hotelrurallabriego-motor-reservas.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;Se trata de una solución completa y económica, un sistema de gestión muy fácil de usar, tanto por usuarios como por administradores, totalmente adaptable a cualquier dispositivo móvil o tablet, permitiendo a cualquier establecimiento hotelero poder gestionar su negocio a través de un entorno web. &lt;/p&gt;
&lt;p&gt;El panel de control con el que cuentan los administradores de Hotel Rural El Labriego es sencillo e intuitivo, fácil de manejar por usuarios con un nivel informático básico, que les permite gestionar sus habitaciones incluyendo imágenes y textos, precios, disponibilidad, etc. Además, el proceso de reserva de habitaciones por parte de los clientes resulta sencillo y rápido a través del portal web, guiando al usuario paso a paso y permitiendo tanto el pago online como a la llegada al hotel.&lt;/p&gt;
&lt;p&gt;Una solución perfecta para cualquier negocio hotelero que desee mejorar su presencia en internet, dejar de pagar comisiones y aumentar las reservas directas. Si estás interesado en recibir más información, &lt;a href=&quot;/contacto&quot; title=&quot;Ir al formulario de contacto&quot;&gt;contacta con nosotros&lt;/a&gt;. Estaremos encantados de hablar.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Wed, 15 Mar 2017 17:58:00 +0100</pubDate>
        </item>
                <item>
            <title>Aplicación web Symfony de facturación y CRM para Garrido Limpiezas</title>
            <link>https://vabadus.es/blog/aplicacion-web-symfony-de-facturacion-y-crm-para-garrido-limpiezas</link>
            <guid isPermaLink="true">https://vabadus.es/blog/aplicacion-web-symfony-de-facturacion-y-crm-para-garrido-limpiezas</guid>
                        <category>Vabadus</category>
                        <category>Symfony</category>
                        <category>CRM</category>
                        <category>SEPA</category>
                        <description>&lt;p&gt;Desde hace unos meses, la empresa extremeña &lt;a href=&quot;http://www.garridolimpiezas.es&quot;&gt;Garrido Limpiezas&lt;/a&gt; viene utilizando una &lt;strong&gt;aplicación web CRM y de facturación&lt;/strong&gt; que hemos desarrollado en &lt;a href=&quot;https://vabadus.es&quot;&gt;Vabadus&lt;/a&gt; con &lt;strong&gt;Symfony&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Se planteaba la necesidad de contar con una herramienta moderna, robusta y segura, suficientemente modulable para que les permitiera incorporar nuevas funcionalidades, según las necesidades que puedan surgir en el futuro y que además, les permitiera una gestión cómoda de la aplicación a través del móvil y desde cualquier lugar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/garridolimpiezas.es.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;Se prestó especial atención a la &lt;strong&gt;usabilidad&lt;/strong&gt; durante el desarrollo de la aplicación, ya que era requisito indispensable para el cliente que la herramienta contase con una interfaz muy sencilla donde cualquier usuario, sin necesidad de cursos ni conocimientos avanzados, pudiera realizar cualquier gestión de la empresa.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/sepa.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;Además de la gestión de clientes, trabajadores, facturación, etc. a través de esta aplicación web es posible gestionar &lt;strong&gt;remesas bancarias&lt;/strong&gt;, agrupando varios recibos domiciliados pendientes de cobro, permitiendo generar el fichero correpondiente de acuerdo a la &lt;strong&gt;normativa SEPA&lt;/strong&gt;, para su posterior tramitación a través de cualquier banco.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Mon, 06 Feb 2017 14:20:00 +0100</pubDate>
        </item>
                <item>
            <title>Nuevo proyecto Drupal 8. Reverdeceremus</title>
            <link>https://vabadus.es/blog/nuevo-proyecto-drupal-8-reverdeceremus</link>
            <guid isPermaLink="true">https://vabadus.es/blog/nuevo-proyecto-drupal-8-reverdeceremus</guid>
                        <category>Vabadus</category>
                        <category>Drupal</category>
                        <category>Diseño adaptable</category>
                        <description>&lt;p&gt;Tenemos el placer de presentar nuestro último proyecto &lt;strong&gt;Drupal 8&lt;/strong&gt;: &lt;a href=&quot;http://reverdeceremus.com/es&quot; title=&quot;Ir a la web de Reverdeceremus&quot;&gt;&lt;b&gt;Reverdeceremus.com&lt;/b&gt;&lt;/a&gt;. Es un proyecto en el que nos hemos sentido ilusionados desde el principio. Primero por el carácter del portal, que da visibilidad a una Asociación que lucha para mitigar los efectos causados por el devastador fuego del año pasado en la comarca de Sierra de Gata. Segundo por el trato recibido por las personas que forman dicha asociación. Y tercero porque lo hemos desarrollado en Drupal 8 ;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/rever_1.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;El portal, como comentábamos, está desarrollado en Drupal 8, y en él podemos encontrar información del festival, los grupos que actuarán, noticias de las asociación, actividades que se van a desarrollar, información de interés y un largo etc.&lt;/p&gt;

&lt;p&gt;Se ha implementado también un área privada personalizada para que los gestores/editores de la web realicen las tareas de edición/creación de una forma mucho más cómoda y ágil.&lt;/p&gt;

&lt;p&gt;La web, como no podía ser de otra manera, es completamente adaptable a cualquier dispositivo, permitiendo así una correcta visualización.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/rever_3.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;Desde &lt;strong&gt;Vabadus&lt;/strong&gt; hemos puesto nuestro granito de arena, y hemos desarrollado de forma totalmente gratuita el portal, colaborando así a nuestra manera con esta causa. De la parte de Hosting, se ha encargado &lt;a href=&quot;https://www.playmyhit.com&quot; title=&quot;Ir a la web de PlayMyHit&quot;&gt;&lt;b&gt;PlayMyHit&lt;/b&gt;&lt;/a&gt;, cediendo y dando soporte con uno de sus servidores. Nos alegra que empresas tecnológicas extremeñas estén comprometidas con el medio ambiente y que apuesten por un &lt;a href=&quot;http://reverdeceremus.com/es&quot; title=&quot;Ir a la web de Reverdeceremus&quot;&gt;&lt;b&gt;reverdecer&lt;/b&gt;&lt;/a&gt; de la zona.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Mon, 01 Aug 2016 09:54:00 +0200</pubDate>
        </item>
                <item>
            <title>Servicios web RESTful en Drupal 8</title>
            <link>https://vabadus.es/blog/servicios-web-restful-en-drupal-8</link>
            <guid isPermaLink="true">https://vabadus.es/blog/servicios-web-restful-en-drupal-8</guid>
                        <category>Drupal</category>
                        <category>Servicios web</category>
                        <category>REST</category>
                        <description>&lt;p&gt;Uno de los nuevos desarrollos que incluye la última versión de &lt;strong&gt;Drupal&lt;/strong&gt; que más nos gusta son los servicios web. En versiones anteriores no era tarea fácil la de trabajar con servicios web, pero en la versión 8 de Drupal vienen incluidos directamente en el Core, lo que permite interactuar con nuestras aplicaciones Drupal para consumir información, sin necesidad de instalar módulos de terceros. En este artículo queremos echar un vistazo a los servicios web RESTful del Core de Drupal 8 y ver algún ejemplo.&lt;/p&gt;
&lt;p&gt;Antes de seguir, debemos saber qué es eso de los servicios web &lt;strong&gt;RESTful&lt;/strong&gt;. Los servicios web aportan interoperabilidad entre aplicaciones de software independientemente de sus propiedades o de las plataformas sobre las que se instalen, en nuestro caso permitiendo que aplicaciones externas puedan comunicarse con nuestra aplicación Drupal. Las acciones más comunes que se llevan a cabo a través de estos servicios web son las de lectura, creación, actualización y borrado de recursos. &lt;strong&gt;REST (Representational State Transfer)&lt;/strong&gt; es uno de los estándares más usados, que utiliza el protocolo HTTP para proporcionar los métodos necesarios para realizar las distintas operaciones disponibles de lectura, creación, actualización, borrado, etc. en la comunicación entre la aplicación y los clientes que se conectan a ella.&lt;/p&gt;
&lt;p&gt;Estos son los módulos que se incluyen en el Core de Drupal 8 relacionados con los servicios web:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/drupal8-webservices-modulos.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Lo primero que haremos para poder utilizar toda su funcionalidad, será habilitarlos y acceder a la configuración de los permisos del módulo &lt;strong&gt;RESTful Web Services&lt;/strong&gt; para los métodos comunes de HTTP, GET, POST, PATCH y DELETE. Cada uno de estos métodos permite realizar una operación sobre un recurso de la aplicación, por ejemplo, usaremos GET para leer un contenido específico como una noticia o POST para crear una nueva, PATCH para actualizarla o DELETE para eliminarla.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/drupal8-webservices-permisos.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Llegados aquí, ya estamos en condiciones de probar el servicio web RESTful habilitado en nuestra aplicación Drupal 8. Para ello, nosotros usamos la extensión para Chrome &lt;a href=&quot;https://chrome.google.com/webstore/detail/dhc-rest-client/aejoelaoggembcahagimdiliamlcdmfm/related&quot;&gt;DHC REST Client&lt;/a&gt; que nos permitirá realizar llamadas al servicio web y probar su funcionamiento, aunque hay otras muchas herramientas similares que se pueden utilizar.&lt;/p&gt;
&lt;p&gt;Por ejemplo, podemos recuperar la información del nodo 1, realizando una petición a http://nuestrositioweb/node/1, añadiendo el parámetro &lt;i&gt;Accept=application/hal+json&lt;/i&gt; que habilite la serialización HAL JSON antes de enviar la solicitud GET y si no hay ningún problema, obtendremos como respuesta a nuestra petición el nodo con todos los campos serializados en HAL JSON.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/drupal8-webservices-get.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Para finalizar, os recomendamos el uso de un módulo contribuido, &lt;a href=&quot;https://www.drupal.org/project/restui&quot;&gt;REST UI&lt;/a&gt;, que proporciona una interfaz de usuario para configurar el REST API de Drupal, habilitando o deshabitando recursos, formatos de serialización, etc.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/drupal8-webservices-restui.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hasta aquí esta introducción a los servicios web en Drupal 8. En un artículo posterior, veremos un ejemplo de cómo crear vistas que devuelvan un listado de contenido en JSON a través del REST API.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Wed, 27 Jul 2016 08:16:00 +0200</pubDate>
        </item>
                <item>
            <title>Drupal Commerce</title>
            <link>https://vabadus.es/blog/drupal-commerce</link>
            <guid isPermaLink="true">https://vabadus.es/blog/drupal-commerce</guid>
                        <category>Vabadus</category>
                        <category>Drupal</category>
                        <category>Comercio electrónico</category>
                        <category>Diseño adaptable</category>
                        <description>&lt;p&gt;&lt;strong&gt;Comercio electrónico&lt;/strong&gt;&lt;p&gt;

&lt;p&gt;Desde &lt;strong&gt;Vabadus&lt;/strong&gt; queremos ayudarte en tu primer paso hacia el comercio electrónico o en la mejora de tu portal actual.&lt;/p&gt;

&lt;p&gt;Para ello te ofrecemos una tienda on-line completa, basada en &lt;strong&gt;Drupal Commerce.&lt;/strong&gt; Drupal Commerce se utiliza para crear sitios web de comercio electrónico, aprovechando todas la robustez, versatilidad y la flexibilidad que ofrece Drupal.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/drupal-commerce.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;Los desarrollos englobarán todo un conjunto de funcionalidades, como pueden ser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestión de pedidos, facturas, descuentos, promociones&lt;/li&gt;
&lt;li&gt;Gestión de productos, con atributos: tallas, colores, etc&lt;/li&gt;
&lt;li&gt;Gestión de clientes&lt;/li&gt;
&lt;li&gt;Pasarelas de pago: banco, paypal, etc&lt;/li&gt;
&lt;li&gt;Multiidioma&lt;/li&gt;
&lt;li&gt;Gestión de impuestos, monedas, etc&lt;/li&gt;
&lt;li&gt;A parte de toda la personalización que quiera el cliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todo ello con un diseño moderno y adaptable a cualquier dispositivo. Teniendo especial atención y trabajando en un desarrollo que favorezca el posicionamiento.&lt;/p&gt;

&lt;p&gt;Las tiendas que ofrecemos llevan un componente adicional y es implicación de Vabadus en el proyecto. El trabajo día a día, codo a codo con el cliente, escuchando, proponiendo  y orientando darán como resultado una tienda on-line a la medida del cliente, recogiendo todas las necesidades del mismo y con la aportación profesional de Vabadus.&lt;/p&gt;

&lt;p&gt;&lt;stron&gt;&lt;a href=&quot;https://vabadus.es/contacto&quot; title=&quot;Ir al contacto&quot;&gt;&lt;strong&gt;Confía en nosotros&lt;/strong&gt;&lt;/a&gt;, seguro que no te arrepentirás.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Mon, 11 Jul 2016 18:53:00 +0200</pubDate>
        </item>
                <item>
            <title>Cómo gestionar tus tareas cron en Drupal con el módulo Ultimate Cron</title>
            <link>https://vabadus.es/blog/como-gestionar-tus-tareas-cron-en-drupal-con-el-modulo-ultimate-cron</link>
            <guid isPermaLink="true">https://vabadus.es/blog/como-gestionar-tus-tareas-cron-en-drupal-con-el-modulo-ultimate-cron</guid>
                        <category>Drupal</category>
                        <category>Módulos</category>
                        <description>&lt;p&gt;Buenas drupaleros, &lt;/p&gt;

&lt;p&gt;hoy os presentamos un módulo contribuido para &lt;strong&gt;Drupal&lt;/strong&gt;, que nos hará la vida más sencilla a la hora de planificar y gestionar las diferentes tareas que tengamos asociadas a la ejecucción del Cron: &lt;a href=&quot;https://www.drupal.org/project/ultimate_cron&quot; title=&quot;Ir a la web de Ultimate Cron&quot;&gt;&lt;b&gt;Ultimate Cron.&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muchas veces nuestros desarrollos en Drupal, requieren que ciertas funcionalidades se ejecuten con el &lt;strong&gt;Cron&lt;/strong&gt;. Pero en la mayoría de las ocasiones estas funcionalidades deben ejecutarse en un tiempo específico y no en el que tengamos asignado al Cron por defecto.&lt;/p&gt;
&lt;p&gt;Pues bien, el módulo  &lt;a href=&quot;https://www.drupal.org/project/ultimate_cron&quot; title=&quot;Ir a la web de Ultimate Cron&quot;&gt;&lt;b&gt;Ultimate Cron&lt;/b&gt;&lt;/a&gt; nos permite configurar y planificar las tareas que se ejecutan con el cron, permitiéndonos tener varios hilos de cron.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/cron1.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;El módulo nos ofrece varias configuraciones como pueden ser: logs, lanzar manualmente hilos, planificadores de tareas, etc&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/cron2.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;Rercordad, que con el &lt;strong&gt;hook cron&lt;/strong&gt;, podemos crearnos una tarea cron determinada, con la funcionalidad que deseemos:&lt;/p&gt;
&lt;pre&gt;
&lt;code  class=&quot;php&quot;&gt;
/**
 * Implements hook_cron().
 */
function mi_modulo_cron()
{
/*Nuestro código personalizado aquí*/
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Con el código anterior, crearemos una tarea que se ejecutará con el Cron. Y con el módulo &lt;strong&gt;Ultimate Cron&lt;/strong&gt; podremos planificar esta tarea por separado sin depender de la configuración por defecto del Cron de Drupal.&lt;/p&gt;

&lt;p&gt;Módulo sencillo y util, al cual seguro que sacaremos un gran partido.&lt;/p&gt;

&lt;p&gt;Drupal y Rock and Roll.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Sat, 26 Mar 2016 18:09:00 +0100</pubDate>
        </item>
                <item>
            <title>Tu sitio web optimizado para dispositivos móviles</title>
            <link>https://vabadus.es/blog/tu-sitio-web-optimizado-para-dispositivos-moviles</link>
            <guid isPermaLink="true">https://vabadus.es/blog/tu-sitio-web-optimizado-para-dispositivos-moviles</guid>
                        <category>SEO</category>
                        <category>Google</category>
                        <category>Posicionamiento</category>
                        <category>Dispositivos móviles</category>
                        <category>Diseño adaptable</category>
                        <description>&lt;p&gt;Hace algún tiempo publicábamos el artículo &lt;a href=&quot;//vabadus.es/blog/contar-con-una-web-adaptable-o-responsive-es-muy-importante-para-google&quot; title=&quot;Leer artículo&quot;&gt;Contar con una web adaptable o responsive es muy importante para Google&lt;/a&gt; en el que nos hacíamos eco de los cambios que el buscador empezaba a aplicar en sus algoritmos para dar mayor importancia a los sitios web que estuvieran adaptados a dispositivos móviles.&lt;/p&gt;
&lt;p&gt;En este sentido, Google continúa trabajando para hacer la web más amigable a móviles como se puede leer en su artículo &lt;a href=&quot;https://webmasters.googleblog.com/2016/03/continuing-to-make-web-more-mobile.html&quot; title=&quot;Leer artículo&quot;&gt;Continuing to make the web more mobile friendly&lt;/a&gt; publicado en el blog oficial Webmaster Central Blog, donde avisan de nuevas actualizaciones en sus algoritmos de búsqueda previstas para el mes de mayo, buscando ofrecer a los usuarios más páginas relevantes y mobile-friendly, es decir, optimizadas a dispositivos móviles.&lt;/p&gt;
&lt;p&gt;Aquellos sitios web que ya están adaptados a dispositivos móviles no se verán afectados por esta actualización anunciada para el mes de mayo, pero sí afectará al posicionamiento de todas aquellas que no lo estén.&lt;/p&gt;
&lt;p&gt;Desde Vabadus podemos ayudarte a diseñar y adaptar tu sitio web para usuarios que acceden desde dispositivos móviles, realizando las pruebas y ajustes necesarios para que tu portal opere bien en móviles, implementando además prácticas recomendadas de SEO para móviles.&lt;/p&gt;
&lt;p&gt;En Vabadus desarrollamos tus ideas, las adaptamos a internet y a cualquier dispositivo. &lt;a href=&quot;/contacto&quot; title=&quot;Ir al formulario de contacto&quot;&gt;&lt;b&gt;Contacta con nosotros&lt;/b&gt;&lt;/a&gt;. Estaremos encantados de hablar.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Fri, 18 Mar 2016 13:59:00 +0100</pubDate>
        </item>
                <item>
            <title>10 módulos imprescindibles para el SEO de nuestro portal Drupal</title>
            <link>https://vabadus.es/blog/10-modulos-imprescindibles-para-el-seo-de-nuestro-portal-drupal</link>
            <guid isPermaLink="true">https://vabadus.es/blog/10-modulos-imprescindibles-para-el-seo-de-nuestro-portal-drupal</guid>
                        <category>Drupal</category>
                        <category>Módulos</category>
                        <category>SEO</category>
                        <description>&lt;p&gt;Buenas drupaleros,&lt;/p&gt;

&lt;p&gt;hoy vamos a presentaros una serie de módulos imprescindibles para el &lt;strong&gt;SEO&lt;/strong&gt; de todo portal &lt;strong&gt;Drupal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ya sabéis que los clientes, cada vez más, desean enfatizar en el SEO de su nueva web. Como no podía ser de otra manera, existen una serie de módulos contribuidos por la comunidad Drupal, que nos harán la vida más sencilla a la hora de realizar esta tarea.&lt;/p&gt;

&lt;p&gt;Puede ser que la mayoría de los módulos los conozcáis, pero siempre viene bien recordarlos o tenerlos en un post agrupados.&lt;/p&gt;
&lt;ul&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/pathauto&quot; title=&quot;ir al módulo Pathauto&quot;&gt;Pathauto&lt;/a&gt; - Empecemos por un módulo más que imprescindible. El archiconocido Pathauto. De sobra sabéis que las URL deben ser limpias, amigables y deben seguir un patrón. Sencilla instalación y sencillo uso. &lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/page_title&quot; title=&quot;ir al módulo Page Title&quot;&gt;Page Title&lt;/a&gt; - Sabéis que el título de la página es muy importante para el SEO. Por defecto en Drupal, el título es el título del nodo en cuestión. En ocasiones podemos considerar que esto no sea así. Este módulo nos permite personalizar el título de cada página o utilizar patrones para ello.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/metatag&quot; title=&quot;ir al módulo Metatag&quot;&gt;Metatag&lt;/a&gt; - Imprescindible para poder asignar metatag por cada nodo. Como sabéis Drupal por defecto no permite hacerlo. Palabras claves, descripción etc serán personalizables por este módulo.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/seo_checklist&quot; title=&quot;ir al módulo SEO Checklist&quot;&gt;SEO Checklist&lt;/a&gt; - Para los que tienen mala memoria. Este módulo proporciona un simple Checklist sobre acciones SEO, para no pasarnos nada por alto. Muy útil. &lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/seotools&quot; title=&quot;ir al módulo Drupal SEO Tools&quot;&gt;Drupal SEO Tools&lt;/a&gt; - Para los más “vagos”, el “todo en uno”. Este módulo proporciona un conjunto de acciones y herramientas que abarcan un gran abanico de funcionalidades para el SEO.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/search404&quot; title=&quot;ir al módulo Search 404&quot;&gt;Search 404&lt;/a&gt; - Este módulo nos servirá para personalizar la página de 404, reduciendo así la tasa de abandono de nuestra web por no encontrar un contenido buscado. Sencillo de utilizar y muy útil.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/xmlsitemap&quot; title=&quot;ir al módulo Xml sitemap&quot;&gt;Xml sitemap&lt;/a&gt; - Otro de los módulos imprescindibles. Ya conocéis que un buen sitemap del portal es importantísimo para el robot de los buscadores. Este módulo te permite configurar, dicho sitemap y personalizar la importancia o prioridad del contenido que aparece en el mismo.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/taxonomy_title&quot; title=&quot;ir al módulo Taxonomy Title&quot;&gt;Taxonomy Title&lt;/a&gt; - Este módulo nos permite algo tan importante como personalizar el title de la páginas de taxonomías.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/menu_attributes&quot; title=&quot;ir al módulo Menu Attributes&quot;&gt;Menu Attributes&lt;/a&gt; - Muy interesante para poder editar los atributos de los menús. Podemos utilizar un “nofollow” personalizado.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.drupal.org/project/google_analytics&quot; title=&quot;ir al módulo Google Analytics&quot;&gt;Google Analytics&lt;/a&gt; - De sobra conocido e imprescindible&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Espero que os sea útil y que los tengáis en cuenta a la hora de poner en producción vuestra nueva web.&lt;/p&gt;

&lt;p&gt;Drupal y rock and roll&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Wed, 09 Mar 2016 11:51:00 +0100</pubDate>
        </item>
                <item>
            <title>Nuevo proyecto Drupal Commerce: Tyzana.com</title>
            <link>https://vabadus.es/blog/nuevo-proyecto-drupal-commerce-tyzana-com</link>
            <guid isPermaLink="true">https://vabadus.es/blog/nuevo-proyecto-drupal-commerce-tyzana-com</guid>
                        <category>Vabadus</category>
                        <category>Drupal</category>
                        <category>Comercio electrónico</category>
                        <description>&lt;p&gt;Hoy os presentamos el último proyecto en el que hemos estado trabajando: &lt;a href=&quot;http://www.tyzana.com&quot; title=&quot;Ir a la web de Tyzana&quot;&gt;&lt;b&gt;Tyzana.com&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
Tyzana.com es una tienda online desarrollada con &lt;strong&gt;Drupal Commerce&lt;/strong&gt;.
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/tyzana-home.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;Tyzana es una tienda de moda con estilo casual y elegante, donde se apuesta por diseños españoles. En el portal podemos encontrar vestidos, chaquetas, complementos y un largo etc de productos que seguro que os encantarán.&lt;/p&gt;

&lt;p&gt;El portal desarrollado, muestra los contenidos de una sencilla e intuitiva. La tienda tiene un diseño &lt;strong&gt;adaptivo y flexible (responsive)&lt;/strong&gt;, lo que permite una correcta visualización en dispositivos móviles.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/tyzana-vestidos.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;La tienda online, permite a los administradores de la web, la gestión de una forma sencilla de toda clase de productos, pedidos, tallas, colores, etc. También integra la gestión de descuentos, cupones de descuentos, promociones, mailing, pasarelas de pago, etc.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/tyzana-vestido.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;En definitiva, un completo portal desarrollado en &lt;strong&gt;Drupal Commerce&lt;/strong&gt;, que cubre todas las necesidades expuestas por nuestro cliente.&lt;/p&gt;

&lt;p&gt;Puedes ver otros de nuestros desarrollos en la sección de &lt;a href=&quot;http://vabadus.es/trabajos&quot; title=&quot;ir a la web de Vabadus sección trabajos&quot;&gt;trabajos&lt;/a&gt;&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Mon, 25 Jan 2016 11:55:00 +0100</pubDate>
        </item>
                <item>
            <title>Motor de reservas online para hoteles con Symfony2 en Hostal Argentina</title>
            <link>https://vabadus.es/blog/motor-de-reservas-online-para-hoteles-con-symfony2-en-hostal-argentina</link>
            <guid isPermaLink="true">https://vabadus.es/blog/motor-de-reservas-online-para-hoteles-con-symfony2-en-hostal-argentina</guid>
                        <category>Vabadus</category>
                        <category>Symfony</category>
                        <category>Comercio electrónico</category>
                        <description>&lt;p&gt;Estos últimos días hemos terminado de implantar nuestro motor de reservas para hoteles desarrollado con &lt;strong&gt;Symfony&lt;/strong&gt; en el &lt;a href=&quot;http://www.hostalargentina.net&quot; title=&quot;Ir a la web de Hostal Argentina&quot;&gt;&lt;b&gt;Hostal Argentina&lt;/b&gt;&lt;/a&gt; de Cáceres.&lt;/p&gt;
&lt;p&gt;Se trata de una completa plataforma de gestión de reservas hoteleras en entorno web, intuitiva, fácil de usar, potente y económica, donde cualquier establecimiento hotelero, sea del tamaño que sea, puede gestionar la disponibilidad de sus habitaciones, así como las condiciones bajo las que se ofertan. Además, está desarrollada con Symfony2, un framework PHP que permite construir aplicaciones web robustas, seguras y adaptables a entornos de negocio en cambio permanente.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/hostalargentina-motor-reservas.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;Tanto la aplicación de gestión como el sitio web público que hemos desarrollado para Hostal Argentina, cuentan con un diseño adaptable a cualquier dispositivo desde el que se acceda, permitiendo de esta forma, tanto gestionar sus habitaciones el propio hotel, como reservarlas por parte de los clientes, desde cualquier lugar y dispositivo conectado a internet.&lt;/p&gt;
&lt;p&gt;Si gestionas un negocio hotelero y deseas mejorar tu presencia en internet, ofertando tus habitaciones de forma independiente sin los costes extra que supone hacerlo a través de plataformas de terceros, &lt;a href=&quot;/contacto&quot; title=&quot;Ir al formulario de contacto&quot;&gt;contacta con nosotros&lt;/a&gt;. Estaremos encantados de hablar. &lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Wed, 18 Nov 2015 13:45:00 +0100</pubDate>
        </item>
                <item>
            <title>Exportar a Excel con Symfony2</title>
            <link>https://vabadus.es/blog/exportar-a-excel-con-symfony2</link>
            <guid isPermaLink="true">https://vabadus.es/blog/exportar-a-excel-con-symfony2</guid>
                        <category>Symfony</category>
                        <category>Excel</category>
                        <description>&lt;p&gt;Hace ya algún tiempo publicábamos un artículo en el que veíamos una forma de &lt;a href=&quot;https://vabadus.es/blog/generar-documento-pdf-con-symfony2&quot; title=&quot;ir al artículo Generar documento PDF con Symfony2&quot;&gt;generar documentos PDF con &lt;strong&gt;Symfony2&lt;/strong&gt;&lt;/a&gt;. En éste vamos a ver cómo exportar a Excel en nuestros proyectos Symfony.&lt;/p&gt;
&lt;p&gt;Para realizar la exportación de datos en formato Excel usaremos el bundle &lt;a href=&quot;https://github.com/liuggio/ExcelBundle&quot;&gt;liuggio/ExcelBundle&lt;/a&gt; que integra la librería &lt;a href=&quot;https://github.com/PHPOffice/PHPExcel&quot;&gt;PHPExcel&lt;/a&gt; en Symfony2. Para instalarlo en nuestro proyecto Symfony, lo añadimos a &lt;i&gt;composer.json&lt;/i&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$composer require liuggio/excelbundle
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;y registramos el bundle en AppKernel.php:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$bundles = array(
    // ...
    new Liuggio\ExcelBundle\LiuggioExcelBundle(),
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Con esto, ya podemos empezar a generar documentos Excel en nuestro proyecto Symfony. Vamos a verlo con un ejemplo, crearemos una acción &lt;code&gt;exportarExcelAction&lt;/code&gt; que podremos enlazar desde cualquier punto de nuestra aplicación Symfony para exportar el listado de elementos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

class EjemploController extends Controller
{
    // ...

    /**
     * @Route(&quot;/exportar/excel&quot;, name=&quot;ejemplo_exportar_excel&quot;)
     */
    public function exportarExcelAction(Request $request)
    {
        $em = $this-&gt;getDoctrine()-&gt;getManager();

        // recuperamos los elementos de base de datos que queremos exportar
        $query = $em-&gt;getRepository(&#039;AppBundle:Ejemplo&#039;)
            -&gt;createQueryBuilder(&#039;e&#039;)
            -&gt;getQuery();

        $result = $filterQuery-&gt;getResult();

        // solicitamos el servicio &#039;phpexcel&#039; y creamos el objeto vacío...
        $phpExcelObject = $this-&gt;get(&#039;phpexcel&#039;)-&gt;createPHPExcelObject();

        // ...y le asignamos una serie de propiedades
        $phpExcelObject-&gt;getProperties()
            -&gt;setCreator(&quot;Vabadus&quot;)
            -&gt;setLastModifiedBy(&quot;Vabadus&quot;)
            -&gt;setTitle(&quot;Ejemplo de exportación&quot;)
            -&gt;setSubject(&quot;Ejemplo&quot;)
            -&gt;setDescription(&quot;Listado de ejemplo.&quot;)
            -&gt;setKeywords(&quot;vabadus exportar excel ejemplo&quot;);

        // establecemos como hoja activa la primera, y le asignamos un título
        $phpExcelObject-&gt;setActiveSheetIndex(0);
        $phpExcelObject-&gt;getActiveSheet()-&gt;setTitle(&#039;Ejemplo de exportación&#039;);
        
        // escribimos en distintas celdas del documento el título de los campos que vamos a exportar
        $phpExcelObject-&gt;setActiveSheetIndex(0)
            -&gt;setCellValue(&#039;B2&#039;, &#039;Campo 1&#039;)
            -&gt;setCellValue(&#039;C2&#039;, &#039;Campo 2&#039;)
            -&gt;setCellValue(&#039;D2&#039;, &#039;Campo 3&#039;)
            -&gt;setCellValue(&#039;E2&#039;, &#039;Campo 4&#039;);

        // fijamos un ancho a las distintas columnas
        $phpExcelObject-&gt;setActiveSheetIndex(0)
            -&gt;getColumnDimension(&#039;B&#039;)
            -&gt;setWidth(30);
        $phpExcelObject-&gt;setActiveSheetIndex(0)
            -&gt;getColumnDimension(&#039;C&#039;)
            -&gt;setWidth(25);
        $phpExcelObject-&gt;setActiveSheetIndex(0)
            -&gt;getColumnDimension(&#039;D&#039;)
            -&gt;setWidth(15);
        $phpExcelObject-&gt;setActiveSheetIndex(0)
            -&gt;getColumnDimension(&#039;E&#039;)
            -&gt;setWidth(20);

        // recorremos los registros obtenidos de la consulta a base de datos escribiéndolos en las celdas correspondientes
        $row = 3;
        foreach ($result as $item) {
            $phpExcelObject-&gt;setActiveSheetIndex(0)
                -&gt;setCellValue(&#039;B&#039;.$row, $item-&gt;getCampo1())
                -&gt;setCellValue(&#039;C&#039;.$row, $item-&gt;getCampo2())
                -&gt;setCellValue(&#039;D&#039;.$row, $item-&gt;getCampo3())
                -&gt;setCellValue(&#039;E&#039;.$row, $item-&gt;getCampo4());

            $row++;
        }

        // se crea el writer
        $writer = $this-&gt;get(&#039;phpexcel&#039;)-&gt;createWriter($phpExcelObject, &#039;Excel5&#039;);
        // se crea el response
        $response = $this-&gt;get(&#039;phpexcel&#039;)-&gt;createStreamedResponse($writer);
        // y por último se añaden las cabeceras
        $dispositionHeader = $response-&gt;headers-&gt;makeDisposition(
            ResponseHeaderBag::DISPOSITION_ATTACHMENT,
            &#039;ejemplo.xls&#039;
        );
        $response-&gt;headers-&gt;set(&#039;Content-Type&#039;, &#039;text/vnd.ms-excel; charset=utf-8&#039;);
        $response-&gt;headers-&gt;set(&#039;Pragma&#039;, &#039;public&#039;);
        $response-&gt;headers-&gt;set(&#039;Cache-Control&#039;, &#039;maxage=1&#039;);
        $response-&gt;headers-&gt;set(&#039;Content-Disposition&#039;, $dispositionHeader);

        return $response;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hemos comentado el código para entender mejor cada acción que se lleva a cabo. En el ejemplo, hay una pequeña muestra de opciones que tenemos disponibles gracias a la librería PHPExcel, pero lógicamente hay muchas más. Recomendamos echar un vistazo el &lt;a href=&quot;https://github.com/PHPOffice/PHPExcel/tree/develop/Examples&quot;&gt;repositorio oficial de PHPExcel&lt;/a&gt; donde pueden encontrarse muchos más ejemplos de uso.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Thu, 29 Oct 2015 08:26:00 +0100</pubDate>
        </item>
                <item>
            <title>Igamudi, plataforma de patrocinio musical en Symfony2</title>
            <link>https://vabadus.es/blog/igamudi-plataforma-de-patrocinio-musical-en-symfony2</link>
            <guid isPermaLink="true">https://vabadus.es/blog/igamudi-plataforma-de-patrocinio-musical-en-symfony2</guid>
                        <category>Vabadus</category>
                        <category>Symfony</category>
                        <description>&lt;p&gt;En estos último meses en Vabadus hemos estado trabajando en la nueva evolución de &lt;a href=&quot;http://www.igamudi.com&quot; title=&quot;ir a la web de Igamudi&quot;&gt;&lt;strong&gt;Igamudi&lt;/strong&gt;&lt;/a&gt; que ya está en marcha, un sistema de patrocinios que hemos desarrollado con &lt;strong&gt;Symfony2&lt;/strong&gt;, donde se ponen en contacto artistas musicales y mecenas que quieran patrocinar y disfrutar de sus obras.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vabadus.es/uploads/blog/igamudi-symfony.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hace ya cerca de tres años que empezó la colaboración de Vabadus con el proyecto Igamudi, que nació como una red social musical desarrollada en Drupal, sirviendo de punto de encuentro de artistas y profesionales musicales, productores, discográficas, etc. En una segunda etapa la red social musical evolucionó a &lt;a href=&quot;https://vabadus.es/blog/proyecto-drupal-rediseno-de-igamudi-y-nueva-plataforma-crowdfunding&quot; title=&quot;ir al artículo Proyecto Drupal: Rediseño de Igamudi y nueva plataforma crowdfunding&quot;&gt;plataforma de crowdfunding, que también desarrollamos en Drupal&lt;/a&gt;, sin perder en ningún momento de vista el objetivo que desde los inicios ha marcado a Igamudi, que no es otro que ayudar en la promoción de artistas y profesionales del sector musical. Y ahora, esta última vuelta de tuerca a la idea original, transformándose en plataforma de patrocinio musical, que hemos desarrollado con Symfony2.&lt;/p&gt;
&lt;p&gt;Desde Vabadus os invitamos a que visitéis Igamudi, disfrutéis de la música y ayudéis con vuestros patrocinios a los artistas y creadores que comparten sus contenidos musicales en la plataforma.&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Thu, 22 Oct 2015 09:47:00 +0200</pubDate>
        </item>
                <item>
            <title>Escapar html del módulo FullCalendar para Drupal 7</title>
            <link>https://vabadus.es/blog/escapar-html-del-modulo-fullcalendar-para-drupal-7</link>
            <guid isPermaLink="true">https://vabadus.es/blog/escapar-html-del-modulo-fullcalendar-para-drupal-7</guid>
                        <category>Drupal</category>
                        <category>Javascript</category>
                        <category>Módulos</category>
                        <description>&lt;p&gt;Buenas drupaleros,&lt;/p&gt;
&lt;p&gt;seguro que muchos de vosotros ha utilizado alguna vez el módulo &lt;a href=&quot;  https://www.drupal.org/project/fullcalendar&quot; title=&quot;FullCalendar&quot;&gt;&lt;strong&gt;FullCalendar&lt;/strong&gt;&lt;/a&gt;. Como sabéis, es un módulo que proporciona un calendario para mostrar eventos, tiene vistas de día, mes, año, etc.&lt;/p&gt;
&lt;p&gt;Este módulo se pensó y discutió para mostrar sólo texto, es decir, se llegó a la conclusión de implementear funciones de &lt;strong&gt;escapado de html&lt;/strong&gt;, con lo cual no se pueden mostrar etiquetas html, preservando así la apariencia del calendario. Totalmente razonable si se piensa bien.&lt;/p&gt;
&lt;p&gt;El problema viene, cuando el cliente quiere que no sea así. Es decir, se empeñan en mostrar textos en negrita, imágenes, etc. Esto realmente es un problema.&lt;/p&gt;
&lt;p&gt;Como sabéis el módulo &lt;strong&gt;FullCalendar&lt;/strong&gt;, tiene su propia librería, que debemos incluir en /sites/all/libreries/ . Pues bien, lo que proponen algunas personas es modificar directamente el módulo FullCalendar, concretamente el fichero &lt;i&gt;fullcalendar.fullcalendar.js&lt;/i&gt; y añadir un &lt;i&gt;eventRender&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code  class=&quot;php&quot;&gt;
eventRender: function (event, element) {
    element.find(&#039;.fc-event-title&#039;).html(event.title);
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Esto en Drupal no funciona.  Además como bien es sabido por todos, no debemos modificar módulos contribuidos.&lt;/p&gt;
&lt;p&gt;Lo más correcto es hacerse un módulo que contenga un plugin para js. 
Creamos como siempre nuestro módulo:&lt;/p&gt;
&lt;p&gt;Nuestro fichero &lt;i&gt;vabadus.info&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code  class=&quot;php&quot;&gt;
name = Modificacion de fullcalendar
description = &quot;Modificacion de fullcalendar&quot;
core = 7.x
version = &quot;7.x-0.1&quot;
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Nuestro fichero &lt;i&gt;vabadus.module&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code  class=&quot;php&quot;&gt;

/**
 * Implements hook_fullcalendar_api().
 */
function vabadus_fullcalendar_api() {
  return array(
    &#039;api&#039; =&gt; fullcalendar_api_version(),
  );
}

/**
 * Implements hook_fullcalendar_options_info().
 */
function vabadus_fullcalendar_options_info() {
  return array(
    &#039;vabadus&#039; =&gt; array(
      &#039;js&#039; =&gt; TRUE,
      &#039;no_fieldset&#039; =&gt; TRUE,
      &#039;weight&#039; =&gt; 5,
    ),
  );
}

&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Y por último creamos una carpeta js dentro de nuestro módulo. Con el fichero &lt;i&gt;vabadus/js/vabadus.fullcalendar.js&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code  class=&quot;php&quot;&gt;
(function($) {
Drupal.fullcalendar.plugins.vabadus = {
  options: function (fullcalendar, settings) {
    return {
      eventRender: function(event, element, view) {
        var dom_id = event.dom_id;
        var entity_type = event.entity_type;
        var entity_id = event.eid;
        var index = event.index;
        var entry = $(dom_id).find(&quot;.fullcalendar-event &gt; .fullcalendar-instance &gt; a[eid=&#039;&quot; + entity_id + &quot;&#039;][entity_type=&#039;&quot; + entity_type + &quot;&#039;][index=&#039;&quot; + index + &quot;&#039;]&quot;);
        var title = entry.parent(&quot;.fullcalendar-instance&quot;).prev(&#039;.title&#039;).html();


        element.find(&#039;.fc-event-title&#039;).html(title);
      }
    };
  }
};
}(jQuery));
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Y es ahí, donde utilizamos el famoso &lt;strong&gt;eventRender&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Con esto ya permitimos utilizar html. En la administración de vista, si queremos ser más versátiles aún, podemos redefinir la salida de algún campo y “jugar” con él.&lt;/p&gt;

&lt;p&gt;Espero que os sea útil.&lt;/p&gt;

&lt;p&gt;Drupal y rock and roll&lt;/p&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Fri, 16 Oct 2015 17:06:00 +0200</pubDate>
        </item>
                <item>
            <title>Sobreescribir directorio web por defecto de Symfony</title>
            <link>https://vabadus.es/blog/sobreescribir-directorio-web-por-defecto-de-symfony</link>
            <guid isPermaLink="true">https://vabadus.es/blog/sobreescribir-directorio-web-por-defecto-de-symfony</guid>
                        <category>Symfony</category>
                        <description>&lt;p&gt;Vamos a ver un mini tutorial que seguro que puede resultar útil en el momento de desplegar nuestros proyectos &lt;strong&gt;Symfony2&lt;/strong&gt; en servidores compartidos en los que es posible que el nombre del directorio público sea &lt;i&gt;www&lt;/i&gt;, &lt;i&gt;httpdocs&lt;/i&gt; o &lt;i&gt;public_html&lt;/i&gt;, en lugar de &lt;i&gt;web&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Una primera opción puede ser subir todo el código de la aplicación Symfony a una carpeta en la raíz del servidor y reemplazar su directorio público con un enlace simbólico a la carpeta &lt;i&gt;web&lt;/i&gt; del proyecto Symfony. Es decir, suponiendo que subimos todo el código a una carpeta &lt;i&gt;app_symfony&lt;/i&gt; y que el directorio público de nuestro servidor es &lt;i&gt;www&lt;/i&gt;, eliminaríamos primero esa carpeta &lt;i&gt;www&lt;/i&gt; y lanzaríamos el siguiente comando:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$ ln -s app_symfony/web www
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El problema que encontramos al hacerlo de este modo, es que nuestro servidor compartido puede no contar con el comando &lt;i&gt;ln&lt;/i&gt; necesario para generar el enlace simbólico. En este caso, podemos optar por subir todo el código de la aplicación Symfony a la raíz del servidor, renombrar la carpeta &lt;i&gt;web&lt;/i&gt; por el nombre que tenga la del servidor compartido (ya sea &lt;i&gt;www&lt;/i&gt;, &lt;i&gt;httpdocs&lt;/i&gt; o &lt;i&gt;public_html&lt;/i&gt;) y modificar la entrada &lt;code&gt;&quot;symfony-web-dir&quot;&lt;/code&gt; en el composer.json del proyecto, dejándolo de esta manera (suponiendo que el directorio público de nuestro servidor es &lt;i&gt;www&lt;/i&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;json&quot;&gt;
{
    ...
    &quot;extra&quot;: {
        ...
        &quot;symfony-web-dir&quot;: &quot;www&quot;,
        ...
    }
}
&lt;/code&gt;&lt;/pre&gt;</description>
                        <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vabadus</dc:creator>
            <pubDate>Tue, 13 Oct 2015 12:54:00 +0200</pubDate>
        </item>
            </channel>
</rss>