2013-01-01 4 views
12

Czy jest jakiś sposób to zrobić? Mam szablon, który generuje jeden artykuł na blogu.Zawiera gałązkę szablonu rozszerzającego blok rodzica raz

Teraz na Indeks stronie pokazuję 10 artykułów o tym, że szablon w dla pętli i na pokazać stronę I tylko jedna.

index:

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

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

pokaz:

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

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

Teraz jest jakiś sposób, aby article.html.twig dodać coś do {% block stylesheets %} szablonów, które obejmowały go automatycznie? Jeśli jest to możliwe, w jaki sposób mogę zapobiec dodaniu go 10 razy podczas korzystania z pętli for?

Staram się, aby moje szablony "fragmentów" (szablony używane do integracji) definiowały arkusze stylów, których używają, i sprawiają, że "wstrzykują" je na stronę.

+0

Jak rozumiem, nie próbujesz rozszerzyć elementu nadrzędnego (artykuł nie indeksuje ani wyświetlać?), Ale blok szablonu, który go zawiera. Czy to jest poprawne? –

+0

Tak, to prawda, artykuł niczego nie rozszerza. –

+0

To po prostu strona "fragment", jeśli mogę tak to nazwać, otrzymuje obiekt "artykuł" i "rysuje" go (tytuł, treść, obrazy, tagi, autor, data itd.). –

Odpowiedz

0

Można użyć nowego bloku (nie sprawdzone)

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

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

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

{# ... #} 

Edycja: Dodano {{ parent() }}, będzie wydrukować każdą treść blok ma już.

+0

Niezbyt pomocny, ponieważ jeśli pójdę tą drogą, mogę po prostu dodać arkusz stylów artykułu bezpośrednio do index.html.twig i show.html.twig, nie ma sensu tworzyć kolejnego bloku. Chcę, aby artykuł sam się pojawił, więc gdy mam stronę zawierającą 10 szablonów (artykułów, tagów, pasków bocznych, użytkowników itd. Itd.) Sama w sobie nie muszę się martwić o to, że znajduje się ona w głównym szablonie, ale pozwala każdemu dołączonemu szablonowi zdefiniować jej Zależności CSS. –

+0

@igorpan ah, źle zrozumiałem twoje pytanie. Zmieniłem swoją odpowiedź. –

+0

To była pierwsza rzecz, którą próbowałem, niestety, nie działa i zgłasza błąd: "Wywołanie" nadrzędnego "na szablonie, który nie rozszerza ani" nie wykorzystuje "innego szablonu jest zabronione". –

16

Czy próbowałeś użyć use? Niestety nie jestem całkowicie pewien, czy mam pytanie poprawnie, ale {% use %} nie zostało tutaj wymienione.

Jak rozumiem pytanie, na które masz swoje article.html.twig i uwzględnij je w index.html.twig. Teraz chcesz dodać coś z article.html.twig do index.html.twig? Mianowicie do bloku {% stylesheets %}.

Jeśli mam jak używać {% use %}, możesz spróbować tego.

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 %} 

nie mam okazję go przetestować, ale docu stwierdza kilka bardzo ciekawych rzeczy i wygląda na to, że może to być sposób na zrobienie tego.

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.

Jestem raczej nowy w stackoverflow. Więc proszę, jeśli moja odpowiedź jest zupełnie bezużyteczna, czy mógłbyś po prostu opublikować komentarz przed głosowaniem w dół, a ja go usunąć? Jeśli jednak pomoże, a w moim przykładzie występują tylko niektóre błędy, poinformuj mnie o tym, a ja to naprawię.

+0

Spoglądam na 'include',' extends', 'use', itp., Zbyt długo ...' use' faktycznie działa. Jednak trzy rzeczy: ** 1. ** Wydaje się niemożliwe, aby rozszerzyć blok rodzica bez modyfikacji rodzica (dodaj 'blok (" ... ")'). ** 2. ** Twój przykład (choć nie dotyczy mnie) nie zadziała: 'use' odmawia załadowania szablonów ciałami, a' include' nie ma tu większego sensu. W takim razie potrzebne są dwa szablony. ** 3. ** Odpowiedzi nigdy nie są usuwane z powodu błędu;). Dostaniesz nagrodę, ale poczekam - może ktoś inny zna inne rozwiązanie. Dzięki, jednak. – Lukas

+0

Przykład PO po prostu trochę mnie zmieszał. Nie wiedziałem, jak dokładnie on chce działać (początkowy post i powyższe komentarze są nieco sprzeczne), ale twój punkt ** 2. ** również przyszedł mi do głowy. Czy można zamienić include na inne użycie tego szablonu i po prostu owinąć pętlę '{% for ...%}' w innym bloku? ** 3. ** Jestem trochę ostrożny, ponieważ, jak powiedziałem, nie byłem całkiem pewien, jak OP chce, żeby się zachowywał/działał. W rzeczywistości jest 7 dni do zrobienia i na SO ... są geniusze na każdym rogu: D – SirDerpington

+1

Widzę, że nie jestem sam na tym. I nadal nie znalazłem sposobu, aby to zrobić. Najczęstszym przypadkiem użycia dla mnie będzie "leniwe ładowanie" arkuszy stylów. Tak więc mamy "szablon główny", który wykorzystuje w pakiecie "szablonów fragmentów". Każdy szablon fragmentu może zdefiniować własne arkusze stylów, które następnie zostaną dołączone do głowy mistrza. –