Template inheritance docs – thanks and notes
- dakur
- Member | 493
I'm not pretty sure where to raise the issue so I'll post it here. I've just read the new template inheritance docs and I want to express big thanks to @DavidGrudl as that is just what I was waiting for so long – now I pretty much understand all these include stuff and what they are for. Though, I have few things I want to mention, hopefully to improve it a bit further. These are my notes from reading the docs.
First, I was pretty much confused by {include block $name}
syntax. I somewhat remembered what it means from a topic on this
forum, but in docs it appears out of nowhere in one place and is presented
together with another feature (block name passed by variable) so I was confused
what the code example is related to, how does it relate to what is before and
how the block
thing it is different from simply
{include xyz}
. It was also presented as a must, I've made a PR fix
so that it is presented as an option.
A small improvement would be to write a use-case for Dynamic Block Names as there is just mentioned it is there, but have no clue what that could be good for (and I would like to!).
As per horizontal inheritance, I'm not pretty sure what does the
inheritance
word (whether in Czech or English) mean in here. I am
probably just not able to see some concept the word came from, because importing
blocks from different template does not seem like class inheritance to me –
maybe rather like trait
. I think talking about
reusability
fits more here. The word reuse
is used
there alongside inheritance
in there – what is the relationship
between them actually?
Finally, when I saw embed
explained there finally, a question
raised in my head – why do we need {layout}
,
{include}
and {import}
any more? Couldn't we just
unite it into {embed}
and have 3 tags less, which would make
things much clearer? Honestly, I work with Latte for years and until now I had
no clear idea of the differencies between all these tags. Thus my joy of this
docs article, but still, I can not say, if {include file.latte}
and {import file.latte}
make the same thing. Do they?
Anyway thank you once more for your work and hopefully this can help a
bit.
I did not make another PR because these things need more skilled man to
process. :-)
P.S.: looking forward to the day when I will be able to work with Latte API for creating macros and understand Forms API to create fully featured custom controls. These are my two favourite bits which I miss so much in the docs. :-)
Last edited by dakur (2020-12-01 13:51)
- David Grudl
- Nette Core | 8218
ad horizontal inheritance: The term horizontal reuse will maybe be
better. In common with inheritance it has overriding. So when you
import some blocks using {import}
to the main template, you can
have the same named blocks in that main template, which will overwrite them. And
you can use {include parent}
in that blocks to include original
imported blocks.
embed vs layout vs include: {embed}
can be used instead of
{include}
and {layout}
, but it is pair macro a and you
probably won't want to write {embed file.latte}{/embed}
instead of
{include file.latte}
and wrap the whole child template in
{embed 'layout.latte'} ... {/embed}
instead of single
{layout layout.latte}
in the header.
import vs include: include is like include 'header.phtml'
in
PHP, import is like import from module
in JavaScript, the first
prints the contents, the second loads the blocks, it is not interchangeable.
- David Grudl
- Nette Core | 8218
I tried to rename some terms and headings https://github.com/…8ac7a17e1804
- David Grudl
- Nette Core | 8218
I added example for Dynamic Block Names.
@dakur Are there still some unclear things?
- dakur
- Member | 493
I tried to rename some terms and headings https://github.com/…8ac7a17e1804
Yes, I think it is better, even though I've read the changes only in commit
diff, not in context of whole docs chapter. Horizontal reuse
still
does not sound well to me as I imagine nothing under the term, but I don't
know of any other better now..
I added example for Dynamic Block Names.
It's probably OK for people who desperately need such feature and are
looking for it in the docs. But for those who scan docs for features or just
randomly read it like me, some real world example would be better. I'm still
confused what is it for as I can omit {block}
and the result is
still the same, isn't it? So maybe an example which points out the difference
between it.
{foreach [Peter, John, Mary] as $name}
Hi, I am {$name}.
{/foreach}
Last edited by dakur (2020-12-07 13:01)
- David Grudl
- Nette Core | 8218
Result of your example is (of course):
Hi, I am Peter.
Hi, I am John.
Hi, I am Mary.
Result of dynamic block example is:
Hi, I am Peter.
Hello. I am John.
Hi, I am Mary.
How can you not see the difference? :)
- David Grudl
- Nette Core | 8218
We'll get to that. I will try to modify the example to make it clear that we are talking about two files.
parent.latte
{foreach [Peter, John, Mary] as $name}
{block $name}Hi, I am {$name}.{/block}
{/foreach}
child.latte
{block John}Hello. I am {$name}.{/block}
Can you think of another way to achieve the same result?
- dakur
- Member | 493
Yeah, I understood it from the previous post that there are two files. And no, I don't know how to achieve it in another way. Just trying to say that I don't know why I would even need to do it at all. From this example in docs I know Latte has such feature but I don't know what I could use the feature for – what other people use it for, why it has been even implemented. Mention about its purpose would help me to know when to use it and understand Latte deeply in its intentions.
If we do not understand each other yet we will probably have to switch to Czech as it is pretty difficult to have such discussion in English when every word meaning matters. :-D
Last edited by dakur (2020-12-08 08:26)
- David Grudl
- Nette Core | 8218
I understand. But I'm probably not able to give a real world example in that documentation chapter.
- David Grudl
- Nette Core | 8218
I added it ten years ago because it's a great solution for some use cases, like form rendering etc.
{block $input->name} {input $input} {/block}
child.latte:
{block description} ... {/block}
(And no, this is absolutely not good example for Latte-only docs)