Contributing as a Company to Drupal and Its Community: SeeD EM's Commitment

At SeeD EM, as Drupal experts and a silver partner of the Drupal Association, we understand that our company’s growth is intrinsically linked to the development and evolution of the Drupal community. For this reason, we have integrated active contribution to this ecosystem as a fundamental part of our internal plan and project. Every Friday afternoon, our production team dedicates time to various tasks that strengthen the Drupal community, covering:

  • Participation in events and talks: Our experts share their knowledge and experiences at events and workshops within the Drupal ecosystem, generating impact both locally and internationally.
  • Core and module translations: To make Drupal accessible to a global audience, our team dedicates itself to translating Drupal core and modules into various languages, helping the platform grow in different markets.
  • Resolving issues in modules: As part of SeeD EM's commitment, we help resolve errors and issues in contributed modules, ensuring Drupal remains a stable and reliable platform for its users.
  • Custom development in Drupal: Our team has worked on over seven modules currently in development and soon to be contributed to the community, designed to provide new features and solutions that meet the current needs of users.

This effort has fostered a space of learning and collaboration within SeeD EM, where our developers and experts work together to solve complex problems, develop new modules, and share knowledge. This exchange has been fundamental to our growth both individually and organizationally.

The Importance of Contributing to Drupal

Contributing to Drupal is more than just writing code; it’s being part of a global ecosystem that has led to over 52,000 modules enhancing the platform's flexibility and functionality. The Drupal community is one of the most active and dynamic in the open-source world, and every contribution, no matter how small, helps improve the platform for everyone.

One of the recent advancements we can highlight is the use of an automated bot that helps solve compatibility issues between modules, facilitating and speeding up the review process, allowing developers to focus on key improvements. This type of innovation is only possible thanks to the ongoing commitment of developers and companies like SeeD EM, who dedicate time and resources to contributing to the project.

The Impact for SeeD EM and Our Team

Our contribution to Drupal not only strengthens the community but also directly impacts SeeD EM. The custom development we carry out in Drupal allows us to stay at the forefront of trends and technological improvements, providing our team with constant growth opportunities. Contribution Fridays have become a valuable space for collaboration, innovation, and learning, where the team explores new ideas, solves problems, and develops solutions that benefit both our projects and the Drupal community in general. In order to share knowledge, we also participate in and contribute to community events, sharing updates, tips, and best practices for using Drupal. Additionally, we have sought to reach academic communities to encourage students to use Drupal in their classroom projects, thus fostering a next generation of Drupal developers.

We remain committed to actively contributing to Drupal because we believe that only through collaboration and contribution can we foster a stronger and more dynamic open-source ecosystem.

SeeD EM is proud to be part of this movement and to be recognized as a silver partner of the Drupal Association, working hand-in-hand with the community to continue growing together. The future of Drupal is built by everyone!

Contribuir como empresa a Drupal y su comunidad: El compromiso de SeeD EM

En SeeD EM, como expertos en Drupal y partner silver de la asociación Drupal, entendemos que el crecimiento de nuestra empresa está intrínsecamente ligado al desarrollo y evolución de la comunidad de Drupal. Por esta razón, hemos integrado como parte fundamental de nuestro plan y proyecto interno la contribución activa a este ecosistema. Todos los viernes por la tarde, nuestro equipo del área de producción dedica tiempo a diferentes tareas que fortalecen la comunidad de Drupal, abarcando:

  • Participación en eventos y charlas: Nuestros expertos comparten sus conocimientos y experiencias en eventos y talleres dentro del ecosistema Drupal, generando un impacto tanto a nivel local como internacional.
  • Traducciones de core y módulos: Con el objetivo de hacer Drupal accesible a una audiencia global, nuestro equipo se dedica a traducir el núcleo y módulos de Drupal a varios idiomas, contribuyendo al crecimiento de la plataforma en diferentes mercados.
  • Solución de incidentes en módulos: Parte del compromiso de SeeD EM es ayudar a resolver errores e incidentes en módulos contribuidos, garantizando que Drupal continúe siendo una plataforma estable y confiable para sus usuarios.
  • Desarrollo personalizado en Drupal: Nuestro equipo ha trabajado en más de siete módulos que están en desarrollo y pronto serán contribuidos a la comunidad, diseñados para ofrecer nuevas funcionalidades y soluciones que responden a las necesidades actuales de los usuarios.

Este esfuerzo ha fomentado un espacio de aprendizaje y colaboración dentro de SeeD EM, donde nuestros desarrolladores y expertos trabajan en conjunto para solucionar problemas complejos, desarrollar nuevos módulos y compartir conocimientos. Este intercambio ha sido fundamental para nuestro crecimiento tanto a nivel individual como organizacional.

La importancia de contribuir a Drupal

Contribuir a Drupal es más que simplemente escribir código; es ser parte de un ecosistema global que ha dado lugar a más de 52,000 módulos que potencian la flexibilidad y funcionalidad de la plataforma. La comunidad Drupal es una de las más activas y dinámicas en el ámbito del software libre, y cada contribución, por pequeña que sea, ayuda a mejorar la plataforma para todos.

Uno de los avances recientes que podemos identificar es el uso de un bot automatizado que ayuda a solucionar problemas de compatibilidad entre módulos, lo que facilita y acelera el proceso de revisión, permitiendo que los desarrolladores se concentren en mejoras clave. Este tipo de innovación es solo posible gracias al compromiso continuo de los desarrolladores y empresas como SeeD EM, que dedican tiempo y recursos a contribuir al proyecto.

El impacto para SeeD EM y nuestro equipo

Nuestra contribución a Drupal no solo fortalece a la comunidad, sino que también impacta directamente en SeeD EM. El desarrollo personalizado que realizamos en Drupal nos permite estar a la vanguardia de las tendencias y mejoras tecnológicas, brindando a nuestro equipo oportunidades constantes de crecimiento. Los viernes de contribución se han convertido en un espacio valioso para la colaboración, innovación y aprendizaje, donde el equipo explora nuevas ideas, resuelve problemas y desarrolla soluciones que benefician tanto a nuestros proyectos como a la comunidad de Drupal en general. Con el objetivo de aportar conocimiento, también participamos y contribuimos en eventos de la comunidad, compartiendo novedades, consejos y mejores prácticas en el uso de Drupal. Además, hemos buscado llegar a comunidades académicas para fomentar en los estudiantes el uso de Drupal en sus proyectos de aula, impulsando así una próxima generación de desarrolladores de Drupal.

