Rozszerzanie czy włączanie-co jest lepsze w gałązce?

Dlaczego Twig documentation zaleca używanie rozszerzenia zamiast włączania? Dokumentacja Symfony 2 mówi, ponieważ " w Symfony2 lubimy myśleć o tym problemie inaczej: szablon może być udekorowany przez inny."ale nic więcej. To tylko kaprys autora czy coś więcej? Dzięki za pomoc.

Author: j0k, 2011-08-13

5 answers

Kiedy używać dziedziczenia:

Masz 50 stron dzielących ten sam układ-tworzysz układ.gałązki jako rodzica, a każda strona rozszerza ten układ.gałązka. Więc rodzic jest generyczny, a dziecko jest specyficzne.

Kiedy używać include:

Spośród 50 stron jest 6 stron, które dzielą fragment HTML - tworzysz fragment współdzielony.gałązka i zamieść ją na tych 6 stronach.

Inne użycie:

Zauważasz, że twój układ.gałązka jest bita zaśmiecony i chciałbyś go modularyzować, więc podzieliłeś pasek boczny.przenieś do osobnego pliku i dołącz go do układu.gałązka.

Czy możesz użyć include dla przypadku użycia dziedziczenia:

Jasne, Utwórz kawałki dla nagłówka, stopki i tego, co masz, i użyj obejmuje w każdej z 50 stron. Ale to zły projekt, jak wyjaśniono powyżej.

Czy można użyć dziedziczenia dla przypadku użycia include:

Oczywiście, Utwórz pusty blok dla współdzielonego fragmentu w rodzicu układ.gałązki i utwórz układ potomny drugiego poziomu-z-chunk.gałązka, która rozszerza układ.gałązka i wypełnia blok kawałka, a 6 stron w powyższym przykładzie, które dzielą kawałek, może następnie rozszerzyć układ z kawałkiem.gałązka zamiast układu.gałązka. Ale to znowu jest zły projekt, ponieważ blok części nie jest współdzielony przez wszystkie dzieci i nie powinien iść do rodzica bazowego. A Ty zaśmieciłaś drzewo dziedziczenia.

Więc:

Jak wyjaśniono powyżej - to kwestia designu, a nie programowalność. Nie chodzi o to: mogę osiągnąć ten sam wynik za pomocą innej techniki programowania, o której użycie jest lepsze projektowanie.

 46
Author: Basel Shishani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 14:31:30

Podobała mi się odpowiedź ramion, ale myślę, że przegapiłaś to, co powiedział. Include i extend to różne rzeczy: jeśli rozszerzysz, możesz zmienić rodzica, za pomocą include nie możesz.

Np. Rozszerzam mój układ bazowy, Tak:

{% extends "layout/default.html" %}

To, co mi teraz daje, to używanie klocków od rodzica! Nie masz tego w zestawie. Teraz możesz np. stworzyć tytuł specjalnie dla każdej strony:

{% block title %}My title just for this page{% endblock %}

Teraz, w tym daje bardziej sztywny i stały html, e. g:

{% include 'header.html' %}

I co najwyżej może entity repitition, np. wiersze tabeli:

{% include 'foo' with {'foo': 'bar'} %}

Więc budujesz swoje układy za pomocą includes i rozszerzasz swoje układy bazowe, aby upewnić się, że witryna działa zgodnie z wyznaczonym projektem.

 8
Author: Tjorriemorrie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-14 08:08:10

Aby dodać kolejną, hybrydową opcję do miksu, możesz również rozważyćembed . Pozwala na wykorzystanie dziedziczenia z extends, ale także pozwala na wielokrotne ponowne użycie, tak jak robi to include.

Trywialny przykład:

" partials / titleize.gałązka": {]}

<h2 class="title">{% block title %}Default Title{% endblock %}</h2>

"jakiś-szablon.gałązka " dziedziczy z niej za pomocą embed:

{% embed "partials/titleize.twig" %}
    {% block title %}Section 1{% endblock %}
{% endembed %}

...

{% embed "partials/titleize.twig" %}
    {% block title %}Section 2{% endblock %}
{% endembed %}

Rendery

<h2 class="title">Section 1</h2>
...
<h2 class="title">Section 2</h2>
 6
Author: yuvilio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 05:43:53

To zależy od tego, co próbujesz osiągnąć. Rozszerzając widok, używasz wzoru dekoratora. Jeśli znasz Symfony 1, jest to takie samo, jak posiadanie układu.plik php, który wyświetla $sf_content. Używasz tej metody, gdy masz wspólną "powłokę" html, której chcesz użyć w całym projekcie.

Włączenie widoku z drugiej strony pozwala wprowadzić jeden widok do drugiego.

Załóżmy, że masz osobistą stronę ze stronami "about" I "contact". Ty byś 3 views: base.html.twig
about.html.twig
contact.html.twig

base.html.twig zawiera wspólny kod HTML używany przez Twoją witrynę. Może to obejmować nagłówek, nawigację, stopkę itp.)

about.html.twig i contact.html.twig zawierają tylko HTML dla tych konkretnych sekcji. Oba te widoki rozszerzają base.html.twig. Eliminuje to powielanie kodu. Jeśli chcesz dokonać zmiany w nagłówku, wystarczy dokonać zmiany w jednym miejscu - base.html.twig.

Teraz Załóżmy, że masz inną zawartość, którą chcesz wyświetlić na stronach "about" I "contact" (ale niekoniecznie na innych stronach) - możesz utworzyć dla niej osobny widok i dołączyć go do about.html.twig i contact.html.twig.

Dokumenty nie zalecają rozszerzania na including, są to dwie oddzielne metody, które powinny być używane do konkretnych celów.

Mam nadzieję, że to pomoże!

 4
Author: Steven Mercatante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-13 19:32:34

Rozszerzenie gałązki jest INNE i znacznie potężniejsze niż include. Spróbuj myśleć o rozszerzeniu, jak o nim z przeciwnej strony niż myślisz o include. Z rozszerzeniem można zaczynać od widoku końcowego (czyli ok.htm) i działa wstecz, dodając warstwy, które są potrzebne do utworzenia strony w witrynie. Na każdym poziomie z rozszerzeniem bloki zawartości nadpisują lub dodają do zawartości nadrzędnej dla tego bloku.

"Include" nie jest tak elastyczny, jesteś zaczynając od szablonu podstawowego i przejdź do about.widok htm i nie można pracować ze wspólnymi blokami zawartości w różnych plikach.

Sprawdź ten bit na dziedziczeniu trójpoziomowym, który jest wspólnym wzorem rozszerzenia: http://symfony.com/doc/current/book/templating.html#three-level-inheritance

 1
Author: Acyra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-14 02:53:31