twig https://drupaladicto.com/ es Imprimir archivos Media en Twig Drupal 8,9, o superior https://drupaladicto.com/snippet/imprimir-archivos-media-en-twig-drupal-89-o-superior <span class="field field--name-title field--type-string field--label-hidden">Imprimir archivos Media en Twig Drupal 8,9, o superior</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item">Si quieres imprimir la url de un archivo (Video, Image o Mp3), dentro de tus plantilla twig, es necesario que utilices una de las tres opciones disponibles.</div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 19/01/2024 - 09:37</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item">Para imprimir la url o uri, de un archivo que ha sido cargado utilizando el módulo Media de Drupal, copia el siguiente código en tu plantilla, dependiendo del tipo de archivo subido y sustituye el nombre del campo. En los siguientes ejemplos te muestro cómo imprimir una imagen subida con Media y cómo imprimir un enlace de descarga (Con soporte multi-idioma), para video y audio.</div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><pre> {# Imprime la url de una Imagen #} &lt;img src="{{ file_url(content.field_image[0]['#media'].field_media_image.entity.uri.value) }}" /&gt; {# Imprime la url de un archivo tipo Video #} &lt;a href="{{ file_url(content.field_video[0]['#media'].field_media_video_file.entity.uri.value) }}"&gt;{{ 'Download'|t }}&lt;/a&gt; {# Imprime la url de un archivo tipo Audio #} &lt;a href="{{ file_url(content.field_audio[0]['#media'].field_media_audio_file.entity.uri.value) }}"&gt;{{ 'Download'|t }}&lt;/a&gt; {# Imprime la url de un archivo tipo PDF o TXT #} &lt;a href="{{ file_url(content.field_archivo_media[0]['#media'].field_media_document.entity.uri.value) }}"&gt;{{ 'Download'|t }}&lt;/a&gt; </pre> </div> <div class="clearfix text-formatted field field--name-field-notas field--type-text-long field--label-above"> <div class="field__label">Notas</div> <div class="field__item"><p>Puedes instalar el módulo <a href="https://www.drupal.org/project/twig_tweak">Twig Tweak</a>, que te permite otras opciones para utilizar en Twig.</p> </div> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/default_images/snippet-pager.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/twig" hreflang="es">twig</a></div> <div class="field__item"><a href="/categoria/twig-template" hreflang="es">twig template</a></div> <div class="field__item"><a href="/categoria/media" hreflang="es">media</a></div> <div class="field__item"><a href="/categoria/multimedia" hreflang="es">multimedia</a></div> <div class="field__item"><a href="/categoria/plantillas" hreflang="es">plantillas</a></div> <div class="field__item"><a href="/categoria/custom-theme" hreflang="es">custom theme</a></div> <div class="field__item"><a href="/categoria/frontend" hreflang="es">frontend</a></div> <div class="field__item"><a href="/categoria/mp3" hreflang="es">mp3</a></div> <div class="field__item"><a href="/categoria/audio" hreflang="es">audio</a></div> <div class="field__item"><a href="/categoria/video" hreflang="es">video</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img src="/sites/default/files/styles/max_325x325/public/imagenes/portada-snippet-grande.png?itok=JZyTAbRq" width="325" height="176" alt="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid image-style-max-325x325" /> </div> </div> </article> </div> </div> Fri, 19 Jan 2024 08:37:38 +0000 webmaster 478 at https://drupaladicto.com Imprimir valores desde un Nodo dentro una Twig Paragraphs https://drupaladicto.com/snippet/imprimir-valores-desde-un-nodo-dentro-una-twig-paragraphs <span class="field field--name-title field--type-string field--label-hidden">Imprimir valores desde un Nodo dentro una Twig Paragraphs</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>     Cómo imprimir valores de un Nodo que contiene campos del tipo Paragraphs, usando Twig.</p> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Lun, 09/10/2023 - 23:24</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item"><p>     Si estás intentando imprimir valores desde un nodo, dentro de una plantilla tipo Paragraphs, podrás hacerlo siguiendo estos pasos</p> <ol><li>Declara la variable que hará referencia al elemento padre (Nodo dentro del cuál habitan los paragraphs) <pre> {% set parent = paragraph._referringItem.parent.parent.entity %}</pre> </li> <li>Añade el campo del nodo que quieres imprimir, utilizando como base la variable que haz declarado. <pre> {{ parent.title.value }}</pre> </li> </ol></div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><ul><li> <pre> Id del Nodo: {{ parent.nid.value }}</pre> </li> <li> <pre> Título del Nodo: {{ parent.title.value }}</pre> </li> <li> <pre> Enlace hacia el Nodo: &lt;a href="{{ parent.title.value }}"&gt;{{ parent.title.value }}&lt;/a&gt;</pre> </li> </ul></div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/default_images/snippet-pager.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/campos-referenciados" hreflang="es">campos referenciados</a></div> <div class="field__item"><a href="/categoria/paragraphs" hreflang="es">paragraphs</a></div> <div class="field__item"><a href="/categoria/campo" hreflang="es">campo</a></div> <div class="field__item"><a href="/categoria/nodo" hreflang="es">nodo</a></div> <div class="field__item"><a href="/categoria/twig" hreflang="es">twig</a></div> <div class="field__item"><a href="/categoria/twig-template" hreflang="es">twig template</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img src="/sites/default/files/styles/max_325x325/public/imagenes/portada-snippet-grande.png?itok=JZyTAbRq" width="325" height="176" alt="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid image-style-max-325x325" /> </div> </div> </article> </div> </div> Mon, 09 Oct 2023 21:24:07 +0000 webmaster 472 at https://drupaladicto.com SDC Module | Componentes sin desacoplar https://drupaladicto.com/curso/sdc/sdc-module-componentes-sin-desacoplar <span class="field field--name-title field--type-string field--label-hidden">SDC Module | Componentes sin desacoplar</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-1315 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-1315 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-1315 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-1315"> <section id="video-only-1315" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-10/portada-sdc.png?itok=UAWhroSt" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-784-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-784-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-784-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/6MTevtGpi2E&amp;max_width=0&amp;max_height=0&amp;hash=6lWKmZUDi35btYWnGlamiJzzmNxIPxtN0G2OhPDa08E" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-784-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     Con la aparición de diversos frameworks basados en javascript, como Node.js, Angular o Vue.js, cuyas ventajas principales, son la muestra de contenidos con mayor velocidad de carga, o agregar efectos visuales a tu web, sin perjudicar su rendimiento; no era extraño esperar, que la comunidad de Drupal, se pusiera manos a la obra, para insertar estas funcionalidades, dentro del ecosistema encargado de la parte gráfica, gracias a su sistema de plantillas Twig. </p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--image-only paragraph--view-mode--default" id="imgly-1317"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-10/sdc-oficial.png?itok=4_f9dqD2" class="img-fluid" alt="sdc module Drupal | Drupaladicto - Consultores especializados en Drupal y Symfony" title="" style="" > </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>   Tras varios intentos, finalmente ha salido a la luz en módulo <a href="https://www.drupal.org/project/sdc">SDC o Single Directory Components</a>, cuyo principal objetivo es el de permitir, la creación de un directorio, dentro de un módulo o theme personalizado , para alojar en su interior, todos los componentes gráficos, de forma individual, incluyendo en cada uno, todas las dependencias para su funcionamiento, como los archivos relacionados con CSS y Javascript. Este enfoque es el punto fuerte, implementado por los frameworks mencionados anteriormente.</p> <h2>   SCD Module - Instalación</h2> <p>     Como el resto de módulos integrados en el núcleo de Drupal, podremos activar el <a href="https://www.drupal.org/project/sdc">SDC o Single Directory Components</a>, desde el listado de móldulos, accediendo a  la url "<strong>/admin/modules</strong>".</p> <p>     Actualmente el módulo sólo tiene una dependencia con <strong>Serialization</strong>, que también está incluido en el núcleo de Drupal, por lo tanto, podrás activarlo sin sorpresas, al hacer clic en el botón de instalar.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--image-only paragraph--view-mode--default" id="imgly-1319"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-10/activar-sdc.jpg?itok=AnWc-jIR" class="img-fluid" alt="sdc module Drupal | Drupaladicto - Consultores especializados en Drupal y Symfony" title="" style="" > </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2>   Requerimientos antes de crear componentes</h2> <p>     Para que podamos comenzar a trabajar con nuestros componentes, además de activar el módulo SDC, necesitaremos contar con un Theme personalizado, para modificar la apariencia del proyecto. </p> <p>     Podremos realizar modificaciones en los componentes, a través de módulos personalizados, pero en mi caso yo me centraré en explicarte cómo generar tus componentes, para que interactúen con el theme principal de tu proyecto.</p> <p>     En el siguiente capítulo, comenzaremos a crear nuestro primer componente, pero primero necesitarás tener ya activado tu theme personalizado, así que te dejo el enlace para que puedas ir preparándote y que puedas continuar con el ejercicio. Utilizaré Boostrap Barrio, pero tú puedes elegir el que prefieras.</p> <h2>   <a href="https://drupaladicto.com/curso/drupal-frontend-basicos">Haz clic aquí para crear tu theme personalizado</a></h2> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 06/10/2023 - 09:50</span> Fri, 06 Oct 2023 07:50:08 +0000 webmaster 468 at https://drupaladicto.com Imprimir valores traducidos en un Twig paragraphs https://drupaladicto.com/snippet/imprimir-valores-traducidos-en-un-twig-paragraphs <span class="field field--name-title field--type-string field--label-hidden">Imprimir valores traducidos en un Twig paragraphs</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>Es posible que te hayas encontrado con la necesidad de imprimir algún contenido, dentro de un paragraphs en un sitio multi-idioma.</p> <p>En mi caso me tocó hacerlo con el witget de Turitop, para un sitio en dos idiomas, así que comparto el ejemplo por si te hace falta.</p> <p>La solución es implementar una preprocess function:</p> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mar, 08/08/2023 - 16:57</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item"><ol><li>Activa el modo debug, para conocer el nombre de la plantilla para el paragraphs donde quieres imprimir el valor.<br />  </li> <li>Añade la siguiente función preproceso, dentro del archivo (.theme) en tu tema personalizado. <pre> function ishow_preprocess_paragraph(&amp;$variables) {   $variables['lang_id'] = $variables['paragraph']-&gt;language()-&gt;getId(); }</pre> </li> <li>Añade el siguiente código dentro de la plantilla y sustituye los valores, según lo que quieras imprimir, en la línea del idioma correspondiente.</li> </ol></div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><p><strong>CONTENIDO PLANTILLA paragraphs.html.twig</strong></p> <p>{% block paragraph %}<br /> &lt;div{{ attributes.addClass(classes) }}&gt;<br /> {% block content %}<br /> {{ content }}<br /> {% endblock %}<br /> &lt;/div&gt;<br /> {% endblock paragraph %}</p> <p><strong>ESTO PASA A CONVERTIRSE EN LO SIGUIENTE</strong></p> <pre> {% block paragraph %}   &lt;div{{ attributes.addClass(classes) }}&gt;     {% block content %}    {#{{ content }}#} #Anulo la variable content, para que sólo se muestre el valor del widtget Turitop <strong>{% if lang_id == 'en' %}</strong>    &lt;div class="load-turitop" data-service="P1" data-lang="en"  data-embed="box"&gt;&lt;/div&gt; <strong>{% else %}</strong>         &lt;div class="load-turitop" data-service="P1" data-lang="es"  data-embed="box"&gt;&lt;/div&gt; <strong>{% endif %}</strong>     {% endblock %}     &lt;script id="js-turitop" src="https://app.turitop.com/js/load-turitop.min.js" data-company="I437" data-ga="no" data-buttoncolor="green" data-afftag="ttafid"&gt;&lt;/script&gt;   &lt;/div&gt; {% endblock paragraph %}</pre> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/default_images/snippet-pager.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/twig" hreflang="es">twig</a></div> <div class="field__item"><a href="/categoria/twig-template" hreflang="es">twig template</a></div> <div class="field__item"><a href="/categoria/content-translations" hreflang="es">content translations</a></div> <div class="field__item"><a href="/categoria/translation" hreflang="es">translation</a></div> <div class="field__item"><a href="/categoria/language" hreflang="es">language</a></div> <div class="field__item"><a href="/categoria/multi-idioma" hreflang="es">multi-idioma</a></div> <div class="field__item"><a href="/categoria/multilanguage" hreflang="es">multilanguage</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img src="/sites/default/files/styles/max_325x325/public/imagenes/portada-snippet-grande.png?itok=JZyTAbRq" width="325" height="176" alt="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid image-style-max-325x325" /> </div> </div> </article> </div> </div> Tue, 08 Aug 2023 14:57:02 +0000 webmaster 450 at https://drupaladicto.com Obtener URI media desde un paragraphs en Twig | Get image URI from paragraph https://drupaladicto.com/snippet/obtener-uri-media-desde-un-paragraphs-en-twig-get-image-uri-paragraph <span class="field field--name-title field--type-string field--label-hidden">Obtener URI media desde un paragraphs en Twig | Get image URI from paragraph</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>     Para extraer la url de un campo media e imprimirlo en tu plantilla Twig, tanto si el campo está en el primer nivel del Paragraphs o dentro de un Paragraphs, que está anidado en otro.</p> <p>     Los ejemplos se puedes aplicara contenidos, productos o paragraphs en Drupal.</p> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Dom, 04/06/2023 - 20:09</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item"><p>1. Instala el módulo <a href="https://www.drupal.org/project/twig_tweak" rel="nofollow" target="_blank" title="Twig Tweak">Twig Tweak</a>.<br /><br /> 2. Lee sobre la utilización del filtro en Twig Twek: <a href="https://www.drupal.org/docs/contributed-modules/twig-tweak/cheat-sheet#s-file-url-filter" rel="nofollow" target="_blank" title="Cheat sheet">Cheat sheet(File URL Filter)</a> </p> <p>También puedes instalar el módulo <a href="https://www.drupal.org/project/twig_field_value" rel="nofollow" target="_blank" title="Twig Field Value">Twig Field Value</a>.</p> <pre>  </pre> </div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><p>/* Puedes declarar una variable my_image*/</p> <p>{% set my_image = product.FIELD_IN_PRODUCT['0']['#paragraph'].FIELD_IN_PARAGRAPH | file_url %}</p> <p>o</p> <p>/*  Puedes acceder al valor directamente con el siguiente ejemplo */<br /> {{ product.FIELD_IN_PRODUCT['0']['#paragraph'].FIELD_IN_PARAGRAPH | file_url }}</p> <p>/* En este ejemplo tienes un campo media dentro de un paragraphs, que a su vez está anidado en otro*/<br /> {{ content.CAMPO_PARAGRAPH_PRINCIPAL['0']['#paragraph'].CAMPO_MEDIA | file_url }}</p> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/imagenes/snippets/snippet-pager_121.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/media" hreflang="es">media</a></div> <div class="field__item"><a href="/categoria/twig" hreflang="es">twig</a></div> <div class="field__item"><a href="/categoria/twig-template" hreflang="es">twig template</a></div> <div class="field__item"><a href="/categoria/paragraphs" hreflang="es">paragraphs</a></div> <div class="field__item"><a href="/categoria/plantillas" hreflang="es">plantillas</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> </article> </div> </div> Sun, 04 Jun 2023 18:09:40 +0000 webmaster 443 at https://drupaladicto.com Corregir Drupal ~10.0 and TWIG ~3.0 Unexpected token name of value if (end of statement block expected) https://drupaladicto.com/snippet/corregir-drupal-100-and-twig-30-unexpected-token-name-value-if-end-statement-block-expected <span class="field field--name-title field--type-string field--label-hidden">Corregir Drupal ~10.0 and TWIG ~3.0 Unexpected token name of value if (end of statement block expected)</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>   Si estás tratando de implementar algún carrusel para Drupal 10, siguiendo ejemplos que haz encontrado en internet, esto te ayudará a corregirlo.</p> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Lun, 15/05/2023 - 11:05</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item"><p>     Si el código que intentas implementar, es parecido a este:</p> <pre> {# We repeat the loop for the carousel items. #} &lt;div class="carousel-inner" role="list"&gt; {% for key, item in items if key|first != '#' %} &lt;div class="featured-image__slide-{{ key + 1 }} item{% if loop.first %} active{% endif %}" role="listitem"&gt;{{ item.content }}&lt;/div&gt; {% endfor %} &lt;/div&gt;</pre> <p> </p> <p>     La solución, es sacar la parte del if, fuera de la declaración inicial del for...</p> </div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><pre> {# We repeat the loop for the carousel items. #}   &lt;div class="carousel-inner" role="list"&gt;   {% for key, item in items if key|first != '#' %} {% if key|first != '#' %}   &lt;div class="featured-image__slide-{{ key + 1 }} item{% if loop.first %} active{% endif %}" role="listitem"&gt;{{ item.content }}&lt;/div&gt; {% endif %}   {% endfor %}   &lt;/div&gt; </pre> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/imagenes/snippets/snippet-pager_118.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/carousel" hreflang="es">carousel</a></div> <div class="field__item"><a href="/categoria/loop" hreflang="es">loop</a></div> <div class="field__item"><a href="/categoria/if" hreflang="es">if</a></div> <div class="field__item"><a href="/categoria/paragraphs" hreflang="es">paragraphs</a></div> <div class="field__item"><a href="/categoria/condicional" hreflang="es">condicional</a></div> <div class="field__item"><a href="/categoria/twig" hreflang="es">twig</a></div> <div class="field__item"><a href="/categoria/twig-template" hreflang="es">twig template</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> </article> </div> </div> Mon, 15 May 2023 09:05:54 +0000 webmaster 439 at https://drupaladicto.com View mode, Twig y Vistas https://drupaladicto.com/curso/site-building/view-mode-twig-y-vistas <span class="field field--name-title field--type-string field--label-hidden">View mode, Twig y Vistas</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-979 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-979 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-979 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-979"> <section id="video-only-979" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-700-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-700-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-700-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/QrPbwCvFJ6s&amp;max_width=0&amp;max_height=0&amp;hash=VUAbCjSzI1zzZ5YyX66JRt1cdFKBh8SFWR9VYNQclxg" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-700-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     En Drupal, además de poder trabajar con tipos de contenido a medida, cuyos campos y comportamiento, nos permiten obtener casi cualquier tipo de estructura posible; existe la opción de mostrar esos mismos contenidos, modificando su presentación o la información expuesta; con esta alternativa podremos aplicar cambios como, por ejemplo, estilos de CSS, dependiendo de los permisos de los usuarios, o descomponer nuestro proyecto en "componentes" reutilizables, que podremos modificar individualmente, sin tener que reescribir el tipo de contenido original.</p> <p>     Esta alternativa es conocida como View Modo o "Modo de Vista" y básicamente nos permite recolocar, presentar u ocultar los campos de cualqueir tipo de contenido o entidad dentro de un proyecto de Drupal.</p> <h2>   Donde econtrar el Modo de vista en un contenido Drupal</h2> <p>     Drupal viene por defecto con dos tipos de contenido Artículo y Página básica, para ver el modo de vista de cualquiera de ellos, tendremos que acceder a la pestaña de Gestionar presentación del tipo de contenido que desamos consultar, en la url "/admin/structure/types/manage/article/display".</p> <p>     Al acceder, por defecto, en la pestaña de un artículo verás algo parecido a la siguiente imagen, con los campos que trae una instalación nueva de Drupal.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/view-mode-article.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2>   View Mode en vistas Drupal</h2> <p>     Una de las mejores formas de trabajar, utilizando View Modes, de los contenidos en Drupal, es através de las vistas. </p> <p>     Por defecto, a partir de Drupal 8, econtraremos una vista llamada Frontpage, encargada de mostrar los artículos creados, sin la necesidad de modificar nada más. </p> <p>     Para comprobarlo, sólo tenemos que añadir algunos artículos a nuestro proyecto Drupal, completando todos sus campos y a continuación, al visitar la página frontal, haciendo clic en el logo de Drupal, veremos un listado de todos nuestros artículos.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/frontpage.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2>   Cómo utilizar View Modes en una vistas Drupal</h2> <p>     Si exploramos la configuración de la vista <strong>Frontpage</strong>, a la que podremos acceder desde la url "/admin/structure/views/view/frontpage", podremos entender muy fácilmente, como se emplea un View Mode, dentro de una vista de Drupal.</p> <p>     Observando el apartado <em><strong>Formato</strong></em>, dentro de la página de configuración de la Vista Frontpage, comprobaremos que está configurada para Mostrar contenidos, con el View Mode Resumen. </p> <p>     Esto quiere decir, que si volvemos a la pestaña <strong>Gestionar Presentación,</strong> del tipo de contenido Artículo y buscamos el apartado <strong>Resumen</strong>, veremos que los campos activados corresponden a los que vemos en la página de inicio de Drupal, gracias a la vista Frontpage.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/configuracion-frontpage.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/resumen-article.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2>   Cómo cambiar el View Mode en una vista Drupal</h2> <p>     Para añadir o modificar un View Modo dentro de una vista en Drupal, solo tendremos que hacer clic en el enlace que se refiere al modo de vista utilizado, en el apartado <strong>Mostrar</strong>, de la pantalla de configuración de la vista. </p> <p>     Al hacer clic, se abre un desplegable, con todos los View Modes, disponibles para la entidad o el contenido que estemos mostrando en la misma.</p> <p>     En el caso de la vista Frontpage, por defecto está empleádose el View Mode Resumen, para asegurarnos de que entendemos como modificarlo, haremos clic sobre Resumen y a continuación seleccionaremos, cualquiera de las opciones disponibles, en mi caso, seleccionaré RSS y luego guardaré los cambios, antes de regresar a la página pricipal, para ver el resultado. </p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/cambio-modo-vista.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/vista-rss.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2>   Modo de vista personalizado</h2> <p>     Ahora que ya conocemos el objetivo de utilizar los Modos de vista (View Modes), podremos ir un poco más allá; vamos a crear y activar nuestro propio modo de vista, para que modifique nuestros contenidos.</p> <p>     Para crear un modo de vista personalizado, iremos a la página de configuración de los modos de vista, para ello, tenemos varias opciones:</p> <ul><li>Llendo a la pestaña <strong>Gestionar Presentación</strong>, dentro del contenido que desamos modificar y desplegarnos hasta la parte inferior izqierda, para acceder mediante el enlace que encontraremos al final.<br />  </li> <li>Accediendo a la url: "/admin/structure/display-modes/view"<br />  </li> <li>Si tienes activado el módulo admin_toolbar, mediante el menú desplegable de administración.</li> </ul></div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/gestionar-viewmodes.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>      Una vez dentro de la página de configuración, haremos clic en el enlace <a href="http://drupaladicto.localhost:8000/admin/structure/display-modes/view/add/node">Añadir una nueva <em>modo de vista</em> de Contenido</a>, ubicado en la parte inferior de cada uno de los contenidos, bloques, paragraphs, media, etc.</p> <p>     Luego rellenaremos el campo con el nombre para nuestro View Mode, ej.: <strong>ModoVistaPersonalizado</strong> y a continuación, guardaremos los cambios y volveremos a la pestaña <strong>Gestionar Presentación</strong>, para activarlo, dentro de nuestro contenido.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/pantalla-configuracion-view-mode.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     Cuando hayamos guardado el nuevo View Mode, volveremos a la pestaña Gestionar presentación, nos desplazaremos hasta el final y a continuación, marcaremos el nuevo View Mode, que encontraremos dentro del listado.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/activando-viewmode.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/viewModeActivado.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2>   Crear plantilla Twig para View Mode</h2> <p>     Requisitos:</p> <ul><li>Instalar un Theme personalizado. Para descubrir varias opciones disponibles <a href="/curso/drupal-frontend-basicos">HAZ CLIC AQUI</a><br />  </li> <li>Activar el modo debug o depurador de Drupal. <a href="/snippet/configuracion-desarrollo-local-drupal-8">HAZ CLIC AQUÍ</a></li> </ul><p>     Cuando tengamos activado el modo Debug, seleccionaremos inspeccionar, desde el navegador, para ver las sugerencias generadas por Drupal, relacionadas con los posibles nombres para las plantillas de nuestros Modos de Vista.</p> <p>     Al igual que con cualquier otra plantilla de un nodo en Drupal, copiaremos el modelo, cambiaremos el nombre y a continuación, podremos comenzar a personalizarla.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/sugerencias.svg" alt="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="View Mode Drupal | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mar, 09/05/2023 - 15:50</span> Tue, 09 May 2023 13:50:48 +0000 webmaster 438 at https://drupaladicto.com Cómo ajustar el imágenes en card Bootstrap https://drupaladicto.com/snippet/como-ajustar-el-imagenes-en-card-bootstrap <span class="field field--name-title field--type-string field--label-hidden">Cómo ajustar el imágenes en card Bootstrap</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><h1 itemprop="name">How to get images in Bootstrap's card to be the same height/width?</h1> <p>Si estás acostumbrado a trabajar con Boostrap, es posible, que algunas ocasiones, tengas que ajustar el tamaño de las imágenes, para que se adapten al contenedor dentro de una tarjeta .card, de bootstrap.</p> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Lun, 03/04/2023 - 13:42</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item">Añade estos estilos a tu clase card </div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><pre> <code>.card-img-top { width: 100%; height: 100%; object-fit: cover; }</code></pre> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/imagenes/snippets/snippet-pager_117.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/bootstrap" hreflang="es">bootstrap</a></div> <div class="field__item"><a href="/categoria/bootstrap-barrio" hreflang="es">bootstrap barrio</a></div> <div class="field__item"><a href="/categoria/frontend" hreflang="es">frontend</a></div> <div class="field__item"><a href="/categoria/image" hreflang="es">image</a></div> <div class="field__item"><a href="/categoria/imagen" hreflang="es">imagen</a></div> <div class="field__item"><a href="/categoria/imagenes" hreflang="es">imágenes</a></div> <div class="field__item"><a href="/categoria/twig" hreflang="es">twig</a></div> <div class="field__item"><a href="/categoria/twig-template" hreflang="es">twig template</a></div> <div class="field__item"><a href="/categoria/plantillas" hreflang="es">plantillas</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> </article> </div> </div> Mon, 03 Apr 2023 11:42:45 +0000 webmaster 414 at https://drupaladicto.com Landing Page Drupal | Plantillas Twig (Parte 2) - Bootstrap y Flexbox https://drupaladicto.com/curso/landing-page/landing-page-drupal-plantillas-twig-parte-2-bootstrap-y-flexbox <span class="field field--name-title field--type-string field--label-hidden">Landing Page Drupal | Plantillas Twig (Parte 2) - Bootstrap y Flexbox</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-933 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-933 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-933 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-933"> <section id="video-only-933" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-654-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-654-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-654-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/c187-f5rQ-4&amp;max_width=0&amp;max_height=0&amp;hash=doq12JlM6HHnmH_6CsxsS_0NjVP7VrMwa15rURlRHIc" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-654-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     Debido a que estamos trabajando con Bootstrap 5, para la creación de nuestra Landing Page personalizable en Drupal 8/9/10, hoy utilizaremos las clases de Bootstrap 5 compatibles con Flexbox; de esta manera, nuestro diseño quedará adaptado a múltiples dispositivos (Responsive), sin la necesidad de manipular nuestra hoja de estilos.</p> <p>     Si analizamos el comportamiento que esperamos obtener para la visualización de nuestra Landing Page, al acceder desde un ordenador, veremos que en la parte central, los elementos deberían presentarse dentro de tres columnas, las dos primeras para la imagen e información del producto, y la última, a todo el ancho del contenido, donde se muestra el formulario para la realización de los pedidos.</p> <p> </p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/landingPageVistaPC_Mesa%20de%20trabajo%201.svg" alt="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     Al acceder a la Página Oficial de Bootstrap, en el apartado de Utilidades, dedicado a FLEX <a href="https://getbootstrap.com/docs/5.0/utilities/flex/">HAZ CLIC AQUI</a>, podremos explorar el listado de clases y sus comportamientos, para facilitarnos la aplicación de casi todas las opciones necesarias en nuestros diseños resposivos, sin demasiados cambios en las hojas de estilos css.</p> <p>     Si ya conocías Bootstrap, sabrás que, añadiendo una o varias clases dentro de cualquier contenedor o etiqueta html, obtendrás el mismo resultado que si aplicaras varias líneas de código css; esto implica un ahorro considerable dentro de las tareas de diseño, además de ofrecer una amplia documentación y varios ejemplos, que podrás encontrar, tanto dentro de la página oficial, como el muchas otras disponibles en internet.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/bootstrapFlexBox.svg" alt="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     Ahora que ya sabemos cómo documentarnos, sobre el uso de las clases de Bootstrap y Flexbox, volvamos a explorar el archivo <strong>node--landingpage--full.html.twig</strong>, responsable de mostrar nuestra plantilla.</p> <p>     Recuerda, que hemos creado esta plantilla, gracias a que activamos el modo Debug o Depurador de Drupal, explicado en capítulos anteriores del curso.</p> <p>     Si prestamos atención en el código que forma, la parte superior de la plantilla, donde hemos añadido ya la imagen de cabera y el texto que aparece justo debajo de ella, encontraremos algunas de las clases de Bootstrap y Flexbox que acabamos de comentar.</p> <pre> {% if content.field_cabecera_landing|render is not empty %} &lt;div class="d-flex container-fluid" lc-helper="background" style="height:50vh;background:url({{ file_url(content.field_cabecera_landing[0]['#media'].field_media_image.entity.uri.value) }}) center / cover no-repeat;"&gt; {% endif %} &lt;/div&gt; &lt;div class="container p-5 bg-light" style="margin-top:-100px"&gt; &lt;div class="row"&gt; &lt;div class="col-md-4 text-center align-self-center"&gt; &lt;div class="lc-block border-end border-2 "&gt; &lt;div editable="rich"&gt; &lt;p class="display-4 text-secondary"&gt;WHY?&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;&lt;!-- /lc-block --&gt; &lt;/div&gt;&lt;!-- /col --&gt; &lt;div class="col-md-8"&gt; &lt;div class="lc-block "&gt; &lt;div editable="rich"&gt; &lt;p class="display-4"&gt;{{ label.0 }}&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;&lt;!-- /lc-block --&gt; &lt;/div&gt;&lt;!-- /col --&gt; &lt;/div&gt;</pre> <h2>   Explicación</h2> <p>     <strong>d-flex: </strong>Es la primera de las clases que deberíamos añadir en nuestra etiqueta HTML, para poder emplear la combinación de Flex y Boostrap; añadirla es el equivalente a escribir la propiedad <strong><em>display: flex</em></strong>, dentro de nuestra hoja de estilos.</p> <p>     <strong>container / container-fluid:</strong> tiene la misma funcionalidad que ya conoces de Boostrap, y que en este caso, añadirá la propiedad padding, configurada por defecto para Drupal, cuando utilizamos el tema basado en Boostrap.</p> <p>     <strong>p-5</strong>: Esta clase es la encargada de modificar la propiedad padding, tienes varios valores disponibles, además de la opción de utilizarla, especificando si quieres aplicar un <em>padding-top</em> <strong>pt-5</strong>, o <em>padding buttom</em> <strong>pb-5</strong>, por ejemplo.</p> <p>     <strong>align-self-center</strong>: esta clase, como su nombre lo indica, se encargará de centrar los elementos, dentro del contenedor.</p> <p>     <strong>col-md-4</strong>: esta es una de las clases que ya deberías conocer, por versiones anteriores de bootstrap, encargada de adaptar el tamaño de la columna, en los dispositivos de tamaño medio (Tablets, Ipads, etc.)</p> <p>     Si quieres profundizar más sobre las clases disponibles y su implementación, te recomiendo visitar la página oficial de Boostrap. <a href="https://getbootstrap.com/docs/5.0/utilities/flex/">HAZ CLIC AQUI</a>.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2>   Añadiendo cambios en la plantilla</h2> <p>     Es el momento de continuar con el resto de cambios necesarios, para seguir ajustando nuestra Landing Page, hasta conseguir que se parezca a nuestra propuesta de diseño.</p> <p>     En esta ocasión, vamos a sustituir en nuestra plantilla, todo el espacio que ocupa el texto central, para dejarle paso, a dos nuevas filas, donde añadiremos los campos correspondientes, encargados de mostrar las imágenes e información de los productos, además del formulario para los peidos.</p> <p>     He añadido un para de clases adicionales, sólo para que sea más fácil de entender, donde colocaremos cada uno de los elementos.</p> <p>     El resultado final, con el nuevo cambio, debería ser parecido al siguiente código:</p> <pre> &lt;div class="row contenido-central"&gt; &lt;div class="col-md-12"&gt; &lt;div class="row info-productos"&gt; LOS PRODUCTOS AQUI &lt;/div&gt; &lt;div class="row formulario-pedidos"&gt; EL FORMULARIO AQUI &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;</pre> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/Central.svg" alt="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     Ahora ya tenemos claro, cuál debería ser la estructrura para conseguir el resultado esperado en mi Landing Page, el problema con el que nos encontramos, es que nuestra plantilla sólo tienes dos campos, con los que podamos jugar, <strong>field_cabecera_landing</strong> y <strong>field_contenidos_landing</strong>, ya que hemos optado, por el uso de paragraphs, para facilitar la personalización de sus contenidos.</p> <p>     Si volvemos a la parte del código donde imprimimos nuestra imagen, podremos concluir, que lo que necesitamos para obtener el resto de valores de nuestra página, es añadir la variable que imprime el campo global de los paragraphs y a continuación, añadir las plantillas correspondientes, para cada uno de los elementos contenidos dentro de éste.</p> <p>     Lo primero que deberíamos hacer será remover la parte del código donde estarán las imágenes, información y el formulario, para añadir dentro sólo el campo global de los paragraphs.</p> <p>     Por ahora, nuestra plantilla principal, <strong>node--landingpage--full.html.twig</strong>, debería quedar con el suguiente resultado:</p> <pre> &lt;div class="row contenido-central"&gt; &lt;div class="col-md-12 p-5"&gt; {{ content.field_contenidos_landing }} &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;</pre> <p>     Una vez añadido el código anterior, si visitamos nuestra Landing Page, deberíamos ver en pantalla, algo parecido a la siguiente imagen:</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/centroNueva.svg" alt="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><p>     Si todo ha ido correctamente, y ves en pantalla un resultado parecido al anterior, es el momento de inspeccionar los elementos y crear las plantillas correspondientes a cada paragraphs, para cotinuar con el resto de modificaciones.</p> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-imagen paragraph--view-mode--default"> <div class="field field--name-field-imagen-contenido field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-full-width-column"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img width="850" src="/sites/default/files/imagenes/laInspeccion.svg" alt="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Landing Page Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> </article> </div> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h3>   Plantilla principal para la landing page</h3> <p>     El código final de la plantilla general para la landing (<strong>node--landingpage--full.html.twig</strong>), que incluye además, el campo de selección para el color, gracias al módulo <a href="/curso/imagenes-y-color-por-interfaz-con-paragraphs" target="_blank">Color Field</a>, será :</p> <pre> {{ attach_library('bootstrap_barrio/node') }} {% set classes = [ 'node', 'node--type-' ~ node.bundle|clean_class, node.isPromoted() ? 'node--promoted', node.isSticky() ? 'node--sticky', not node.isPublished() ? 'node--unpublished', view_mode ? 'node--view-mode-' ~ view_mode|clean_class, 'clearfix', ] %} &lt;article{{ attributes.addClass(classes) }}&gt; &lt;header&gt; {{ title_prefix }} {% if label and not page %} &lt;h2{{ title_attributes.addClass('node__title') }}&gt; &lt;a href="{{ url }}" rel="bookmark"&gt;{{ label }}&lt;/a&gt; &lt;/h2&gt; {% endif %} {{ title_suffix }} {% if display_submitted %} &lt;div class="node__meta"&gt; {{ author_picture }} {% block submitted %} &lt;em{{ author_attributes }}&gt; {% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %} &lt;/em&gt; {% endblock %} {{ metadata }} &lt;/div&gt; {% endif %} &lt;/header&gt; &lt;div{{ content_attributes.addClass('node__content', 'clearfix') }}&gt; {% if content.field_cabecera_landing|render is not empty %} &lt;div class="d-flex container-fluid" lc-helper="background" style="height:50vh;background:url({{ file_url(content.field_cabecera_landing[0]['#media'].field_media_image.entity.uri.value) }}) center / cover no-repeat;"&gt; {% endif %} &lt;/div&gt; &lt;div class="container p-lg-5" style="margin-top:-100px; background-color: {{ content.field_color_fondo_landing.0 }}" &gt; &lt;div class="row"&gt; &lt;div class="col-md-4 text-center align-self-center"&gt; &lt;div class="lc-block border-end border-2 "&gt; &lt;div editable="rich"&gt; &lt;p class="display-4 text-secondary"&gt;WHY?&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;&lt;!-- /lc-block --&gt; &lt;/div&gt;&lt;!-- /col --&gt; &lt;div class="col-md-8"&gt; &lt;div class="lc-block "&gt; &lt;div editable="rich"&gt; &lt;p class="display-4"&gt;{{ label.0 }}&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;&lt;!-- /lc-block --&gt; &lt;/div&gt;&lt;!-- /col --&gt; &lt;/div&gt; &lt;div class="row contenido-central"&gt; &lt;div class="col-md-12 p-md-5"&gt; {{ content.field_contenidos_landing }} &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/article&gt; </pre> <h3>   Plantilla para la imagen y el texto del producto</h3> <p>     El código correspondiente a la parte superior, donde mostramos la imagen del producto, acompañada de un título y un párrafo, (<strong>paragraph--bloque-imagen-y-textos.html.twig</strong>) será:</p> <pre> {% set classes = [ 'paragraph', 'd-lg-flex', 'paragraph--type--' ~ paragraph.bundle|clean_class, view_mode ? 'paragraph--view-mode--' ~ view_mode|clean_class, not paragraph.isPublished() ? 'paragraph--unpublished' ] %} &lt;style&gt; @media (min-width: 992px) { .field--name-field-imagen-producto { width: 550px; } } &lt;/style&gt; {% block paragraph %} &lt;div{{ attributes.addClass(classes) }}&gt; {% block content %} &lt;div class="row no-gutters d-flex"&gt; &lt;div class="imagen-producto d-sm-column"&gt; {{ content.field_imagen_producto }} &lt;/div&gt; &lt;/div&gt; &lt;div class="row no-gutters d-flex"&gt; &lt;div class="texto-producto d-sm-column"&gt; &lt;h2&gt;{{ content.field_texto_superior.0 }}&lt;/h2&gt; &lt;p&gt;{{ content.field_textos_producto.0 }}&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; {% endblock %} &lt;/div&gt; {% endblock paragraph %} </pre> <h3>   Plantilla para el Bloque formulario</h3> <p>     Para la plantilla, encargada de modificar el aspecto gráfico correspondiente al formulario, que además incluye la etiqueta html <strong>&lt;hr /&gt;</strong>, con algunos estilos en línea, (<strong>paragraph--bloque-formulario.html.twig</strong>), será:</p> <pre> {% set classes = [ 'paragraph', 'd-flex flex-column', 'paragraph--type--' ~ paragraph.bundle|clean_class, view_mode ? 'paragraph--view-mode--' ~ view_mode|clean_class, not paragraph.isPublished() ? 'paragraph--unpublished' ] %} {% block paragraph %} &lt;div{{ attributes.addClass(classes) }}&gt; {% block content %} &lt;hr style="height: 5px; background-color: #333333;margin-top: 40px; margin-bottom: 40px"/&gt; &lt;div class="titular text-align-center flex-row"&gt;&lt;h2&gt;{{ content.field_titulo_formulario }}&lt;/h2&gt;&lt;/div&gt; &lt;div class="formulario"&gt; {{ content.field_formulario_bloque }} &lt;/div&gt; {% endblock %} &lt;/div&gt; {% endblock paragraph %} </pre> <p> </p> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 24/03/2023 - 09:59</span> Fri, 24 Mar 2023 08:59:37 +0000 webmaster 413 at https://drupaladicto.com Módulo personalizado | Creación de plantilla https://drupaladicto.com/curso/programacion-drupal/modulo-personalizado-creacion-de-plantilla <span class="field field--name-title field--type-string field--label-hidden">Módulo personalizado | Creación de plantilla</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-943 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-943 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-943 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-943"> <section id="video-only-943" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-664-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-664-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-664-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/-2O__4AVzBI&amp;max_width=0&amp;max_height=0&amp;hash=mWtWle_xPwcj5NDB8pOgsXbMijfm8xOoLtcoADFTCrk" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-664-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1175" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/-2O__4AVzBI" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>     Hoy hemos decidido que estamos dispuestos a seguir aprendiendo Drupal, porque nos apasiona obtener nuevos conocimientos, que solucionarán posibles retos en nuestro futuro próximo, o porque nos encanta ampliar nuestras posibilidades, tanto a nivel laboral como personal. Ya que la puesta en marcha de proyectos web, podrían representar el inicio hacia una carrera prometedora.</p> <p>     Ahora que ya tenemos claro <a href="/actualidad/como-crear-un-modulo-en-drupal-9" target="_blank">Cómo crear un módulo en Drupal 9</a>, en esta ocasión nos vamos a concentrar, en la creación de una plantilla personalizada, con el objetivo de tomar el control sobre la presentación de los datos relacionados con el mismo. Para lograr nuestro propósito, tendremos que implementar uno de los "hooks" o funciones prefabricadas de Drupal que nos permitirán lograr toda clase de objetivos, en este caso será <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x" target="_blank">function hook_theme</a>, la que se encargará registrar las implementaciones de un tema o "theme", dentro de nuestro tema o módulo personalizado.</p> <p>     En este capítulo vamos a crear un módulo personalizado, al que añadiremos un controlador, que nos imprimirá en pantalla una página y posteriormente, también añadiremos mediante la <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a> en el archivo <strong>( MIMODULO.module )</strong> los datos y configuraciones que nos permitirán pasar por parámetros el título y otros contenidos que mostraremos en ella. </p> <p>     Finalmente, añadiremos el archivo routing <strong>( MIMODULO.routing.yml )</strong>, para poder acceder a esta página una vez haya sido activado nuestro módulo personalizado. Este ejemplo te permitirá conocer la manera en que podrás implementar plantillas personalizadas en tus módulos.  </p> <h2>Requisitos</h2> <p>- <a href="/actualidad/como-crear-un-modulo-en-drupal-9" target="_blank">Cómo crear un módulo en Drupal 9</a></p> <h2>Cómo crear módulos con su Controlador y Plantilla en Drupal 9  </h2> <h3>     Paso 1 Creación de tu módulo:</h3> <p>          Lo primero que deberías saber es cómo crear un módulo personalizado. Esencialmente para este ejemplo, lo que necesitarás será una carpeta con el nombre de tu módulo y dentro el archivo con el nombre del módulo y la extensión, eje.: "mimodulo.info.yml"</p> <h3>     Paso 2 Creación del archivo .module para implementar la function_hook_theme():</h3> <p>          En el archivo<strong> MIMODULO.module</strong> es donde podremos implementar los hooks o funciones de php en Drupal, en este ejemplo utilizaremos la <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a>, que se encarga de registrar las implementaciones del tema dentro de un módulo o tema personalizado, esto quiere decir, que las implementaciones declaradas por este hook o función especifican cómo un arreglo o array de renderización particular debe ser renderizada como HTML.</p> <p>     Los párametros que utilizaremos en este ejercicio, estarán dentro de un array que nos devolverá la función y son, el nombre de la función y dentro de de ella, las variables que pasaremos posteriormente al controlador, para crear la página que imprimiremos una vez activado el módulo.</p> <p>     Dentro de las variables, a su vez, tendremos un array de items, donde colocaremos todos las noticias que queremos presentar en la página una vez renderizada y el título de la página que será del tipo String.</p> <pre> &lt;?php /** * Implement hook_theme(). */ function listado_noticias_theme($existing, $type, $theme, $path) { return [ 'listado_noticias' =&gt; [ 'variables' =&gt; ['items' =&gt; [], 'title' =&gt; '' ] ] ]; }</pre> <h3>     Paso 3 Creación del Controlador o Controller:</h3> <p>          El Controlador o Controller es quien nos permitirá crear la página que se mostrará, una vez activado nuestro módulo, al renderizar los datos que hemos definido previamente en nuestra  <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a>.</p> <p>          Para que pueda generarse nuestra página, vamos a añadir a nuestra clase controlador, un método al que llamaremos "page()", y dentro tendremos dos arrays, uno que contendrá el listado de noticias que vamos a recorrer usando nuestra <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a>, y otro con los datos que obtendremos al conectar con la información recibida desde la <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 53.86%;" data-ratio="53.86" data-b-token="b-40c430ccb13" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Custom Module Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Custom Module Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630e32933e11e.png?itok=8Tzd7ihi" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="453" height="244" typeof="foaf:Image" /></div></div> <p>          Una vez creada nuestra clase controller con el nombre <strong>ListadoNoticiasController.php</strong>, dentro tendremos la siguiente estructura de código.</p> <pre> &lt;?php namespace Drupal\listado_noticias\Controller; use Drupal\Core\Controller\ControllerBase; class ListadoNoticiasController extends ControllerBase { public function page(){ $items = [ ['title' =&gt; 'Noticia 1'], ['title' =&gt; 'Noticia 2'], ['title' =&gt; 'Noticia 3'], ['title' =&gt; 'Noticia 4'], ]; return [ '#theme' =&gt; 'listado_noticias', '#items' =&gt; $items, '#title' =&gt; 'Listado de noticias' ]; } } </pre> <p>          El primer array, es un array de objetos, ya que cada noticia podrá tener tantos elementos como queramos especificar, para este ejemplo, sólo añadiremos el título, pero puedes añadir tantos como necesites, siempre tomando en cuenta la estructura ( "clave" =&gt; "valor" ), ya que los objetos, en realidad también son arrays.</p> <pre> $items = [ ['title' =&gt; 'Noticia 1'], ['title' =&gt; 'Noticia 2'], ['title' =&gt; 'Noticia 3'], ['title' =&gt; 'Noticia 4'], ];</pre> <p>          El segundo array, que tendremos dentro de nuestro método "page()", es el que nos devolverá nuestro método al llamarlo, contendrá los parámetros necesarios para renderizar los datos recibidos desde la <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a>, y que harán posible la impresión en pantalla, de nuestros contenidos en formato de una página, al activar el módulo.</p> <p>          En el primer parámetro del array, estamos llamando a nuestra función tema, que configuramos usando la <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a>, el segundo parámetro son los items, que hemos definido como una de las variables que pasamos y el último, será el título de la página, que también definimos mediante la función.</p> <p>          Esto hará posible, que posteriormente podamos recorrer el primer array de items y mostrarlos en la plantilla correspondiente, que todavía no hemos creado. </p> <pre> return [ '#theme' =&gt; 'listado_noticias', '#items' =&gt; $items, '#title' =&gt; 'Listado de noticias' ]; </pre> <h3>     Paso 4 Creación de la ruta para acceder a la página renderizada:</h3> <p>          Una vez terminada la configuración de los datos que vamos a presentar en nuestra página, al invocar el método "page()", necesitaremos un modo de acceso, mediante url, para que podamos acceder a esta página y ver sus datos.</p> <p>          En esta tarea nos ayudará el archivo <strong>listado_noticias.routing.yml </strong>, dentro de este archivo vamos a definir la url hacia nuestra página, el namespace para que drupal pueda encontrar en nuestro controlador el método que mostrará los datos y finalmente los permisos asociados a nuestro contenido, que serán los permisos por defecto, para que cualquier usuario que entre a la web, pueda verlo sin problemas.</p> <p>          Es muy importante respetar los espacios al escribir los datos dentro del archivo rounting, se recomienda evitar la tecla tab para hacerlo y en su lugar, es mejor la barra espaciadora del teclado, contando con dos espacios a cada nueva línea que vayamos añadiendo.</p> <pre> listado_noticias.listado: path: '/listado-noticias' defaults: _controller: '\Drupal\listado_noticias\Controller\ListadoNoticiasController::page' requirements: _permission: 'access content' </pre> <h3>     Paso 5 Creación de la plantilla:</h3> <p>          La última fase de este desarrollo, antes de activar el módulo, será la creación de nuestra plantilla, para dar formato a la presentación de los datos, una vez activado nuestro módulo.</p> <p>          Para los nombres de las plantilla, se debe utilizar el guión medio "-", en lugar del guión bajo "_", y el nombre que debemos utilizar será el mismo de nuestra función tema, que hemos declarado en el <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/9.0.x">function hook_theme</a>.</p> <p>          Por lo tanto, el nombre que tendremos que utilizar en este ejemplo será <strong>"listado-noticias.html.twig", </strong>además, colocaremos nuestras plantillas dentro de una carpeta llamada templates, siguiendo con la estructura habitual de drupal para todos sus módulos.</p> <p>          Ahora que ya tenemos la plantilla creada, sólo resta imprimir los valores usando las dobles llaves, ej.: {{ title }} y en el caso de las noticias, crearemos un "ciclo for", para poder recorrer el array de items y acceder a todos sus datos relacionados.</p> <pre> &lt;h3&gt;{{ title }}&lt;/h3&gt; &lt;ul&gt; {% for noticia in items %} &lt;li&gt;{{ noticia.title }}&lt;/li&gt; {% endfor %} &lt;/ul&gt;</pre> <p>          Ya podemos activar nuestro módulo y luego al acceder a la url que hemos definido dentro del archivo  <strong>listado_noticias.routing.yml, </strong>veremos nuestra página con todos los datos que habíamos configurado.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 74.31%;" data-ratio="74.31" data-b-token="b-bdf6446405c" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Custom Module Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Custom Module Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630e32bf26b6f.png?itok=als3a_wd" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="483" typeof="foaf:Image" /></div></div> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sáb, 18/03/2023 - 23:12</span> Sat, 18 Mar 2023 22:12:00 +0000 webmaster 408 at https://drupaladicto.com