Seguiremos firmes en nuestro compromiso de contribuir activamente a Drupal, porque creemos que solo a través de la colaboración y la contribución es posible impulsar un ecosistema de software libre más fuerte y dinámico.

SeeD EM está orgulloso de formar parte de este movimiento y de ser reconocidos como partner silver de la asociación Drupal, trabajando de la mano con la comunidad para seguir creciendo juntos. ¡El futuro de Drupal se construye entre todos!

What is Drupal and why is it a leader in digital transformation?

Drupal has proven to be a key platform in digital transformation due to its flexibility, robustness, and customization capabilities. More than just a CMS, Drupal is a development framework that allows organizations to create both websites and advanced web applications, thanks to its modular architecture and extensive API. This makes it an ideal choice for complex projects that require specific and scalable solutions.

Why is Drupal a leader in digital transformation?

  • Extensibility and Customization: Drupal offers a highly flexible platform where functionalities can be added and modified through custom or existing modules. This capability allows the CMS to adapt to the specific needs of each project, from corporate portals to e-commerce platforms or government sites.

  • Global and Collaborative Community: With over 1.3 million members in its community, Drupal benefits from a global network that drives continuous innovation. The community not only constantly develops and improves the software but also offers active technical support, ensuring that the platform evolves and remains at the forefront of technology.

  • Security and Scalability: Drupal is known for its strong focus on security and its ability to handle complex and demanding environments, such as those of governments, large corporations, and transactional sites. This makes it a reliable choice for those who require a secure and high-performance platform.

  • Open Source and GNU License: As open-source software under the GNU General Public License, Drupal allows organizations to modify and adapt the platform without restrictions, fostering innovation and collaboration. This ensures that digital solutions are not limited by commercial licenses and promotes continuous and agile development.

  • Integration with External Systems: Drupal's ability to integrate with external systems, such as CRMs, Ad Servers, or authentication services (LDAP), makes it a comprehensive solution. This allows companies to manage multiple tools and services from a single platform, optimizing processes and reducing operational costs.

Use Cases and Key Benefits

Drupal is suitable for a wide range of applications: from simple content websites to complex portals with high volumes of traffic and transactions. Its modular architecture allows it to adapt to changing needs, making it ideal for extensive sites, such as government portals, or e-commerce platforms that require efficient content and transaction management.

Additionally, Drupal is known for its ability to optimize SEO strategies, ensuring that platforms built with this CMS are not only functional but also visible on search engines, which is crucial for brand positioning.

Drupal in Latin America: Impact and Expansion

In Latin America, Drupal has grown significantly, and SeeD EM is a key example of this growth. As a leading provider of Drupal solutions in the region, SeeD EM has worked with companies in Colombia, Peru, Mexico, Guatemala, Panama, Chile, and Ecuador, standing out for its experience and ability to handle complex projects. Its participation in events such as DrupalCon and Drupal Summit Latino, and its certification as a Silver "partner" by Drupal.org, demonstrate its commitment to the expansion and success of Drupal in Latin America.

¿Qué es Drupal y por qué es líder en transformación digital?

Drupal ha demostrado ser una plataforma clave en la transformación digital debido a su flexibilidad, robustez y capacidad de personalización. Más que un simple CMS, Drupal es un framework de desarrollo que permite a las organizaciones crear tanto sitios web como aplicaciones web avanzadas, gracias a su arquitectura modular y su extensa API. Esto lo convierte en una opción ideal para proyectos complejos que requieren soluciones específicas y escalables.

¿Por qué Drupal es líder en la transformación digital?

  • Extensibilidad y Personalización: Drupal ofrece una plataforma altamente flexible donde se pueden añadir y modificar funcionalidades mediante módulos personalizados o existentes. Esta capacidad permite adaptar el CMS a las necesidades específicas de cada proyecto, desde portales corporativos hasta plataformas de comercio electrónico o sitios gubernamentales.

  • Comunidad Global y Colaborativa: Con más de 1.3 millones de miembros en su comunidad, Drupal se beneficia de una red global que impulsa la innovación continua. La comunidad no solo desarrolla y mejora constantemente el software, sino que también ofrece soporte técnico activo, asegurando que la plataforma evolucione y se mantenga a la vanguardia de la tecnología.

  • Seguridad y Escalabilidad: Drupal es conocido por su sólido enfoque en la seguridad y su capacidad para manejar entornos complejos y exigentes, como los de gobiernos, grandes corporaciones y sitios transaccionales. Esto lo convierte en una opción confiable para aquellos que requieren una plataforma segura y de alto rendimiento.

  • Código Abierto y Licencia GNU: Como software de código abierto bajo la Licencia Pública General de GNU, Drupal permite a las organizaciones modificar y adaptar la plataforma sin restricciones, fomentando la innovación y la colaboración. Esto asegura que las soluciones digitales no estén limitadas por licencias comerciales y promueve un desarrollo continuo y ágil.

  • Integración con Sistemas Externos: La capacidad de Drupal para integrarse con sistemas externos, como CRMs, Ad Servers o servicios de autenticación (LDAP), lo convierte en una solución integral. Esto permite a las empresas gestionar múltiples herramientas y servicios desde una única plataforma, optimizando procesos y reduciendo costos operativos.

Casos de Uso y Beneficios Clave

Drupal es adecuado para una amplia gama de aplicaciones: desde simples sitios web de contenido hasta portales complejos con altos volúmenes de tráfico y transacciones. Su arquitectura modular le permite ajustarse a necesidades cambiantes, lo que lo hace ideal para sitios extensos, como los gubernamentales, o plataformas de comercio electrónico, que requieren una gestión eficiente de contenido y transacciones.

