template stylesheets style for comment php templates layout symfony twig

stylesheets - twig for php



Twig extiende la plantilla con la condiciĆ³n (5)

Yo uso Symfony 2 con Twig y mi pregunta es bastante simple:

En una vista, quiero extender uno de los diseños en función de una variable. Si la variable es false , quiero extender UdoWebsiteBundle::layout.html.twig y si es true quiero extender UdoWebsiteBundle::layout_true.html.twig .

Aquí está el código que probé:

{% block layout_extender %} {% if intro == ''false'' %} {% extends ''UdoWebsiteBundle::layout.html.twig'' %} {% else %} {% extends ''UdoWebsiteBundle::layout_true.html.twig'' %} {% endif %} {% endblock %}

Me sale este error:

Las etiquetas de múltiples extensiones están prohibidas en "UdoWebsiteBundle: home: home.html.twig" en la línea 7

¿Hay alguna otra forma de lograr esto?


No puede extender varias plantillas, por eso tiene el error, si así lo desea, debe insertarlas en una matriz como la siguiente.

{% extends [''MyAppCustomBundle::Layout/layout.html.twig'', ''FOSUserBundle::layout.html.twig''] %}

Pero necesitará usar la versión 1.2 de Twig para hacerlo. http://twig.sensiolabs.org/doc/tags/extends.html


Para mantenerlo ordenado, debe usar el soporte de herencia dinámica de Twig usando una variable, definida en su controlador, como la plantilla base:

{% extends parent_template_var %}

Si la variable se evalúa como un objeto Twig_Template, Twig lo usará como plantilla principal.

Defina parent_template_var en su controlador:

if($intro == ''false'') $parent_template_var = ''UdoWebsiteBundle::layout.html.twig''; }else{ $parent_template_var = ''UdoWebsiteBundle::layout_true.html.twig''; } return $this->render(''::/action.html.twig'', array(''parent_template_var'' => $parent_template_var ));

http://twig.sensiolabs.org/doc/tags/extends.html



Respuesta de la http://twig.sensiolabs.org/doc/tags/extends.html :

Herencia condicional

Como el nombre de la plantilla para el padre puede ser cualquier expresión Twig válida, es posible hacer que el mecanismo de herencia sea condicional:

{% extends standalone ? "minimum.html" : "base.html" %}

En este ejemplo, la plantilla extenderá la plantilla de diseño "minimum.html" si la variable independiente se evalúa como verdadera y "base.html" de lo contrario.


Todo esto tiene sentido para hacer esta plantilla o esa plantilla.

Pero déjame describir otra situación. Tiene un formulario de perfil y un formulario donde los usuarios pueden cargar documentos relacionados con el perfil personal. Como el formulario de perfil ya es muy largo, los documentos se movieron a una nueva forma.

Todo funciona bien Ahora queremos usar las pestañas de arranque para hacer Perfil | Documentos para la facilidad de uso.

Ahora sé porque estamos usando dos formularios separados si envía los documentos, los cambios en el perfil no se guardarán y viceversa.

He agregado el formulario del documento en la pestaña usando

<div role="tabpanel" class="tab-pane" id="documents"> {{ render(controller(''ManyAppBundle:Document:createDocument'', {''viewOnly'': true})) }} </div>

El ''viewOnly'': true es un parámetro de consulta y no es requerido por la acción.

Mi pregunta ahora es si la pestaña de perfil representa la plantilla del documento, solo debe mostrar el widget de carga y el de envío, ya que cuando va directamente a la página del documento debe mostrar el título y la barra lateral y todo. Así que lo intenté

{% if not viewOnly %} {% extends ... %} {% endif %}

Eso dio problemas porque no puedes usar extends dentro de un if. Como sugirió en otras respuestas, intente usar

{% extends viewOnly == true ? ... %}

Esto resolvió el problema de Twig hasta la ejecución del código cuando viewOnly es falso.

Cuando viewOnly es falso, debe ampliar la plantilla base utilizada por todas las demás plantillas, pero si es verdadero, solo quiero mostrar esto:

{{ form_start(form, { ''style'': ''horizontal'', ''col_size'': ''sm'' }) }} {% if form.documents is defined %} {{ form_row(form.documents) }} {% endif %} {{ form_row(form.submit, { ''attr'': { ''class'': ''btn btn-success'' } }) }} {{ form_end(form) }}

Pero ahora con la parte superior

{% extends viewOnly == true ? ... %}

si viewOnly se convierte en falso, falla con la plantilla "" no se puede encontrar.

¿Hay alguna manera de decir extiende esta plantilla específica que será el mismo resultado de no extender ninguna plantilla?

O, como alternativa, ¿hay alguna manera de decir extender esto cuando solo se ve verdad, pero no ocurre nada en el error?