condicional https://drupaladicto.com/ es 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 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 Contenidos de Prueba | Generados con el módulo Devel https://drupaladicto.com/curso/programacion-drupal/contenidos-de-prueba-generados-con-el-modulo-devel <span class="field field--name-title field--type-string field--label-hidden">Contenidos de Prueba | Generados con el módulo Devel</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-870 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-870 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-870 .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-870"> <section id="video-only-870" 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-590-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-590-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-590-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/eGXutQIDMIw&amp;max_width=0&amp;max_height=0&amp;hash=xkWV5NsCeCudS1gHm_0C5rpeAX6WhQh7VbpwqGyLRG0" 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-590-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-1185" 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"><p>      Cuando estamos empezando con el desarrollo o implementación de cualquier proyecto, en la mayoría de los casos nos resultará necesario la creación de contenidos con los que podamos realizar pruebas de todo tipo.</p> <p>     Para realizar esta tarea, en Drupal contamos con el módulo <strong>Devel Generate</strong>, integrado dentro de las dependencias del módulo <a href="https://www.drupal.org/project/devel" target="_blank">Devel</a>. Por lo que, una vez instalado y activado en nuestro Drupal, sólo tendremos que dirigirnos a la url "/admin/config/development/generate/content", y allí veremos el listado de todos los tipos de contenidos que tengamos creados en nuestro proyecto.</p> <h3>CÓMO INSTALAR Y CONFIGURAR EL MÓDULO:</h3> <p><strong>Paso 1 Descargar el módulo:</strong></p> <p>     Lo primero que tendrás que hacer es descargarlo, para ello, a partir de Drupal 8 se recomienda que utilices el gestor de paquetes <a data-extlink="" href="https://getcomposer.org/" rel="noreferrer" target="_blank">Composer</a>, ya que te facilitará tanto la instalación como futuras actualizaciones del tus proyectos. No obstante también podrías descargarlo desde la <a data-extlink="" href="https://www.drupal.org/project/devel" rel="noreferrer">Página oficial del módulo</a> y una vez descargado, tendrás que colocarlo en la carpeta "modules" o "modules/contrib", dependiendo de tu instalación y asegurarte de descargar todas sus dependencias o el módulo no funcionará, esta es una de las ventajas con las que cuentas al hacer la instalación usando Composer.</p> <p><strong>Paso 2 Activación del módulo</strong> :</p> <p>     Para activar el módulo Devel, al igual que todos los demás módulos contribuidos de Drupal, tendrás la posibilidad de hacerlo, mediante el uso de la herramienta Drush, con el comando <strong>"drush en devel -y"</strong>, que sirve para activar cualquier módulos y todas sus dependencias, o desde la interfaz de Drupal.    </p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 25.08%;" data-ratio="25.08" data-b-token="b-bf562569176" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img data-entity-uuid="bbffe9dd-d7d5-4f17-9b0a-52076bde5c34" loading="lazy" alt="Devel Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/modulo_devel.png?itok=DyCTE5F_" 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="163" typeof="foaf:Image" /></div></div> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 81.38%;" data-ratio="81.38" data-b-token="b-07e736f3d56" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img data-entity-uuid="e63f7359-7862-4490-b2de-6abe96112e6c" loading="lazy" alt="Devel Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/generar_contenido.jpg?itok=dQhk5U7r" 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="529" typeof="foaf:Image" /></div></div> <p>     Además de poder generar automáticamente nuestros contenidos, podremos configurar algunas opciones adicionales como, especificar su fecha de publicación, comentarios relacionados, títulos para los contenidos con un límite de caracteres específico, el idioma o incluso los usuarios que los crearon, esta última opción nos facilitará el testeo de los permisos de usuario.</p> <p>     Para generar nuestro contenidos, sólo tendremos que marcar las opciones con las que deseamos trabajar, es recomendable intentarlo la primera vez como poco contenido para estar seguros de obtener lo que pensábamos o si hará falta modificar algún campo.</p> <p>     Si no estás conforme con el contenido generado o simplemente quieres volver a generar contenidos otra vez, puedes seleccionar la opción de eliminar todos los contenidos previamente creados antes de ejecutarlo.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 74%;" data-ratio="74" data-b-token="b-4b2c2db1ff0" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img data-entity-uuid="f0925341-0457-435c-b020-899f5a76c3ec" loading="lazy" alt="Devel Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/como_generar_contenidos.jpg?itok=P7foOYOI" 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="481" typeof="foaf:Image" /></div></div> <p>     Una vez que hayamos revisado todos los campos que nos interesan, haremos clic en el botón que aparece en la parte inferior de la pantalla y comenzará el proceso inmediatamente.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 62.62%;" data-ratio="62.62" data-b-token="b-529a6e0212d" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img data-entity-uuid="b59a89a7-77d6-44a7-b385-3b59d1edc906" loading="lazy" alt="Devel Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/idioma_y_usuarios.jpg?itok=faRslW2Z" 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="407" typeof="foaf:Image" /></div></div> <p>     Cuando se haya realizado el proceso de generación de nuestros contenidos, veremos un mensaje de confirmación en la parte superior de la pantalla, con la cantidad y el tipo de contenido que decidimos utilizar.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 49.91%;" data-ratio="49.91" data-b-token="b-6a5876e61c1" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img data-entity-uuid="dac200ad-bc83-4875-81f5-e8f373ae57f9" loading="lazy" alt="Devel Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/generados.png?itok=lhYaSXTY" 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="533" height="266" typeof="foaf:Image" /></div></div> <p>     Para comprobarlo, sólo tendremos que dirigirnos al listado de contenidos en la url "/admin/content" y veremos el listado de contenidos generados por el módulo con las configuraciones adicionales, si es que hemos seleccionado alguna.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 49.38%;" data-ratio="49.38" data-b-token="b-4e4a8d061ee" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img data-entity-uuid="182f2e84-9c0d-473e-93c7-26d287a6072f" loading="lazy" alt="Devel Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/listado_generados.jpg?itok=Jtk5KaGC" 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="321" 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">Dom, 19/03/2023 - 09:10</span> Sun, 19 Mar 2023 08:10:21 +0000 webmaster 409 at https://drupaladicto.com Comprueba el valor de un campo SELECT en un TWIG https://drupaladicto.com/snippet/comprueba-el-valor-de-un-campo-select-en-un-twig <span class="field field--name-title field--type-string field--label-hidden">Comprueba el valor de un campo SELECT en un TWIG</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>Este campo evalúa entre los valores "izquierda" o "derecha" de un SELECT y ejecuta un código según su valor </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">Mié, 01/03/2023 - 09:03</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>Crea un campo del tipo select con los valores que quieres evaluar para ejecutar tu código<br />  </li> <li>Comprueba el valor de la selección y ejecuta tu código a partir de ese resultado.</li> </ol></div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><pre> {% if content.field_posicion_para_textos.0|render == "izquierda" %} // Imprime algo en esta parte {% else %} // Imprime otra cosa {% endif %}</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_69.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/condicional" hreflang="es">condicional</a></div> <div class="field__item"><a href="/categoria/fields" hreflang="es">fields</a></div> <div class="field__item"><a href="/categoria/campos" hreflang="es">campos</a></div> <div class="field__item"><a href="/categoria/campos-referenciados" hreflang="es">campos referenciados</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> Wed, 01 Mar 2023 08:03:50 +0000 webmaster 94 at https://drupaladicto.com hook_preprocess_node() https://drupaladicto.com/snippet/hookpreprocessnode <span class="field field--name-title field--type-string field--label-hidden">hook_preprocess_node()</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>La Preprocess Function sirve para modificar los comportamientos por defecto de Drupal, en este caso vamos a acceder al formulario por defecto y lo haremos disponible para colocarlo dentro de un nodo y posteriormente dentro de un paragarphs, así podremos imprimirlo en cualquier lugar y posición dentro de la web.</p> <p>Si quieres aprender más sobre las preprocess functions</p> <ul><li> <p><a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_preprocess/8.2.x">function hook_preprocess</a></p> </li> <li> <p><a href="https://www.drupal.org/docs/theming-drupal/twig-in-drupal/twig-best-practices-preprocess-functions-and-templates">Twig best practices - preprocess functions and templates</a></p> </li> </ul></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, 28/02/2023 - 20:59</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>Creamos un contenido con los campos que acompañarán al formulario Ej.: detalles_contacto<br />  </li> <li>En nuestro archivo SUBTEMA.theme (que forma parte de los archivos de todos los temas y subtemas), copiaremos el código que está debajo y cambiaremos los nombres por los de nuestro contenido.<br />  </li> <li>Instalar el módulo Paragraphs y crear el Contenedor para nuestro "Contenido + Formulario". Ej.: bloque_formulario.<br />  </li> <li>Activamos el modo debug o depurador, para averiguar la sugerencia de la plantilla correspondiente al paragraphs.<br />  </li> <li>Creamos la plantilla y añadiremos dentro la variable que imprimirá nuestro "Contenido + Formulario"<br />  </li> <li>Creamos la plantilla para nuestro nodo "detalles_contacto" y ponemos la variables que imprimirán sus contenidos + Formulario</li> </ol></div> </div> <div class="clearfix text-formatted field field--name-field-codigo field--type-text-long field--label-hidden field__item"><pre> /** * Implements hook_preprocess_node() for node.html.twig. */ function SUBTEMA_preprocess_node(array &amp;$variables) { if(isset($variables['node'])){ $node = $variables['node']; if(($node-&gt;getType() == 'detalles_contacto')) { $message = \Drupal::entityTypeManager() -&gt;getStorage('contact_message') -&gt;create(array( 'contact_form' =&gt; 'feedback', //ID(NOMBRE MAQUINA) del formulario )); $form = \Drupal::service('entity.form_builder')-&gt;getForm($message); $variables['feedback_form'] = $form; } } }</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_39.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/preprocess-function" hreflang="es">preprocess function</a></div> <div class="field__item"><a href="/categoria/node" hreflang="es">node</a></div> <div class="field__item"><a href="/categoria/programacion" hreflang="es">programacion</a></div> <div class="field__item"><a href="/categoria/code" hreflang="es">code</a></div> <div class="field__item"><a href="/categoria/codigo" hreflang="es">código</a></div> <div class="field__item"><a href="/categoria/desarrollo" hreflang="es">desarrollo</a></div> <div class="field__item"><a href="/categoria/condicional" hreflang="es">condicional</a></div> <div class="field__item"><a href="/categoria/contenidos" hreflang="es">contenidos</a></div> <div class="field__item"><a href="/categoria/hook" hreflang="es">hook</a></div> <div class="field__item"><a href="/categoria/hooks" hreflang="es">hooks</a></div> <div class="field__item"><a href="/categoria/forms" hreflang="es">forms</a></div> <div class="field__item"><a href="/categoria/formularios" hreflang="es">formularios</a></div> <div class="field__item"><a href="/categoria/webform" hreflang="es">webform</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> Tue, 28 Feb 2023 19:59:45 +0000 webmaster 64 at https://drupaladicto.com