Además, Drupal es conocido por su capacidad para optimizar estrategias de SEO, asegurando que las plataformas construidas con este CMS no solo sean funcionales, sino también visibles en motores de búsqueda, lo que es crucial para el posicionamiento de marca.

Drupal en América Latina: Impacto y Expansión

En América Latina, Drupal ha crecido significativamente, y SeeD EM es un ejemplo clave de este crecimiento. Como proveedor líder de soluciones Drupal en la región, SeeD EM ha trabajado con empresas en Colombia, Perú, México, Guatemala, Panamá, Chile y Ecuador, destacándose por su experiencia y capacidad para manejar proyectos complejos. Su participación en eventos como DrupalCon y Drupal Summit Latino, y su certificación como "partner" Silver por Drupal.org, demuestran su compromiso con la expansión y el éxito de Drupal en América Latina.

Content Management with Multi Dates Picker in Drupal

When building a content-rich website, it’s often necessary to control when certain content appears based on specific dates or date ranges. Whether you're managing events, promotional content, or time-sensitive announcements, the ability to automate content display can save you time and effort.


That’s where the Multi Dates Picker module comes into play. This Drupal module offers an efficient way to manage content visibility based on customizable date settings. In this post, we'll explore how the module works, its key features, and how it can simplify content management for your Drupal site.

Why Use Multi Dates Picker?

The main advantage of using this module is the flexibility it offers. You can select multiple dates, set a range, or choose just one specific date for when your content will be displayed. Once configured, it automates the visibility of the content, ensuring it appears only when needed and disappears when no longer relevant, without requiring manual intervention.

Let’s break down the key features:

  1. Single Date Selection: Perfect for time-specific content, like event announcements or scheduled updates. If you select only one date, the content will appear exclusively on that day.
  2. Date Range Support: Useful for content that needs to be displayed over a set period, such as a limited-time offer or a multi-day event. When two dates are selected, the content will be visible starting from the first date until the second.
  3. Multiple Dates: For recurring events or specific dates where the content should be visible, you can select three or more dates, and the content will be displayed on each selected day

How to Implement Multi Dates Picker

Implementing this module in your Drupal project is straightforward. Follow these steps to get started:

  • Select Your Content Type: Choose the content type where you want to control visibility with the Multi Dates Picker.
  • Add the Multi Dates Picker: In the field settings, add the field to your chosen content type. This will allow you to set the specific dates when editing content.
  • Configure the Dates: When creating or editing content, go to the advanced settings and select the desired dates for the content to be shown.

And that’s it! Once configured, the module takes care of showing or hiding the content according to the dates you selected.

Use Cases for Multi Dates Picker

The flexibility of this module opens the door to numerous use cases, including:

  • Event Management: Schedule event announcements to appear leading up to the event and disappear once it’s over.
  • Holiday or Seasonal Content: Display promotional banners or seasonal messages during specific dates and remove them after the holiday season.
  • Recurring Posts: Automate the publishing of recurring posts that should only appear on specific days, such as weekly offers or reminders.
  • News Updates: Set a news article to be visible on launch day and hide it after a certain date to keep your content fresh.

Final Thoughts

The Multi Dates Picker is a powerful module that adds significant flexibility to content scheduling in Drupal. By automating content visibility based on selected dates, it allows for better control over how your audience engages with time-sensitive material, helping to streamline your content management workflow.

If you're managing events, promotions, or simply need a smarter way to handle date-specific content, this module is a must-try. It’s simple to use, but the impact on your site's efficiency is significant.

Do you have questions about setting it up, or do you have other modules you’d like to learn more about? Feel free to leave a comment below, and we’ll help you get started!

For more details, visit Multi Dates Picker. This module was developed by John Camilo Bautista Gutierrez at SeeD EM.

Gestión de Contenidos con Multi Dates Picker en Drupal

Cuando se construye un sitio web rico en contenido, a menudo es necesario controlar cuándo aparece cierto contenido en función de fechas específicas o rangos de fechas. Ya sea que estés gestionando eventos, contenido promocional o anuncios con tiempo limitado, la capacidad de automatizar la visualización del contenido puede ahorrarte tiempo y esfuerzo.

Ahí es donde entra en juego el módulo Multi Dates Picker. Este módulo de Drupal ofrece una manera eficiente de gestionar la visibilidad del contenido según configuraciones de fechas personalizables. En este artículo, exploraremos cómo funciona el módulo, sus características clave y cómo puede simplificar la gestión de contenidos en tu sitio Drupal.

¿Por Qué Usar Multi Dates Picker?

La principal ventaja de este módulo es la flexibilidad que ofrece. Puedes seleccionar varias fechas, configurar un rango o elegir una fecha específica para que tu contenido se muestre. Una vez configurado, automatiza la visibilidad del contenido, asegurando que se muestre solo cuando sea necesario y desaparezca cuando ya no sea relevante, sin necesidad de intervención manual.

Veamos sus características clave:

  • Selección de una sola fecha: Perfecto para contenido que debe mostrarse en un momento específico, como anuncios de eventos o actualizaciones programadas. Si seleccionas solo una fecha, el contenido aparecerá exclusivamente ese día.
  • Soporte para rangos de fechas: Ideal para contenido que necesita mostrarse durante un período específico, como ofertas por tiempo limitado o eventos de varios días. Al seleccionar dos fechas, el contenido será visible desde la primera hasta la segunda.
  • Múltiples fechas: Para eventos recurrentes o fechas específicas en las que el contenido debe mostrarse, puedes seleccionar tres o más fechas, y el contenido se mostrará en cada día seleccionado.

Cómo Implementar Multi Dates Picker

Implementar este módulo en tu proyecto de Drupal es sencillo. Sigue estos pasos para comenzar:

  1. Selecciona tu Tipo de Contenido: Elige el tipo de contenido en el que deseas controlar la visibilidad con el campo Multi Dates Picker.
  2. Añade el Campo Multi Dates Picker: En la configuración de campos, añade el campo a tu tipo de contenido seleccionado. Esto te permitirá establecer las fechas específicas al editar el contenido.
  3. Configura las Fechas: Al crear o editar contenido, ve a la configuración avanzada y selecciona las fechas deseadas para que se muestre el contenido.

