I got the following recursive structure :

  <li metal:use-macro="menu_item">
    <tal:block metal:fill-slot="texte">File</tal:block>
    <tal:block metal:fill-slot="sous-menu">
        <li metal:use-macro="menu_item" tal:define="buggy string:">
          <tal:block metal:fill-slot="texte">Open</tal:block>

<tal:block metal:define-macro="menu_item">
  <li class="menu_item">
    <a href="#"><tal:block metal:define-slot="texte" /></a>
    <tal:block metal:define-slot="sous-menu" />

Instead of
* File
  * Open

the result is :
* Open
  * Open

If I drop the tal:define="buggy string:", that works.
This behaviour is caused by Context::fillSlot, line 215 :

if ($this->_parentContext) {
  // setting slots in any context (probably violates TAL, but works around bug
with tal:define popping context after fillslot)
  $this->_parentContext->fillSlot($key, $content);

As I read the comment, the aim of this code piece is to allow using tal:define
on the same tag as metal:fill-slot.

I dropped this piece of code - I never use tal:define and metal:fill-slot in the
same time. But has anybody an idea of a proper solution, correcting the 2 bugs ?

PHPTAL mailing list

Reply via email to