Hi all,

I recently setup another instance of web2py for testing on a new
system, and noticed something strange with blocks.

Basically, I have three slightly different versions of web2py running:
1.89.3 (DEMO server), 1.91.6 (DEV server) and 1.95.1 which I just
installed with the auto-upgrade feature (TEST server -- soon to be the
Production server).

The problem is, i have an include directive inside of a block/end
block pair. The included file (right-col.html) then goes on to define
a couple other blocks (for navigation mainly) which are filled in by
different templates associated with different areas of the site.

However, templates which extend the file which includes right-col.html
do not have access to BLOCKs that are defined INSIDE of right-
col.html, but this behavior occurs only on the TEST server (v1.95.1)

This code WORKED before 1.95.1 (on DEMO and DEV):

#################
# views/bare.html
#################
<html>
 ... (abbreviated for brevity's sake)
     <div id='content'>
     {{ block content }}{{ end }}
     </div>

      {{ block right-col }}
           {{ include 'base/right-col.html' }}
      {{ end }}

...
</html>
#EOF bare.html

#######################
# views/base/right-col.html
#######################
<div id='right-col'>
   {{ block nav }}
   {{ end }}

   <section id='social'>
   {{ block social }}{{end}}
   </section>

</div>
#EOF

#################
# views/base.html
#################
{{ extends 'bare.html }}

{{ block content }}
    {{ include }}
{{ end }}

<!-- defines stuff inside of right-col -->
{{ block nav }}
    <nav id='side-nav'>
    {{=MENU(get_menu(request.controller) or standard_menu)}}
    </nav>
{{ end }}

{{ block social }}
   ... stuff to do with social networking
{{ end }}
#EOF

####################
# view/some-page.html
####################
{{ extends 'base.html' }}

Blah blah blah. Wait, my side menu is missing. Crap.

But the outline of the sidebar is still there since div#right-col is
present....

#EOF


What I had to do to get it to work with the TEST version was to take
away the include statement for right-col.html and move the contents of
the file inside the right-col block in bare.html. This works fine.

 The strange thing is that the <div id='right-col'><section
id='social'></section></div> (the markup in right-col.html) shows up
-- even if I wrap it in a block within the included file. The problem
is just that the template blocks defined in the right-col.html file
seem to be forgotten later on in the template. So even though
bare.html includes right-col, the base file, which extends bare,
cannot access the blocks defined in the right-col file. Thus, when
rendering "some-page" which extends "base", the contents of the right
column aren't included.


So, the question:

Is my usage of blocks improper? Or is this an undesired outcome of
code updates?

I just checked the code.google.com page and did not see any issues,
open or closed, that mentioned anything about this.

Thanks,
Faithful web2py user

PS:

I think the reason I did this was to be able to reuse HTML chunks
which might be included in different places on the page, or even among
different templates from the site (e.g. bare.html is the ancestor of
most public pages, but user.html is the ancestor of another, and both
should be able to use right-col.html).

Also, I would love to see the include directive supported within for
loops, though I think I see why it is not. I think the include
directives are always handled first and the file is included before
the template is parsed, thus template variables are not available and
loops cannot be iterated. Oh well.

Reply via email to