¡Y eso es todo! Una vez configurado, el módulo se encargará de mostrar u ocultar el contenido según las fechas seleccionadas.

Casos de Uso para Multi Dates Picker

La flexibilidad de este módulo permite varios casos de uso, tales como:

  • Gestión de Eventos: Programa los anuncios de eventos para que se muestren antes del evento y desaparezcan una vez terminado.
  • Contenido de Temporada o Festivo: Muestra banners promocionales o mensajes festivos durante fechas específicas y elimínalos después de la temporada festiva.
  • Publicaciones Recurrentes: Automatiza la publicación de publicaciones recurrentes que deben aparecer en días específicos, como ofertas semanales o recordatorios.
  • Actualizaciones de Noticias: Configura un artículo de noticias para que sea visible en el día de lanzamiento y se oculte después de una fecha determinada, manteniendo el contenido fresco.

Reflexiones Finales

El Multi Dates Picker es un módulo poderoso que agrega flexibilidad significativa a la programación de contenido en Drupal. Al automatizar la visibilidad del contenido según las fechas seleccionadas, permite un mayor control sobre cómo tu audiencia interactúa con el material sensible al tiempo, ayudando a optimizar el flujo de trabajo de gestión de contenidos.

Si estás gestionando eventos, promociones o simplemente necesitas una forma más inteligente de manejar contenido con fechas específicas, este módulo es una opción que debes probar. Es fácil de usar, pero su impacto en la eficiencia de tu sitio es considerable.

¿Tienes preguntas sobre cómo configurarlo o sobre otros módulos que te gustaría conocer? ¡Déjanos un comentario y te ayudaremos a comenzar!

Para más detalles, visite Multi Dates Picker,  Este módulo fue desarrollado por John Camilo Bautista Gutierrez en SeeD EM.

Primeras impresiones de Drupal 8

Con más de 200 nuevas características y mejoras, el próximo lanzamiento de la plataforma líder de gestión de contenido web en el mundo del código abierto te seducirá. Así comienza el primer párrafo de la sección de Drupal 8 que drupal.org está dedicando en su próximo lanzamiento.

En SeeD, nos dejamos seducir por esta nueva versión y, por lo tanto, asumimos la tarea de migrar nuestro sitio anterior de Drupal 7 a Drupal 8, aprovechando un nuevo y limpio diseño. Este es el primero de una serie de artículos en los que explicaremos nuestra experiencia en esta emocionante aventura: desde la concepción hasta el lanzamiento y mantenimiento de nuestro nuevo sitio en Drupal 8.

Drupal 8 todavía está en fase beta y no se recomienda para usuarios no técnicos ni para la construcción de sitios de alto tráfico o alta disponibilidad. En esta etapa, se recomienda que los desarrolladores y constructores de sitios (site builders) prueben y contribuyan a la solución de "bugs" o errores críticos encontrados durante las pruebas.

 

¿Cuándo estará listo Drupal 8?

Esta es la pregunta del millón. Para conocer su estado ha habido varios esfuerzos por parte de expertos, uno de los que parece cercano a la realidad es el Drupal Release Date, un sitio que, de acuerdo con los nuevos problemas que se crean (activos) y los que se resuelven (corregidos), estima la fecha de lanzamiento. Incluso hay una cuenta de Twitter @ isd8outyet que menciona diariamente si Drupal 8 ha sido lanzado, es decir, dice "sí" o "no", como puedes imaginar, hasta ahora solo ha tuiteado "no". Lo que es cierto es que el primer RC (release candidate) de Drupal 8 se lanzará cuando haya cero problemas críticos y se lanzará como una versión estable cuando haya cero problemas mayores. Lo interesante es que puedes hacer una predicción de cuándo estará listo Drupal 8 y ganar un ticket de premio para el próximo DrupalCon en Drupal 8 Hivemind. Según la estimación dada por Dries Buytaert en una charla informal y "off-the-record" durante DrupalCon LatAm en Bogotá, cree que para abril de 2015 estarán muy cerca del "release candidate".

Una de las cosas que rápidamente notas cuando empiezas a desarrollar con esta nueva versión es que la documentación de Drupal 8 en comparación con Drupal 7 es escasa. Por supuesto, esto se resolverá a medida que se vuelva más estable, el desarrollo se está moviendo rápidamente y necesita continuar a este ritmo para llegar a su versión madura lo antes posible. Así que debemos tener buenas habilidades para buscar en Google, inspeccionar y aprender del código del núcleo, utilizar el método de ensayo y error y preguntar en IRC o en Drupal Answers.

 

Sobre los constructores de sitios (site building):

Drupal 8 es increíble. En poco tiempo puedes construir casi todo el sitio sin usar un módulo contribuido. A veces te encuentras con algunos errores, pero es de esperarse en versiones beta.

  • La construcción de tipos de contenido es más poderosa. Puedes configurar modos de vista, modos de formulario y muchos campos diferentes, como correo electrónico, referencia de entidad, enlace, etc.

  • Capacidad para realizar un sitio multilingüe: ya no necesitas tener una docena de módulos para esto, está incluido en el núcleo de Drupal 8. Desde la primera pantalla de instalación puedes seleccionar tu idioma nativo y, desde allí, todo se traducirá, incluidas las vistas y los campos de imagen.

  • Editor WYSIWYG ahora es parte del núcleo. También se incluyó un editor en línea para editar más rápido, es decir, no tienes que ir a una página para editar contenido, sino que puedes hacerlo directamente en el elemento de visualización. ¡Es genial!

  • Views: también se incluyó en el núcleo y funciona de maravilla.

 

