« Overriding angle bracket escaping in ZPT | Main | PubMed records available over OAI-PMH »

December 15, 2004

Doozers in ZPT

I've been working on converting my DTML generic form builder into ZPT.

It has taken me a couple of days to move the concept of a doozer over. A doozer is a script which performs some business logic functions, such as inserting data into a table but instead of returning any resulting HTML, hands off to another URI using a redirect.

The main trick I was missing was the use of either tal:block or the tal:omit-tag="" attribute to ensure nothing is written to the browser before the redirect. I then discovered that this is actually unecessary as unlike PHP if you call a redirect it seems to send a new header to the browser anyway.

<div tal:define="
  debug python:0;
  table_name request/table_name;
  pk_recs python:here.get_pk_column(table_name=table_name);
  title_column python:str(pk_recs[0]['title_column']);
  pk_column python:str(pk_recs[0]['pk_column']);
  these_items python:request.form;
  title_column_value python:these_items[title_column];
  result python:here.insert_entry_id(table_name=table_name, title_column=title_column, this_value=title_column_value);
  max_id_recs python:here.get_table_max_id(table_name=table_name,pk_column=pk_column);
  entry_id python:max_id_recs[0]['entry_id'];" tal:omit-tag="">
<p tal:condition="python:debug == 1" tal:content="title_column" tal:omit-tag=""></p>
<p tal:condition="python:debug == 1" tal:content="title_column_value" tal:omit-tag=""></p>
<p tal:condition="python:debug == 1" tal:content="entry_id" tal:omit-tag=""></p>
<div tal:repeat="item_key python:these_items.keys()" tal:omit-tag="">

<p tal:define="item_value python:these_items[item_key];" tal:omit-tag="">

<span tal:condition="python:debug == 1" tal:omit-tag="">
<span tal:condition="python:debug == 1" tal:content="item_key" tal:omit-tag=""></span>
<span tal:condition="python:debug == 1" tal:content="item_value | nothing" tal:omit-tag="">Item here<
/span>
</span>

<span tal:condition="python:item_key != 'table_name' and item_key != 'redirect_url'" tal:omit-tag="">
<br
  tal:define="result python:here.update_entry(table_name=table_name,pk_column=pk_column,
this_key=item_key,this_value=item_value,entry_id=entry_id)"
  tal:omit-tag=""/>
</span>
</p>
</div>
<p tal:condition="python:debug == 1" tal:content="these_items" tal:omit-tag=""></p>
<div tal:condition="python:not request.has_key('redirect_url')" tal:omit-tag="">
<br tal:omit-tag="" tal:define="
  redirect_url python:'/generic_form_zpt/show_entry?entry_id=' + str(entry_id) 
+ '&table_name=' + table_name + '&pk_column=' + pk_column 
+ '&title_column=' + title_column;
  redirect python:request.RESPONSE.redirect(redirect_url);
"/>
</div>
<div tal:condition="python:request.has_key('redirect_url')" tal:omit-tag="">
<br tal:omit-tag="" tal:define="
  final_url python:request['redirect_url'] + '?entry_id=' + str(entry_id) 
+ '&table_name=' + table_name + '&pk_column=' + pk_column + '&title_column=' 
+ title_column;
  redirect python:request.RESPONSE.redirect(final_url);
"/>
</div>
</div>

Tags: ZPT

Posted by pj at December 15, 2004 04:01 PM