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.
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.
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.
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>
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!
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
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