Con respecto al back-end:

  • Enfocado en los estándares actuales: se incluyeron algunos componentes como el Symfony framework y otras bibliotecas externas como Composer, PHPUnit, Guzzle, el componente Zend Feed, Assetic y más. Esta nueva versión incluye un código mucho más moderno, es orientado a objetos (clases, herencia, interfaces, etc.) e incluye los últimos estándares de PHP (ej. PSR-0, PSR-4, namespaces, traits). ¡Drupal ya no estará en una isla!

  • Muchos componentes son plugins y para modificar su comportamiento, solo necesitas extender la clase y colocarla en el "namespace" correcto.

  • Consejo: Si vas a desarrollar un sitio de producción, debes asegurarte de usar versiones beta y no versiones dev.

  • No puedes hacer una "actualización" de una versión beta a otra. Así que, para actualizar, ten cuidado. Consejo: cuando se lance una versión beta, en la descripción puedes leer sobre los aspectos a considerar al actualizar de una beta a otra.

  • El sistema de traducción es verdaderamente espectacular.

  • Servicios web en el núcleo: puedes publicar contenido en formato JSON o XML (está integrado en Views) para que sea consumido por otra aplicación, lo cual es muy útil para "headless".

 

Con respecto al front-end:

  • La construcción de un tema personalizado para Drupal 8 es un proceso casi completamente diferente al de la construcción de uno para Drupal 7.

  • Lo más notable es el cambio en el motor de plantillas de PHP Template a Twig. Este último es mucho más fácil e intuitivo que su predecesor, y no necesitas saber PHP para hacer una plantilla.

  • En muchas ocasiones fue necesario usar {{dump ()}} para mostrar todas las variables disponibles en la plantilla y elegir las necesarias.

  • Drupal 8 ha agregado un extenso soporte para tecnologías estándar de accesibilidad, incluidas WAI-ARIA, y ha estado trabajando para proporcionar un HTML5 más semántico.

Crear sitios web con Drupal 8 es posible hoy en día. Por supuesto, debemos ser conscientes de las limitaciones de los módulos que aún no han sido migrados y de los errores que aún se pueden encontrar en el núcleo. Por otro lado, te sientes bien trabajando con Drupal 8. Han incorporado las mejores prácticas tanto en el back-end como en el front-end, y la experiencia de crear sitios web utilizando su interfaz, que es realmente sólida. ¡Y, de hecho, nos ha seducido! Estamos ansiosos por contarles cómo va el desarrollo de nuestro primer proyecto en Drupal 8 para un cliente.

Cómo mostrar los mensajes de error de PHP en Drupal 8 y 9

If you are ever working with code in Drupal and encounter the typical message, "The website encountered an unexpected error. Please try again later," it’s a sign that there’s a bug. However, there’s no way to know exactly where it occurred, and it's tedious to go back and forth trying to find it manually. Drupal has an error level manager to help display errors.

The following tip is a trick developers can use to make the most obvious errors visible.

All you have to do is copy the following code.

Codigo PHP

And paste it into the "settings.php" file of your Drupal installation.

Files PHP

The code can be placed anywhere in the settings.php file; in this example, it was pasted at the end.

Codigo PHP

Save the changes and return to the broken page, and you should now see that the error will be visible on the page.

log PHP

Once the code causing the error is fixed, reload the page, and it should be resolved.

Very important: perform this action only in local environments, as doing it in production could expose important server information to potential attackers.

Video credits: https://www.youtube.com/watch?v=Mem8nxlBJ0I&ab_channel=OSTraining

Buenas prácticas con Composer en Drupal 8

Este artículo es una adaptación al español del excelente artículo creado por JAMES SANSBURY de Lullabot en https://www.lullabot.com/articles/drupal-8-composer-best-practices

Esta traducción puede no ser literal pero contiene la esencia de lo expresado en el artículo original, se traduce con el objetivo de hacerlo disponible a quienes no dominan el idioma inglés.

----------

En Drupal 7 estábamos acostumbrados a instalar Drupal, sus módulos y sus temas simplemente descargando directamente desde el sitio Web o usando Drush, una tarea muy sencilla para quien ya venía acostumbrado a la tarea, sin embargo en otras trincheras de PHP la historia se estaba contando de otra forma y eso lo sabía el equipo de desarrollo del núcleo de Drupal 8, así que en todo ese proceso de arquitectura de la nueva versión se incluyó el gestor de paquetes por excelencia de PHP para hacernos la vida mas fácil, si, estoy hablando de Composer.

Estoy seguro que para muchos que andaban en la isla de Drupal 7, Composer sonaba a algo extraño al cual no valía la pena voltear a mirar ya que Drupal podía seguir instalándose de la manera tradicional, sin embargo, al momento de instalar un módulo contribuido es donde realmente se valora a Composer, algunos módulos tienen una gran cantidad de dependencias con librerías y módulos que si se instalan manualmente le pueden poner al borde de la locura.

La gestión de dependencias es complicada y no será fácil. Como Ryan Szrama dice:

"Si no está usando un gestor de dependencias [como composer], entonces usted es el gestor de dependencias y es poco confiable"

 

¿Por qué Composer?

  • A menudo los módulos o temas tienen dependencias de librerías que son de terceros, es decir que no encuentras en Drupal.org y que se resuelven usando composer, si lo haces manualmente puede resultar muy tedioso.
  • Composer le ayuda a validar si un paquete o módulo que está intentando instalar es compatible con su versión de PHP, no tendrá que intentar activarlo con Drupal para darse cuenta.
  • También le ayuda a detectar conflictos entre paquetes y módulos
  • Si llega a actualizar un paquete o incluso su versión de PHP, no tendrá que volver a hacer todo el proceso manual, composer lo hará para usted.
  • drush dl será removido pronto en favor de composer, más info https://github.com/drush-ops/drush/pull/2654
  •  

Por donde empezar

La documentación disponible en drupal.org es bastante útil para empezar, si aún no tiene instalado Composer en su entorno, hágalo y recuerde asegurarse de estar usando la misma versión de PHP en todos sus entornos, desarrollo, pruebas y producción, así asegurará que todo lo validado por composer funcione también en sus otros entornos, usando herramientas como Vagrant o Docker podrá hacerlo fácilmente.

