I've put an extensive patch to ZPatterns 0-4-3b2 here: http://www.cat-box.net/steve/ZPatterns.patch The patch includes the following: * Fix to _memento class so it works with Zope 2.3 * Alteration to GAPMixin so the the attributes it says it provides come from the union of the assignments and the defaults. * Add style="width: 100%;" to SkinScript edit textarea, in line with other zope textareas. * Add syntax to SkinScript "INVALIDATE FOR". You can put an optional invalidate-for clause at the end of a compute statement. This causes the attributes provided by the statement to be invalidated from the dataskin's attribute cache when any of the attributes named after INVALIDATE FOR change. It is easier to demonstrate than to explain :-) There's also an updated PlugIns/www/main.dtml file at: http://www.cat-box.net/steve/main.dtml An example of the new SkinScript syntax: WITH SELF COMPUTE name='%s %s' % (forename, surname) INVALIDATE FOR forename, surname This is useful if you're providing attributes from another DataSkin. Here's an example from some school management software. This is an attribute provider for Pupils. A Pupil may have an Instructor. This is implemented by the attribute instructor_id of Pupil. # the instructor is only valid if the pupil is current WITH SELF COMPUTE has_instructor=instructor_id or 0 and current and 1 # don't use has_instructor below, or the instructor details for # cataloging won't get updated when the assigned instructor changes # from no instructor to having an instructor. WITH self.instructor_id and self.current and Instructors.getItem(self.instructor_id) or NOT_FOUND COMPUTE instructor_name=name, instructor_name_link='<a href="%s">%s</a>' % (absolute_url(), html_quote(name)), instructor_sort_key=sort_key, instructor=RESULT OTHERWISE LET instructor_name='no instructor', instructor_name_link='no instructor', instructor_sort_key='----', instructor=_.None The problem here is that I can't use has_instructor in the WITH clause, if I'm also using has_instructor in the same transaction as I'm updating instructor_id. I have to use "self.instructor_id and self.current" instead, as above. However, with the new syntax, I don't have to worry about that: # the instructor is only valid if the pupil is current WITH SELF COMPUTE has_instructor=instructor_id or 0 and current and 1 INVALIDATE FOR current, instructor_id WITH has_instructor and Instructors.getItem(self.instructor_id) or NOT_FOUND COMPUTE instructor_name=name, instructor_name_link='<a href="%s">%s</a>' % (absolute_url(), html_quote(name)), instructor_sort_key=sort_key, instructor=RESULT OTHERWISE LET instructor_name='no instructor', instructor_name_link='no instructor', instructor_sort_key='----', instructor=_.None Thanks to PJE for pointing me in the right direction on how to implement this. -- Steve Alexander Software Engineer Cat-Box limited http://www.cat-box.net _______________________________________________ Zope-Dev maillist - [EMAIL PROTECTED] http://lists.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope )