Filling nested METAL macro slots with ZSQL items
Hi all, I am trying to mix nested macros with SQL and REQUEST variables and am having trouble getting the ZSQL items into the inner macro slots: top level folder master.html - ZPT that holds "master" macro with one slot: "main" This handles the nav bar, logo, etc. portfolio - Folder master.html - ZPT with "portfolio" macro that fills the "main" slot in the "master" macro and defines slots: "description", "screen-shots" and "comments" project.html - uses the portfolio macro, filling the "description", "screen-shots" and "comments" slots with data from a ZSQL Method. In project.html I want to make one ZSQL call and use it to fill all the "portfolio" macro slots but receive the following error: Error Type: Undefined Error Value: project not found in 'project/description', at line 10, column 31 (full traceback below) Apparently my ZSQL isn't getting called or the repeat variable ("project") isn't available. How can I stick the ZSQL results into the portfolio macro slots? Thanks! Eric. Code dump follows... ----------------------------------------------------------------- project.html - ZPT (called like: "portfolio/project.html?p_id=1") ----------------------------------------------------------------- <html metal:use-macro="here/master.html/macros/portfolio"> <head> <title tal:content="template/title">The Title</title> </head> <body> <span tal:define="project python: container.sqlProjectDataById[p_id]"> <span metal:fill-slot="description" tal:content="project/description">Description goes here</span> <span metal:fill-slot="technologies" tal:content="project/technologies">Technologies used will go here.</span> <span metal:fill-slot="screen_shots"> <ul> <li tal:repeat="image python:container.sqlProjectImagesById(request[p_id])"> <a tal:attributes="href python: container.images[image.id].absolute_url()"> <img tal:attributes="src python: container.images.thumbnails[image.id].absolute_url()"> </a> </li> </ul> </span> <span metal:fill-slot="comments"> Comments will go here. </span> </span> </body> </html> ---------------------------- portfolio/master.html - ZPT ---------------------------- <html metal:define-macro="portfolio"> <head> <title tal:content="template/title">Front Page</title> </head> <body metal:use-macro="container/site.com/master.html/macros/master"> <span metal:fill-slot="main"> <table width="500px" border="1" cellspacing="0" cellpadding="1"> <tr> <td width="100px">Description</td> <td colspan="2" width="79%"><span metal:define-slot="description"></span></td> </tr> <tr> <td width="100px">Technologies & Software Used</td> <td colspan="2" width="79%"><span metal:define-slot="technologies"></span></td> </tr> <tr> <td colspan="3">Screen Shots</td> </tr> <tr> <td colspan="3"> <span metal:define-slot="screen_shots"> <ol> <li>Screen shot one</li> <li>Screen shot two</li> </ol> </span> </td> </tr> <tr> <td colspan="3">Comments</td> </tr> <tr> <td colspan="3"><span metal:define-slot="comments"></span></td> </tr> </table> <a tal:attributes="href container/index.html/absolute_url" href="./index.html">Back</a> </span> </body> </html> -------------------- Error Page Traceback -------------------- <!-- Traceback (innermost last): File /data/bin/z251/lib/python/Products/Hotfix_2002-04-15/__init__.py, line 51, in publish_module File /data/bin/z251/lib/python/ZPublisher/Publish.py, line 114, in publish File /data/bin/z251/lib/python/Zope/__init__.py, line 159, in zpublisher_exception_hook (Object: portfolio) File /data/bin/z251/lib/python/ZPublisher/Publish.py, line 98, in publish File /data/bin/z251/lib/python/ZPublisher/mapply.py, line 88, in mapply (Object: project.html) File /data/bin/z251/lib/python/ZPublisher/Publish.py, line 39, in call_object (Object: project.html) File /data/bin/z251/lib/python/Shared/DC/Scripts/Bindings.py, line 252, in __call__ (Object: project.html) File /data/bin/z251/lib/python/Shared/DC/Scripts/Bindings.py, line 283, in _bindAndExec (Object: project.html) File /data/bin/z251/lib/python/Products/PageTemplates/ZopePageTemplate.py, line 210, in _exec (Object: project.html) File /data/bin/z251/lib/python/Products/PageTemplates/PageTemplate.py, line 86, in pt_render (Object: project.html) File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 158, in __call__ File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 191, in interpret File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 523, in do_useMacro File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 191, in interpret File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 523, in do_useMacro File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 191, in interpret File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 542, in do_defineSlot File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 191, in interpret File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 542, in do_defineSlot File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 191, in interpret File /data/bin/z251/lib/python/TAL/TALInterpreter.py, line 413, in do_insertText_tal File /data/bin/z251/lib/python/Products/PageTemplates/TALES.py, line 265, in evaluateText File /data/bin/z251/lib/python/Products/PageTemplates/TALES.py, line 247, in evaluate File /data/bin/z251/lib/python/Products/PageTemplates/Expressions.py, line 198, in __call__ File /data/bin/z251/lib/python/Products/PageTemplates/Expressions.py, line 188, in _eval Undefined: (see above)
Hello Eric, try: <span tal:define="project python: container.sqlProjectDataById(p_id = request['p_id'])"> or <span tal:define="project python: container.sqlProjectDataById(request['p_id'])"> EW> ----------------------------------------------------------------- EW> project.html - ZPT (called like: "portfolio/project.html?p_id=1") EW> ----------------------------------------------------------------- EW> <html metal:use-macro="here/master.html/macros/portfolio"> EW> <head> EW> <title tal:content="template/title">The Title</title> EW> </head> EW> <body> EW> <span tal:define="project python: container.sqlProjectDataById[p_id]"> EW> <span metal:fill-slot="description" EW> tal:content="project/description">Description goes here</span> -- Best regards, www.uralfirm.ru Dmitry Matveev mailto:matveev@uralfirm.ru
Eric Walstad wrote:
<html metal:use-macro="here/master.html/macros/portfolio"> <head> <title tal:content="template/title">The Title</title> </head> <body> <span tal:define="project python: container.sqlProjectDataById[p_id]"> <span metal:fill-slot="description" tal:content="project/description">Description goes here</span>
This bit looks problematic to me. Your 'tal:define' is in the macro use, but not in a slot, so it's going to get stomped on unless it also occurs in the macro definition. You could do either of the following, if that's the case: <tal:x define="global project python:container.sqlProjectDataById[p_id]" /> <html metal:use-macro="here/master.html/macros/portfolio"> <head> <title tal:content="template/title">The Title</title> </head> <body> <span metal:fill-slot="description" tal:content="project/description">Description goes here</span> ..or.. <html metal:use-macro="here/master.html/macros/portfolio"> <head> <title tal:content="template/title">The Title</title> </head> <body> <span metal:fill-slot="description" tal:define="global project python:container.sqlProjectDataById[p_id]" tal:content="project/description">Description goes here</span> In either case, the 'global' will ensure that the variable is defined through all of the slots. Cheers, Evan @ 4-am
participants (3)
-
Dmitry Matveev -
Eric Walstad -
Evan Simpson