Vamos a instalar el núcleo de Drupal usando una plantilla que existe en Composer y que tiene por nombre drupal-project, esta plantilla se encargará de hacer la descarga del núcleo en nuestro directorio junto a un modelo de estructura recomendada para aprovechar al máximo docker.

Ejecute lo siguiente:

$ composer create-project drupal-composer/drupal-project:8.x-dev example --stability dev --no-interaction

El anterior comando copiará a drupal-project dentro de la carpeta example, descargará el núcleo de Drupal y algunos paquetes útiles, una vez termine es una buena práctica que ingrese a la carpeta e inicialice un repositorio en git, el proyecto ya contiene un archivo .gitignore con todos los directorios que no deberían ir en git y así hacer liviano el repositorio.

Fíjese en el archivo composer.json que está en el directorio, ese archivo funciona como una receta que indica todos paquetes necesarios para su instalación de Drupal así como dependencias entre otras cosas.

 

Cómo descargar módulos y temas.

Si le es familiar Drush, entonces no tendrá problemas con composer, básicamente solo es acostumbrarse a una nueva sintaxis que resulta muy similar, drupal-project ya include el repositorio de drupal para instalar paquetes, si por alguna razón, está usando composer bajo un modelo ajustado a sus necesidades, puede que requiera instalar el repositorio manualmente.

La siguiente es la sintaxis para instalar un paquete, ya sea un módulo o un tema

composer require [vendor]/[packagename]

Básicamente se trata de reemplazar lo que está entre [...], en donde el vendor es Drupal y el packagename es el nombre de máquina del módulo o tema, ejemplo:

composer require drupal/devel

¿Fácil verdad?, el lugar donde de instala el paquete descargado depende de donde se haya definido en el archivo composer.json, en el caso de drupal-project está definido en web/modules/contrib, a estos se les llaman installer-paths.

 

Dependencias para desarrollo

Suele suceder que algunos módulos solo los necesitamos para nuestro entorno de desarrollo y no para producción, un buen ejemplo es el módulo devel, para esos casos Composer nos permite especificarlo con la bandera --dev agregándolo al comando composer require.

$ composer require --dev drupal/devel

Esto asegurará que el módulo estará disponible para los desarrolladores cuando ejecuten

$ composer install

pero no se descargará si se ejecuta

$ composer install --no-dev

Hacer uso de la bandera --dev es una practica recomendada a la hora de usar composer

Como nota aparte, pero muy importante, si está haciendo commit de su configuración exportada de Drupal 8 es recomendable que haga uso del módulo Configuration Splint para asegurarse que el estado activado del módulo devel no se pase a producción y termine generando un error en el despliegue.

 

Dependencias anidadas

Los módulos o temas pueden tener su propio archivo composer.json que especifica unas dependencias adicionales, este archivo también es leído por composer al descargar el módulo y por lo tanto también resuelve esas dependencias, un ejemplo claro de eso es el módulo Address que tiene un archivo composer con distintas dependencias.

 

Descarga de versiones específicas

Puede suceder que en su instalación se requiera una versión específica de un módulo por compatibilidad, Composer es muy flexible en ese escanario y por eso tiene un extenso capítulo al respecto que es recomendable leer, a continuación las más usadas.

 

  • Se usan los dos puntos después del vendor/package para especificar una versión o limitación.
composer require drupal/foo:1.2.3

En el ejemplo anterior puede notar que en el número de la versión no se ha incluido la versión de Drupal, es decir, de la forma 8.x-1.2.3, esto es porque en Composer esto no se requiere.

 

  • La limitación usando el signo de intercalación (^) permite que sea instalada cualquier nueva versión excepto aquella que puede ser de un cambio de versión mayor y que puede dañar la estabilidad, en otras palabras, el primer número de la versión no puede cambiar pero los otros si.
composer require drupal/foo:^1.0 

El anterior comando permitirá instalar un versión del módulo que sea mayor o igual a 1.0 pero inferior a 2.0, si necesita especificar una versión, este es el método recomendado.

 

  • La limitación usando la virgulilla (~) es un poco mas restrictiva que el caso del signo de intercalación, esto significa que composer puede descargar una versión superior del último dígito especificado, por ejemplo
composer requirer drupal/foo:~1.2

Permitirá cualquier valor mas grande o igual a 1.2 como 1.2.0, 1.2.1, 1.9 etc... pero no permitirá incrementar a la versión 2.x

 

  • Se pueden establecer otras limitaciones que se explican mejor por si solas como las banderas -dev -stable o incluso especificar comodines con *.

 

A qué hacerle commit

 

Usando como referencia la estructura de directorio definida por drupal.project, explore el archivo .gitignore, seguramente lo mencionado a continuación ya está siendo tenido en cuenta.

No haga commit a

  • ./vendor
  • ./web/core
  • ./web/modules/contrib
  • ./web/themes/contrib

Haga commit a

  • composer.json y composer.lock (Este guardará las versiones exactas que fueron descargadas y así se asegurará que no se instalarán versiones distintas en otros ambientes)
  • Cualquier otro código como es normal.

 

Cómo realizar actualizaciones

Actualizar un módulo, tema o librería es muy similar a como se hace la instalación, solo tenga en cuenta hacerlo en un momento no crítico del proyecto para poder evaluar las posibles incompatibilidades de la nueva versión.

Este es un ejemplo de actualización el módulo devel, note que se hace uso de la bandera --with-dependencies para que también se actualicen las dependencias requeridas por el módulo, de lo contrario solo se actualiza el módulo.

$ composer update --with-dependencies drupal/devel

Si quisiera actualizar todos los paquetes de Drupal, haga uso de del comodín *, ejemplo:

