/ / Dlaczego zmienna zdefiniowana poza elementem wypełniającym lub definiującym makro nie jest widoczna w tym elemencie? - plone, template-tal, zpt, template-metal

Dlaczego zmienna zdefiniowana poza elementem do wypełnienia lub makrem definicji nie jest widoczna w tym elemencie? - plone, template-tal, zpt, template-metal

Dlaczego zmienna jest zdefiniowana poza fill-slot lub define-macro element niewidoczny w tym elemencie?

<body tal:define="a string:a">
<metal:content-core fill-slot="content-core">
<metal:content-core define-macro="content-core"
tal:define="b string:b">
<div tal:content="a" />
<div tal:content="b" />
<div tal:content="c" />
</metal:content-core>
</metal:content-core>
</body>

Wyrażenie opowieści ze zmienną a nie można ocenić. Oczywiście b jest widoczny.

Z drugiej strony, jeśli zmienna c jest zdefiniowany w elemencie zamykającym define-slot jak poniżej, to jest widoczne.

<div tal:define="c string:c">
<metal:text define-slot="content-core"></metal:text>
</div>

Wygląda na to, że zmienne są oceniane dopiero po wstawieniu szczeliny.

Odpowiedzi:

6 dla odpowiedzi № 1

Kontekst makra TAL ma znaczenie tylko wtedy, gdyprzeglądasz makro w tym kontekście. Jest interpretowany, jeśli przeglądasz szablon zawierający makro, ale nie, jeśli używasz makra. Makra są - w pewnym sensie - po prostu kopiowane w czasie wykonywania z szablonu zawierającego makro na stronę, która go używa, następnie rozwinięty. Cała przestrzeń nazw pochodzi z szablonu, który używa makra.

Aby pomyśleć o tym w inny sposób: makra nie są językiem o zasięgu. Gdyby tak było, nie zobaczyłbyś makra w ogóle z innego szablonu. TAL musiałby być znacznie bardziej skomplikowany i musiałbyś myśleć o zamknięciach i funkcjach.

Języki „makr” są nazywane tak, ponieważ makra są rozszerzane, gdy są używane. Nie są funkcjami.

Dlaczego więc zawierają szablony zawierają kontekstw ogóle dla makr? Nie muszą. Zwykle robi się to, aby makro można było przetestować w realistycznym środowisku. (Chociaż czasami makra znajdują się na stronach, które są niezależnie przydatne).