2013-01-01 5 views
12

Bunu yapmanın bir yolu var mı? Bir blog makalesi çıkaran bir şablonum var.Twig, ebeveynin bloğunu bir kez genişleten şablon dahil

Şimdi endeksi sayfada ben döngü için bu şablonu dahil ederek 10 makaleleri gösterecek ve sayfayı göstermek üzerine ben yalnızca bir tanesini gösterir.

endeksi:

{% block stylesheets %} 
    {# some stylesheets here #} 
{% endblock %} 

{% for article in articles %} 
     {% include VendorBundle:article.html.twig with { 'article': article } %} 
{% endfor %} 

gösterisi:

{% block stylesheets %} 
     {# some stylesheets here #} 
{% endblock %} 

{% include VendorBundle:article.html.twig with { 'article': article } %} 

Şimdi article.html.twig otomatik olarak dahil şablonları {% block stylesheets %} bir şey eklemek yapmak için bir yolu var mı? Mümkünse, for döngüsünü kullanırken bunu 10 kez eklemesini nasıl engellerim?

"Parçalar" şablonlarını (dahil edilmek için kullanılan şablonlar) yapmaya çalışıyorum, kullandıkları stil sayfalarını tanımlar ve bunları sayfalara "enjekte eder".

{# template.html.twig #} 
{% block article_styles -%} 
    {{ parent() }} 
    <link rel=stylesheet href=...> 
{%- endblock %} 

{# ... #} 

{# index.html.twig #} 
{% block stylesheets -%} 
    {% block article_styles '' %} 
{%- endblock %} 

{% for ... -%} 
    {% include VendorBundle:template.html.twig with {'article': article} %} 
{%- endfor %} 

Düzenleme:: {{ parent() }} eklendi, bu blok zaten her içeriği yazdırır

+0

Anladığım kadarıyla, ana nesneyi genişletmeye çalışmamanız (makale, dizin veya gösterim kapsamı değil), ancak bloğu içeren şablon bloğudur. Bu doğru mu? –

+0

Evet, bu doğru, makale hiçbir şey uzatmıyor. –

+0

Sadece bir sayfa "parçası", eğer buna benzer şekilde diyebilirsem, "makale" nesnesini alır ve "çizer" (küçük, içerik, resimler, etiketler, yazar, tarih vb.). –

cevap

0

Yeni bloğu (değil test) kullanabilir.

+0

Bu şekilde gidersem, makalenin stil sayfasını doğrudan index.html.twig ve show.html.twig dosyasına ekleyebilirim. Makalenin kendi başına yapmasını istiyorum. Bu yüzden, içinde 10 adet şablon (makale, etiket, kenar çubuğu, kullanıcı vb.) Bulunan bir sayfam olduğunda, ana şablonun içinde endişelenmek zorunda değilim, ancak her bir şablonun kendi CSS bağımlılıkları. –

+0

@igorpan ah, Sorunuzu yanlış anlamış bulunmaktayım. Cevabımı değiştirdim. –

+0

Bu denediğim ilk şeydi, ne yazık ki, işe yaramıyor ve bir hata atıyor: 'Genişletme olmayan bir şablonda" ebeveyni "çağırmak ya da başka bir şablon kullanmak" yasaktır "yasaktır. –

16

use'u kullanmayı denediniz mi? Maalesef sorunun doğru olup olmadığını tam olarak bilmiyorum ama {% use %} burada belirtilmedi.

Sorunuzu anladığım kadarıyla, article.html.twig numaralı telefonunuzu aldınız ve buna örn. index.html.twig. Şimdi article.html.twig'dan index.html.twig'a bir şeyler eklemek ister misiniz? Yani {% stylesheets %} bloğuna.

{% use %}'u nasıl kullanırsam, bunu böyle deneyebilirsiniz.

article.html.twig

{% block stylesheets %} 
    <link rel="stylesheet" href="{{ asset('bundles/mybundle/css/article.css') }}" type="text/css" /> 
{% endblock %} 
{% block article %} 
    {# whatever you do here #} 
{% endblock %} 

index.html.twig

{% use "VendorBundle:article.html.twig" with stylesheets as article_styles %} 
{% block stylesheets %} 
    {{ block('article_styles') }} 
    {# other styles here #} 
{% endblock %} 
{% for article in articles %} 
     {% include VendorBundle:article.html.twig with { 'article': article } %} 
{% endfor %} 

bunu test etme şansı değil ama belgesel birkaç çok ilginç şeyler devletler ve Bunu yapmanın yolu bu gibi görünüyor.

Horizontal reuse is an advanced Twig feature that is hardly ever needed in regular templates. It is mainly used by projects that need to make template blocks reusable without using inheritance.

Yığınlama akışında yeniyim. Cevabım tamamen işe yaramazsa lütfen oylamadan önce bir yorum yayınlayabilir ve silebilir miyim? Ancak, yardımcı olur ve örneğimde bazı hatalar varsa, beni bilgilendirin ve düzelteceğim.

+0

Çok uzun süredir 'include',' extends', 'use' vb. Ancak, üç şey: ** 1. ** Bir ebeveynin bloğunu ebeveyn değiştirmeden genişletmek imkansız gibi görünüyor (ekle 'blok (' ... ') '). ** 2. Senin örneğin (beni etkilememekle birlikte) işe yaramayacak: 'use' şablonlar bedenlerle yüklenmeyi reddederken, 'include' burada çok anlamlı olmazdı. O zaman iki şablona ihtiyaç var. ** 3. Cevaplar yanlış olmadığından asla silinmez;). Ödül alacaksın, ama bekleyeceğim - belki başka biri başka bir çözümü biliyordur. Yine de teşekkürler. – Lukas

+0

OP'nin örneği bana biraz kafa karıştırdı. Tam olarak nasıl çalışmasını istediğini bilemedim (yazı ve yorumların başlaması biraz çelişkilidir) ama ** 2. ** noktanız da aklıma geldi. İçeriğin bu şablonun başka bir kullanımıyla değiştirilmesi ve sadece {% for ...%} 'döngüsünün başka bir satırda sarılması mümkün müdür? ** 3. Sadece biraz ihtiyatlıyım çünkü dediğim gibi, OP'nin nasıl davrandığını/çalışmasını istediğini tam olarak bilmiyordum. Aslında, 7 gün sürecek ve SO üzerinde… her köşede dahiler var: D – SirDerpington

+1

Görüyorum ki bu konuda yalnız değilim. Ve hala bunu yapmanın bir yolunu bulamadım. Benim için en yaygın kullanım örneği, stil sayfalarının "tembel yüklenmesi" olacaktır. Yani, "parça şablonları" demetini içeren "ana şablon" var. Her fragman şablonu, daha sonra master'ın başına eklenecek kendi stil sayfalarını tanımlayabilir. –