composer update --with-dependencies drupal/*

 

Sobre los parches

Es inevitable que un módulo, tema o librería pueda requerir un parche en el proceso de desarrollo y ya que no estamos cargando el código parchado en el repositorio, se necesita un método para que el flujo entre ambientes tenga en cuenta los parches que se están aplicando. Para ese caso recomendamos el uso de composer-patches si está trabajando con la plantilla drupal-project este ya se encuentra instalado, sino, instalarlo es mu y fácil con el siguiente comando.

$ composer require cweagans/composer-patches

Para parchar un paquete se edita el archivo composer.json para agregar la definición en la sección extra, veamos un ejemplo con un parche para el módulo devel.

"extra": {
  "patches": {
    "drupal/devel": {
      "2860796: Create a branch of devel compatible with Media in core": "https://www.drupal.org/files/issues/2860796-2.patch"
    }
  }
} 

Puede notar que la sintaxis define un comentario a la izquierda y la URL del parche a la derecha, si lo prefiere también puede apuntar a un directorio en el repositorio donde esté almacenando el parche.

Una vez haya hecho la modificación ejecute composer update drupal/devel para que quede aplicado el parche

$ composer update drupal/devel
Gathering patches for root package.
Removing package drupal/devel so that it can be re-installed and re-patched.
Deleting web/modules/contrib/devel - deleted
> DrupalProject\composer\ScriptHandler::checkComposerVersion
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
Gathering patches for root package.
Gathering patches for dependencies. This might take a minute.
- Installing drupal/devel (1.2.0): Loading from cache
- Applying patches for drupal/devel
https://www.drupal.org/files/issues/2860796-2.patch (2860796: Create a branch of devel compatible with Media in core)

Si se presenta el caso que alguna dependecia requiere un parche, por ejemplo un módulo conribuido requiere un parche en el core, tendrá que definirlo explícitamente en su archivo composer.json o ejecutar lo siguiente

$ composer config extra.enable-patching true

 

Cómo eliminar un módulo o tema

Tal como agregar o actualizar, eliminar es muy similar y fácil de hacer

$ composer remove drupal/devel

Si agregó el módulo con la bandera --dev, puede que le pregunte si quiere borrarlo de require-dev, si ese es el caso, podría usar el comando de la siguiente forma para que no le haga la pregunta

$ composer remove --dev drupal/devel

 

Eliminar parches

Si desea eliminar un módulo o tema que tenga parches, debe tener en cuenta que los parches no se eliminan por si solos sino que tendrá que hacerlo manualmente desde el archivo composer.json o con un comando como el siguiente que es para el módulo devel.

$ composer config --unset extra.patches.drupal/devel

 

Alertas por cambio en el hash del lock

Cuando se hacen cambios al composer.json el hash del archivo .lock deja de coincidir por o tanto arroja una alerta, para volver a ajustar el hash sin necesidad de ejecutar un composer update completo, puede ejecutarlo de la siguiente manera para que solo recree el hash

composer update --lock

 

Acelerar la cosas

Algunas operaciones de composer pueden resultar muy lentas, para mejorar la velocidad puede instalar prestissimo que le permite a composer ejecutar operaciones en paralelo, lo mejor es instalarlo de forma global

$ composer global require hirak/prestissimo

 

No es perfecto

Es inevitable que en ocasiones algo no salga bien y se generen momentos de frustración en donde quieras mandar a Composer a la mismísima $%&/()=)(/&, en esos casos le invitamos a recordar que no está solo y que lo mas seguro es que se pueda resolver, solo en muy pocos casos puede resultar mas fácil que usted tenga que gestionar las dependencias manualmente, piense que es una inversión a largo plazo para la estabilidad de su proyecto.

 

How to render a form in TWIG Drupal 8

In some situations, we need to manage the structure of the fields in a custom form; this management makes it easier for the Frontend to style the form structures. So, if what we want is to render or display each specific field of a form in a custom TWIG template, these are the steps:

For this example, we'll use a dummy module: modules/custom/example_fields_form

Creating the module example_fields_form.info.yml:

type: module
name: example_fields_form
description: 'some description'
core: 8.x
 

With our module in place, we need to create a routing file, which will be responsible for calling and executing our form with a basic content access requirement. To do this, we will create the file example_fields_form.routing.yml:

example_fields_form.fields_form:
  path: 'example-fields-form'
  defaults:
    _title: 'example_fields_form'
    _form: '\Drupal\example_fields_form\Form\BuildingForm
  requirements:
    _permission: 'access content'
 

If we look at the _form route located in the module, we have given it a path /Form/class_name. Since we have defined this route, the routing file will look for it, so we need to create the structure from the module's root folder as follows: /example_fields_form/src/Form/BuildingForm.php. We created the /src and /Form directories, and the file should have the following structure:

<?php
/**
 * @file
 * Contains \Drupal\example_fields_form\Form\BuildingForm.
 */
namespace Drupal\example_fields_form\Form;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\FormBase;

class BuildingForm extends FormBase {

    public function getFormId() {
        return ‘example_fields_form’;
    }

    public function buildForm(array $form, FormStateInterface $form_state) {
        
    }

    public function submitForm(array &$form, FormStateInterface $form_state) {
        drupal_set_message($this->t('@can_name ,Your application is being submitted!', array('@can_name' => $form_state->getValue('candidate_name'))));
         foreach ($form_state->getValues() as $key => $value) {
           drupal_set_message($key . ': ' . $value);
         }
    }

    public function validateForm(array &$form, FormStateInterface $form_state) {
        $values = $form_state->getValues();
    }
}

At this point, we already have the basic structure to build our form and the basic submit and validate functions. Now, we only need to add fields to our buildForm function. For this, we will rely on the documentation from drupal.org: https://api.drupal.org/api/drupal/elements/8.2.x For this example, we will use an email field and a button:

$form['email'] = array(
            '#type' => 'email',
            '#placeholder' => t('Email'),
            '#required' => TRUE,
);

//Botón
$form['actions']['continue'] = array(
    '#type' => 'submit',
    '#value' => $this->t('continue'),
    '#attributes' => ['class' => ['act-continue']],
);

Now we need to tell this form that it will have a #theme property in order to render our elements. For that, we add:

$form['#theme'] = 'example-fields-form';
 

The name we choose is the same one we will use to name our template file.

Now, if we need to add our custom style files for this module, we include:

$form['#attached']['library'][] = example_fields_form/example_fields_form';
 

