2010-08-05 11:23:17 -05:00
|
|
|
<tal:comment replace="nothing">
|
|
|
|
We begin with some sub-macros used within macro "show" defined below.
|
|
|
|
</tal:comment>
|
2009-06-29 07:06:01 -05:00
|
|
|
|
2009-10-18 07:52:27 -05:00
|
|
|
<metal:objectTitle define-macro="objectTitle">
|
2009-06-29 07:06:01 -05:00
|
|
|
<tal:comment replace="nothing">Displays the title of a referenced object, with a link on
|
|
|
|
it to reach the consult view for this object. If we are on a back reference, the link
|
2009-11-17 03:05:19 -06:00
|
|
|
allows to reach the correct page where the forward reference is defined. If we are
|
|
|
|
on a forward reference, the "nav" parameter is added to the URL for allowing to navigate
|
|
|
|
from one object to the next/previous on skyn/view.</tal:comment>
|
2009-10-18 07:52:27 -05:00
|
|
|
<a tal:define="viewUrl obj/getUrl;
|
2010-08-27 01:59:53 -05:00
|
|
|
includeShownInfo includeShownInfo | python:False;
|
2009-11-17 03:05:19 -06:00
|
|
|
navInfo python:'nav=ref.%s.%s.%d.%d' % (contextObj.UID(), fieldName, repeat['obj'].number()+startNumber, totalNumber);
|
2010-08-27 01:59:53 -05:00
|
|
|
fullUrl python: appyType['isBack'] and (viewUrl + '/?page=%s' % appyType['backd']['page']) or (viewUrl + '/?' + navInfo)"
|
|
|
|
tal:attributes="href fullUrl" tal:content="python: (not includeShownInfo) and obj.Title() or contextObj.getReferenceLabel(fieldName, obj.appy())"></a>
|
2009-06-29 07:06:01 -05:00
|
|
|
</metal:objectTitle>
|
|
|
|
|
2009-10-18 07:52:27 -05:00
|
|
|
<metal:objectActions define-macro="objectActions">
|
2009-06-29 07:06:01 -05:00
|
|
|
<tal:comment replace="nothing">Displays icons for triggering actions on a given
|
|
|
|
referenced object (edit, delete, etc).</tal:comment>
|
|
|
|
<table class="no-style-table" cellpadding="0" cellspacing="0">
|
|
|
|
<tr>
|
|
|
|
<tal:comment replace="nothing">Arrows for moving objects up or down</tal:comment>
|
2010-01-06 11:36:16 -06:00
|
|
|
<td class="noPadding" tal:condition="python: (len(objs)>1) and member.has_permission('Modify portal content', contextObj)">
|
2010-04-30 05:05:29 -05:00
|
|
|
<tal:moveRef define="objectIndex python: contextObj.getAppyRefIndex(fieldName, obj);
|
|
|
|
ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'ChangeRefOrder\', {\'refObjectUid\':\'%s\', \'move\':\'**v**\'}' % (startNumber, obj.UID()))">
|
2009-10-25 15:42:08 -05:00
|
|
|
<tal:comment replace="nothing">Move up</tal:comment>
|
2010-04-30 05:05:29 -05:00
|
|
|
<img tal:condition="python: objectIndex > 0"
|
2009-10-25 15:42:08 -05:00
|
|
|
tal:attributes="src string: $portal_url/skyn/arrowUp.png;
|
|
|
|
title python: tool.translate('move_up');
|
2010-04-30 05:05:29 -05:00
|
|
|
onClick python: ajaxBaseCall.replace('**v**', 'up')"
|
2009-10-25 15:42:08 -05:00
|
|
|
style="cursor:pointer"/>
|
|
|
|
<tal:comment replace="nothing">Move down</tal:comment>
|
2010-04-30 05:05:29 -05:00
|
|
|
<img tal:condition="python: objectIndex < (totalNumber-1)"
|
2009-10-25 15:42:08 -05:00
|
|
|
tal:attributes="src string: $portal_url/skyn/arrowDown.png;
|
|
|
|
title python: tool.translate('move_down');
|
2010-04-30 05:05:29 -05:00
|
|
|
onClick python: ajaxBaseCall.replace('**v**', 'down')"
|
2009-10-25 15:42:08 -05:00
|
|
|
style="cursor:pointer"/>
|
|
|
|
</tal:moveRef>
|
2009-06-29 07:06:01 -05:00
|
|
|
</td>
|
2009-11-24 15:41:42 -06:00
|
|
|
<tal:comment replace="nothing">Edit the element</tal:comment>
|
|
|
|
<td class="noPadding"><a tal:attributes="href python: obj.absolute_url() + '/skyn/edit'"
|
|
|
|
tal:condition="python: member.has_permission('Modify portal content', obj)">
|
2009-11-25 13:37:22 -06:00
|
|
|
<img title="label_edit" i18n:domain="plone" i18n:attributes="title"
|
|
|
|
tal:attributes="src string: $portal_url/skyn/edit.gif"/>
|
2009-11-24 15:41:42 -06:00
|
|
|
</a></td>
|
|
|
|
<tal:comment replace="nothing">Delete the element</tal:comment>
|
|
|
|
<td class="noPadding">
|
|
|
|
<img tal:condition="python: member.has_permission('Delete objects', obj)"
|
|
|
|
title="Delete" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
|
|
|
|
tal:attributes="src string: $portal_url/skyn/delete.png;
|
|
|
|
onClick python:'javascript:onDeleteObject(\'%s\')' % obj.UID()"/>
|
|
|
|
</td>
|
2009-06-29 07:06:01 -05:00
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
</metal:objectActions>
|
|
|
|
|
2009-10-18 07:52:27 -05:00
|
|
|
<metal:plusIcon define-macro="plusIcon">
|
2009-06-29 07:06:01 -05:00
|
|
|
<tal:comment replace="nothing">Displays the "plus" icon that allows to add new object
|
|
|
|
through a reference widget. Indeed, If field was declared as "addable", we must provide
|
|
|
|
an icon for creating a new linked object (at least if multiplicities allow it).</tal:comment>
|
2009-10-18 07:52:27 -05:00
|
|
|
<img style="cursor:pointer" tal:condition="showPlusIcon"
|
|
|
|
tal:attributes="src string:$portal_url/skyn/plus.png;
|
|
|
|
title python: tool.translate('add_ref');
|
2009-10-25 15:42:08 -05:00
|
|
|
onClick python: 'href: window.location=\'%s/skyn/do?action=Create&initiator=%s&field=%s&type_name=%s\'' % (folder.absolute_url(), contextObj.UID(), fieldName, linkedPortalType)"/>
|
2009-06-29 07:06:01 -05:00
|
|
|
</metal:plusIcon>
|
|
|
|
|
2010-04-30 05:05:29 -05:00
|
|
|
<tal:comment replace="nothing">
|
|
|
|
This macro displays, in a cell header from a ref table, icons for sorting the
|
|
|
|
ref field according to the field that corresponds to this column.
|
|
|
|
</tal:comment>
|
|
|
|
<metal:sortIcons define-macro="sortIcons"
|
2010-04-30 07:43:44 -05:00
|
|
|
tal:define="ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'SortReference\', {\'sortKey\':\'%s\', \'reverse\':\'**v**\'}' % (startNumber, shownField))" tal:condition="python: canWrite and objs[0].isRefSortable(shownField)">
|
2010-04-30 05:05:29 -05:00
|
|
|
<img style="cursor:pointer"
|
|
|
|
tal:attributes="src string:$portal_url/skyn/sortAsc.png;
|
|
|
|
onClick python: ajaxBaseCall.replace('**v**', 'False')"/>
|
|
|
|
<img style="cursor:pointer"
|
|
|
|
tal:attributes="src string:$portal_url/skyn/sortDesc.png;
|
|
|
|
onClick python: ajaxBaseCall.replace('**v**', 'True')"/>
|
|
|
|
</metal:sortIcons>
|
|
|
|
|
2010-08-05 11:23:17 -05:00
|
|
|
<tal:comment replace="nothing">View macro for a Ref.</tal:comment>
|
|
|
|
<div metal:define-macro="view"
|
|
|
|
tal:define= "innerRef innerRef|python:False;
|
|
|
|
ajaxHookId python: contextObj.UID() + name"
|
|
|
|
tal:attributes = "id ajaxHookId">
|
2009-10-25 15:42:08 -05:00
|
|
|
<script language="javascript"
|
2010-08-05 11:23:17 -05:00
|
|
|
tal:content="python: 'askRefField(\'%s\',\'%s\',\'%s\',\'%s\',0)' % (ajaxHookId, contextObj.absolute_url(), name, innerRef)">
|
2009-10-25 15:42:08 -05:00
|
|
|
</script>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<tal:comment replace="nothing">
|
2010-08-05 11:23:17 -05:00
|
|
|
This macro is called by a XmlHttpRequest for displaying the paginated
|
|
|
|
referred objects of a reference field.
|
2009-10-25 15:42:08 -05:00
|
|
|
</tal:comment>
|
2010-08-05 11:23:17 -05:00
|
|
|
<div metal:define-macro="viewContent"
|
2009-10-25 15:42:08 -05:00
|
|
|
tal:define="fieldName request/fieldName;
|
2010-08-05 11:23:17 -05:00
|
|
|
appyType python: contextObj.getAppyType(fieldName, asDict=True);
|
2009-10-25 15:42:08 -05:00
|
|
|
innerRef python: test(request['innerRef']=='True', True, False);
|
|
|
|
ajaxHookId python: contextObj.UID()+fieldName;
|
|
|
|
startNumber python: int(request.get('%s_startNumber' % ajaxHookId, 0));
|
|
|
|
tool contextObj/getTool;
|
2010-08-27 01:59:53 -05:00
|
|
|
refObjects python:contextObj.getAppyRefs(fieldName, startNumber);
|
2009-10-25 15:42:08 -05:00
|
|
|
objs refObjects/objects;
|
|
|
|
totalNumber refObjects/totalNumber;
|
|
|
|
batchSize refObjects/batchSize;
|
2010-09-02 09:16:08 -05:00
|
|
|
folder python: contextObj.isPrincipiaFolderish and contextObj or contextObj.getParentNode();
|
2009-06-29 07:06:01 -05:00
|
|
|
flavour python:tool.getFlavour(contextObj);
|
|
|
|
linkedPortalType python:flavour.getPortalType(appyType['klass']);
|
2009-10-25 15:42:08 -05:00
|
|
|
addPermission python: '%s: Add %s' % (tool.getAppName(), linkedPortalType);
|
2010-08-05 11:23:17 -05:00
|
|
|
canWrite python: not appyType['isBack'] and member.has_permission(appyType['writePermission'], contextObj);
|
|
|
|
multiplicity appyType/multiplicity;
|
2009-06-29 07:06:01 -05:00
|
|
|
maxReached python:(multiplicity[1] != None) and (len(objs) >= multiplicity[1]);
|
2010-08-05 11:23:17 -05:00
|
|
|
showPlusIcon python:not appyType['isBack'] and appyType['add'] and not maxReached and member.has_permission(addPermission, folder) and canWrite;
|
2009-10-25 15:42:08 -05:00
|
|
|
atMostOneRef python: (multiplicity[1] == 1) and (len(objs)<=1);
|
2010-08-05 11:23:17 -05:00
|
|
|
label python: tool.translate(appyType['labelId']);
|
|
|
|
description python: tool.translate(appyType['descrId']);
|
|
|
|
navBaseCall python: 'askRefField(\'%s\',\'%s\',\'%s\',\'%s\',**v**)' % (ajaxHookId, contextObj.absolute_url(), fieldName, innerRef)">
|
2009-06-29 07:06:01 -05:00
|
|
|
|
|
|
|
<tal:comment replace="nothing">This macro displays the Reference widget on a "consult" page.
|
|
|
|
|
|
|
|
The definition of "atMostOneRef" above may sound strange: we shouldn't check the actual number
|
|
|
|
of referenced objects. But for back references people often forget to specify multiplicities.
|
|
|
|
So concretely, multiplicities (0,None) are coded as (0,1).</tal:comment>
|
|
|
|
|
|
|
|
<tal:atMostOneReference condition="atMostOneRef">
|
|
|
|
<tal:comment replace="nothing">Display a simplified widget if maximum number of
|
|
|
|
referenced objects is 1.</tal:comment>
|
|
|
|
<table class="no-style-table" cellpadding="0" cellspacing="0"><tr valign="top">
|
2010-08-27 01:59:53 -05:00
|
|
|
<td><span class="appyLabel" tal:condition="python: not innerRef and not appyType['link']"
|
|
|
|
tal:content="structure label"></span></td>
|
2009-06-29 07:06:01 -05:00
|
|
|
|
|
|
|
<tal:comment replace="nothing">If there is no object...</tal:comment>
|
|
|
|
<tal:noObject condition="not:objs">
|
2009-10-18 07:52:27 -05:00
|
|
|
<td tal:content="python: tool.translate('no_ref')"></td>
|
2010-08-05 11:23:17 -05:00
|
|
|
<td><metal:plusIcon use-macro="portal/skyn/widgets/ref/macros/plusIcon"/></td>
|
2009-06-29 07:06:01 -05:00
|
|
|
</tal:noObject>
|
|
|
|
|
|
|
|
<tal:comment replace="nothing">If there is an object...</tal:comment>
|
2010-08-27 01:59:53 -05:00
|
|
|
<tal:objectIsPresent condition="objs">
|
2009-11-17 03:05:19 -06:00
|
|
|
<tal:obj repeat="obj objs">
|
2010-08-27 01:59:53 -05:00
|
|
|
<td tal:define="includeShownInfo python:True"><metal:showObjectTitle use-macro="portal/skyn/widgets/ref/macros/objectTitle" /></td>
|
2010-08-05 11:23:17 -05:00
|
|
|
<td tal:condition="not: appyType/isBack">
|
|
|
|
<metal:showObjectActions use-macro="portal/skyn/widgets/ref/macros/objectActions" />
|
2009-06-29 07:06:01 -05:00
|
|
|
</td>
|
|
|
|
</tal:obj>
|
|
|
|
</tal:objectIsPresent>
|
|
|
|
</tr></table>
|
|
|
|
</tal:atMostOneReference>
|
|
|
|
|
|
|
|
<tal:comment replace="nothing">Display a fieldset in all other cases.</tal:comment>
|
|
|
|
<tal:anyNumberOfReferences condition="not: atMostOneRef">
|
|
|
|
<fieldset tal:attributes="class python:test(innerRef, 'innerAppyFieldset', '')">
|
|
|
|
<legend tal:condition="python: not innerRef or showPlusIcon">
|
2009-10-18 07:52:27 -05:00
|
|
|
<span tal:condition="not: innerRef" tal:content="label"/>
|
2009-11-17 03:05:19 -06:00
|
|
|
(<span tal:replace="totalNumber"/>)
|
2010-08-05 11:23:17 -05:00
|
|
|
<metal:plusIcon use-macro="portal/skyn/widgets/ref/macros/plusIcon"/>
|
2009-06-29 07:06:01 -05:00
|
|
|
</legend>
|
|
|
|
|
|
|
|
<tal:comment replace="nothing">Object description</tal:comment>
|
2010-08-05 11:23:17 -05:00
|
|
|
<!--p tal:condition="python: not innerRef and description.strip()"
|
|
|
|
tal:content="description" class="discreet" ></p-->
|
2009-06-29 07:06:01 -05:00
|
|
|
|
2009-10-25 15:42:08 -05:00
|
|
|
<tal:comment replace="nothing">Appy (top) navigation</tal:comment>
|
2010-04-30 05:05:29 -05:00
|
|
|
<metal:nav use-macro="here/skyn/navigate/macros/appyNavigate"/>
|
2009-10-25 15:42:08 -05:00
|
|
|
|
2009-06-29 07:06:01 -05:00
|
|
|
<tal:comment replace="nothing">No object is present</tal:comment>
|
2009-10-18 07:52:27 -05:00
|
|
|
<p tal:condition="not:objs" tal:content="python: tool.translate('no_ref')"></p>
|
2009-06-29 07:06:01 -05:00
|
|
|
|
|
|
|
<table width="100%" cellspacing="0" cellpadding="0" tal:condition="objs"
|
|
|
|
tal:attributes="class python:test(innerRef, 'innerAppyTable', '')">
|
|
|
|
<tr valign="bottom"><td>
|
|
|
|
|
|
|
|
<tal:comment replace="nothing">Show backward reference(s)</tal:comment>
|
|
|
|
<table class="no-style-table" cellspacing="0" cellpadding="0"
|
2010-08-05 11:23:17 -05:00
|
|
|
tal:condition="python: appyType['isBack'] and objs">
|
2009-06-29 07:06:01 -05:00
|
|
|
<tr tal:repeat="obj objs">
|
2010-08-05 11:23:17 -05:00
|
|
|
<td><metal:showObjectTitle use-macro="portal/skyn/widgets/ref/macros/objectTitle" />
|
2009-06-29 07:06:01 -05:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
|
|
|
|
<tal:comment replace="nothing">Show forward reference(s)</tal:comment>
|
2009-12-15 14:30:43 -06:00
|
|
|
<table tal:attributes="class python:test(innerRef, '', 'listing nosort');
|
2010-08-05 11:23:17 -05:00
|
|
|
width python:test(innerRef, '100%', appyType['layouts']['view']['width']);"
|
|
|
|
align="right" tal:condition="python: not appyType['isBack'] and objs" cellpadding="0" cellspacing="0">
|
|
|
|
<tal:widgets define="widgets python: objs[0].getAppyTypesFromNames(appyType['shownInfo'])">
|
2009-06-29 07:06:01 -05:00
|
|
|
<tr tal:condition="appyType/showHeaders">
|
2009-10-18 07:52:27 -05:00
|
|
|
<th tal:condition="python: 'title' not in appyType['shownInfo']"
|
2010-04-30 05:05:29 -05:00
|
|
|
tal:define="shownField python:'title'">
|
|
|
|
<span tal:content="python: tool.translate('ref_name')"></span>
|
2010-08-05 11:23:17 -05:00
|
|
|
<metal:sortIcons use-macro="portal/skyn/widgets/ref/macros/sortIcons" />
|
2010-04-30 05:05:29 -05:00
|
|
|
</th>
|
2010-08-05 11:23:17 -05:00
|
|
|
<th tal:repeat="widget widgets">
|
|
|
|
<tal:header define="shownField widget/name">
|
|
|
|
<span tal:content="python: tool.translate(widget['labelId'])"></span>
|
|
|
|
<metal:sortIcons use-macro="portal/skyn/widgets/ref/macros/sortIcons" />
|
|
|
|
</tal:header>
|
2009-06-29 07:06:01 -05:00
|
|
|
</th>
|
2009-10-18 07:52:27 -05:00
|
|
|
<th tal:content="python: tool.translate('ref_actions')"></th>
|
2009-06-29 07:06:01 -05:00
|
|
|
</tr>
|
2009-12-15 14:30:43 -06:00
|
|
|
<tal:row repeat="obj objs">
|
|
|
|
<tr valign="top" tal:define="odd repeat/obj/odd"
|
|
|
|
tal:attributes="class python:test(odd, 'even', 'odd')">
|
2009-06-29 07:06:01 -05:00
|
|
|
<tal:comment replace="nothing">Object title, shown here if not specified somewhere
|
|
|
|
else in appyType.shownInfo.</tal:comment>
|
|
|
|
<td tal:condition="python: 'title' not in appyType['shownInfo']"><metal:showObjectTitle
|
2010-09-02 09:16:08 -05:00
|
|
|
use-macro="portal/skyn/widgets/ref/macros/objectTitle"/>
|
2009-06-29 07:06:01 -05:00
|
|
|
</td>
|
|
|
|
<tal:comment replace="nothing">Additional fields that must be shown</tal:comment>
|
2010-08-05 11:23:17 -05:00
|
|
|
<td tal:repeat="widget widgets">
|
|
|
|
<tal:showTitle condition="python: widget['name'] == 'title'">
|
|
|
|
<metal:showObjectTitle use-macro="portal/skyn/widgets/ref/macros/objectTitle"/>
|
2009-06-29 07:06:01 -05:00
|
|
|
</tal:showTitle>
|
2010-08-05 11:23:17 -05:00
|
|
|
<tal:showOtherField define="contextObj python:obj;
|
|
|
|
layoutType python: 'cell';
|
|
|
|
innerRef python:True"
|
|
|
|
condition="python: widget['name'] != 'title'">
|
|
|
|
<metal:showField use-macro="portal/skyn/widgets/show/macros/field" />
|
2010-09-02 09:16:08 -05:00
|
|
|
</tal:showOtherField>
|
2009-06-29 07:06:01 -05:00
|
|
|
</td>
|
|
|
|
<tal:comment replace="nothing">Actions</tal:comment>
|
|
|
|
<td align="right">
|
2010-08-05 11:23:17 -05:00
|
|
|
<metal:showObjectActions use-macro="portal/skyn/widgets/ref/macros/objectActions" />
|
2009-06-29 07:06:01 -05:00
|
|
|
</td>
|
|
|
|
</tr>
|
2009-12-15 14:30:43 -06:00
|
|
|
</tal:row>
|
2010-08-05 11:23:17 -05:00
|
|
|
</tal:widgets>
|
2009-06-29 07:06:01 -05:00
|
|
|
</table>
|
|
|
|
|
|
|
|
</td></tr>
|
|
|
|
</table>
|
2009-10-25 15:42:08 -05:00
|
|
|
|
|
|
|
<tal:comment replace="nothing">Appy (bottom) navigation</tal:comment>
|
2010-04-30 05:05:29 -05:00
|
|
|
<metal:nav use-macro="here/skyn/navigate/macros/appyNavigate"/>
|
2009-10-25 15:42:08 -05:00
|
|
|
|
2009-06-29 07:06:01 -05:00
|
|
|
</fieldset>
|
|
|
|
<tal:comment replace="nothing">A carriage return needed in some cases.</tal:comment>
|
|
|
|
<br tal:define="widgetDescr widgetDescr|nothing"
|
|
|
|
tal:condition="python: not widgetDescr or (widgetDescr['widgetType'] != 'group')"/>
|
|
|
|
</tal:anyNumberOfReferences>
|
|
|
|
</div>
|
|
|
|
|
2010-08-05 11:23:17 -05:00
|
|
|
<tal:comment replace="nothing">Edit macro for an Ref.</tal:comment>
|
2010-08-27 01:59:53 -05:00
|
|
|
<div metal:define-macro="edit"
|
2010-08-05 11:23:17 -05:00
|
|
|
tal:condition="widget/link"
|
2010-08-27 01:59:53 -05:00
|
|
|
tal:define="rname python: 'appy_ref_%s' % name;
|
|
|
|
requestValue python: request.get(rname, []);
|
|
|
|
inRequest python: request.has_key(rname);
|
|
|
|
allObjects python: contextObj.getSelectableAppyRefs(name);
|
2010-09-02 09:16:08 -05:00
|
|
|
refUids python: [o.UID() for o in contextObj.getAppyRefs(name)['objects']];
|
2010-08-27 01:59:53 -05:00
|
|
|
isBeingCreated python: contextObj.isTemporary() or ('/portal_factory/' in contextObj.absolute_url())">
|
2009-06-29 07:06:01 -05:00
|
|
|
|
2010-08-27 01:59:53 -05:00
|
|
|
<select tal:attributes="name rname;
|
|
|
|
multiple python: isMultiple and 'multiple' or ''">
|
|
|
|
<option tal:condition="not: isMultiple" i18n:translate="choose_a_value"></option>
|
|
|
|
<tal:ref repeat="refObj allObjects">
|
|
|
|
<option tal:define="uid python: contextObj.getReferenceUid(refObj)"
|
|
|
|
tal:content="python: contextObj.getReferenceLabel(name, refObj)"
|
|
|
|
tal:attributes="value uid;
|
|
|
|
selected python:(inRequest and (uid in requestValue) or (not inRequest and ((uid in refUids)))) and True or False">
|
|
|
|
</option>
|
|
|
|
</tal:ref>
|
2009-06-29 07:06:01 -05:00
|
|
|
</select>
|
|
|
|
</div>
|
2010-08-05 11:23:17 -05:00
|
|
|
|
|
|
|
<tal:comment replace="nothing">Cell macro for a Ref.</tal:comment>
|
|
|
|
<metal:cell define-macro="cell">
|
|
|
|
<metal:call use-macro="portal/skyn/widgets/ref/macros/view"/>
|
|
|
|
</metal:cell>
|
|
|
|
|
|
|
|
<tal:comment replace="nothing">Search macro for a Ref.</tal:comment>
|
|
|
|
<metal:search define-macro="search"></metal:search>
|