With this and having the corresponding directory structure and the file example_fields_form.libraries.yml as follows:

example_fields_form':
  version: 1.x
  js:
    js/main.js: {}
  css:
    theme:
      css/main.css: {}
Lastly, we return the form.
 
return $form;

Now we need to create our template. To do this, we will create a new directory from the root folder of the module as follows: /example_fields_form/templates. With the directory created, we will create our file named as we did in the form: example-fields-form.html.twig. Now we have our file created.

To link our Form with the Template, we will use a hook_theme. For this, we need to create a file named example_fields_form.module from the root folder, and it should look like this:

function example_fields_form_theme($existing, $type, $theme, $path) {
    return [
        'example-fields-form' => [
            'render element' => 'form',
        ],
    ];
}
We can now use our form in the .twig file. To do this, we will call the fields we created in the example-fields-form.html.twig file as follows:
 
<article class="example_fields_form">
    <section>
      <div class="content">
        {{ form.email }}
        {{ form.actions.continue }}
      </div>
    </section>
</article>
{{ form.form_build_id }}
{{ form.form_token }}
{{ form.form_id }}
 

It is important to call these last fields so that the form can be identified and return all its data.

I hope this helps you.

Cómo renderizar un formulario en TWIG Drupal 8

En algunas situaciones, necesitamos manejar la estructura de los campos de un formulario custom; este manejo facilita el trabajo por parte de Front para dar estilos a las estructura de los formularios. Así que, si lo que queremos es renderizar o mostrar los cada campo específico de un formulario en una plantilla personalizada TWIG, estos son los pasos:

Para este ejemplo usaremos un módulo dummy: modules/custom/example_fields_form

Creación del módulo example_fields_form.info.yml:

type: module
name: example_fields_form
description: 'some description'
core: 8.x
 

Teniendo nuestro módulo, necesitamos crear un archivo routing, el cual se encargará de llamar y ejecutar nuestro formulario con un requerimiento básico de acceso al contenido, para ello vamos a crear el archivo example_fields_form.routing.yml:

example_fields_form.fields_form:
  path: 'example-fields-form'
  defaults:
    _title: 'example_fields_form'
    _form: '\Drupal\example_fields_form\Form\BuildingForm
  requirements:
    _permission: 'access content'
 

Si nos fijamos en la ruta _form ubicados en el módulo, le hemos dado una ruta /Form/class_name, como hemos definido esta ruta, el archivo routing irá en busca de estos, por lo tanto debemos crear la estructura desde la carpeta raíz del módulo así: /example_fields_form/src/Form/BuildingForm.php. Hemos creado el directorio /src y /Form, además el archivo debe tener la siguiente estructura:

<?php
/**
 * @file
 * Contains \Drupal\example_fields_form\Form\BuildingForm.
 */
namespace Drupal\example_fields_form\Form;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\FormBase;

class BuildingForm extends FormBase {

    public function getFormId() {
        return ‘example_fields_form’;
    }

    public function buildForm(array $form, FormStateInterface $form_state) {
        
    }

    public function submitForm(array &$form, FormStateInterface $form_state) {
        drupal_set_message($this->t('@can_name ,Your application is being submitted!', array('@can_name' => $form_state->getValue('candidate_name'))));
         foreach ($form_state->getValues() as $key => $value) {
           drupal_set_message($key . ': ' . $value);
         }
    }

    public function validateForm(array &$form, FormStateInterface $form_state) {
        $values = $form_state->getValues();
    }
}

En estos momentos ya tenemos la estructura básica para construir nuestro formulario y las funciones básicas submit y validate, ahora sólo necesitamos agregar campos en nuestra función buildForm, para ellos nos vamos a basar en la documentación de drupal.org: https://api.drupal.org/api/drupal/elements/8.2.x Para este ejemplo vamos a usar un campo email y un botón:

$form['email'] = array(
            '#type' => 'email',
            '#placeholder' => t('Email'),
            '#required' => TRUE,
);

//Botón
$form['actions']['continue'] = array(
    '#type' => 'submit',
    '#value' => $this->t('continue'),
    '#attributes' => ['class' => ['act-continue']],
);

Ahora necesitamos decirle a este formulario que va a tener una propiedad #theme para poder renderizar nuestros elementos, para eso ponemos:

$form['#theme'] = 'example-fields-form';
 

El nombre que pongamos, es el mismo que vamos a nombrar nuestro archivo template.

Ahora bien, si necesitamos poner nuestros archivos de estilos custom para este módulo, agregamos:

$form['#attached']['library'][] = example_fields_form/example_fields_form';
 

Ya con esto y teniendo la respectiva estructura para de directorios y el archivo example_fields_form.libraries.yml así:

example_fields_form':
  version: 1.x
  js:
    js/main.js: {}
  css:
    theme:
      css/main.css: {}
Por último retornamos el formulario
 
return $form;
Ahora necesitamos crear nuestro template, para eso vamos a crear un nuevo directorio desde la carpeta raíz del módulo así: /example_fields_form/templates, con el directorio creado vamos a crear nuestro archivo nombrado como lo hicimos en el formulario example-fields-form.html.twig. Ahora tenemos nuestro archivo creado.

Para poder enlazar nuestro Form con el Template, vamos a hacer uso de un hook_theme, para esto debemos crear desde la carpeta raíz un archivo example_fields_form.module y debe quedar así:

function example_fields_form_theme($existing, $type, $theme, $path) {
    return [
        'example-fields-form' => [
            'render element' => 'form',
        ],
    ];
}
Ya podemos hacer uso de nuestro formulario en el archivo.twig, para esto vamos a llamar los campos que hemos creado en el archivo example-fields-form.html.twig así:
 
<article class="example_fields_form">
    <section>
      <div class="content">
        {{ form.email }}
        {{ form.actions.continue }}
      </div>
    </section>
</article>
{{ form.form_build_id }}
{{ form.form_token }}
{{ form.form_id }}
 

Es importante llamar estos últimos campos para que el formulario pueda ser identificado y retornar todos sus datos.

 

Espero les ayude.