work in progress: make the loops framework practically usable
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1121 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
1adedb7b0e
commit
628e81b740
7 changed files with 204 additions and 7 deletions
|
@ -30,6 +30,8 @@ from zope.app.form.browser.interfaces import ITerms
|
|||
from zope.cachedescriptors.property import Lazy
|
||||
from zope.dottedname.resolve import resolve
|
||||
from zope.event import notify
|
||||
from zope.formlib.form import EditForm, FormFields
|
||||
from zope.formlib.namedtemplate import NamedTemplate
|
||||
from zope.interface import implements
|
||||
from zope.publisher.interfaces import BadRequest
|
||||
from zope.publisher.interfaces.browser import IBrowserRequest
|
||||
|
@ -44,6 +46,12 @@ from loops.browser.common import BaseView, LoopsTerms
|
|||
from loops import util
|
||||
|
||||
|
||||
class ConceptEditForm(EditForm):
|
||||
|
||||
form_fields = FormFields(IConcept)
|
||||
template = NamedTemplate('pageform')
|
||||
|
||||
|
||||
class ConceptView(BaseView):
|
||||
|
||||
def children(self):
|
||||
|
|
|
@ -109,7 +109,7 @@
|
|||
permission="zope.ManageContent">
|
||||
|
||||
<page
|
||||
name="related.html"
|
||||
name="configure.html"
|
||||
template="concept_related.pt"
|
||||
menu="zmi_views" title="Related Concepts"
|
||||
/>
|
||||
|
@ -122,13 +122,26 @@
|
|||
|
||||
</pages>
|
||||
|
||||
<editform
|
||||
<!--<editform
|
||||
label="Edit Concept"
|
||||
name="edit.html"
|
||||
schema="loops.interfaces.IConcept"
|
||||
for="loops.interfaces.IConcept"
|
||||
permission="zope.ManageContent"
|
||||
menu="zmi_views" title="Edit"
|
||||
/>-->
|
||||
|
||||
<zope:adapter
|
||||
factory="loops.browser.util.pageform"
|
||||
for="zope.interface.Interface"
|
||||
name="pageform" />
|
||||
|
||||
<page
|
||||
name="edit.html"
|
||||
for="loops.interfaces.IConcept"
|
||||
class="loops.browser.concept.ConceptEditForm"
|
||||
permission="zope.ManageContent"
|
||||
menu="zmi_views" title="Edit"
|
||||
/>
|
||||
|
||||
<page
|
||||
|
@ -179,7 +192,7 @@
|
|||
<page
|
||||
name="configure.html"
|
||||
template="resource_configure.pt"
|
||||
menu="zmi_views" title="Concepts"
|
||||
menu="zmi_views" title="Configure"
|
||||
/>
|
||||
|
||||
</pages>
|
||||
|
@ -319,7 +332,6 @@
|
|||
content_factory="loops.view.Node"
|
||||
schema="loops.interfaces.INode"
|
||||
fields="title description nodeType body"
|
||||
class="loops.browser.node.ConfigureView"
|
||||
permission="zope.ManageContent">
|
||||
|
||||
<widget field="description" height="2" />
|
||||
|
|
|
@ -118,7 +118,7 @@ class NodeView(object):
|
|||
if target is None or IDocument.providedBy(target):
|
||||
return 'textbody'
|
||||
if IConcept.providedBy(target): # TODO...
|
||||
return 'filebody'
|
||||
return 'conceptbody'
|
||||
if IMediaAsset.providedBy(target) and target.contentType.startswith('image/'):
|
||||
return 'imagebody'
|
||||
return 'filebody'
|
||||
|
|
|
@ -12,10 +12,10 @@
|
|||
|
||||
|
||||
<metal:body define-macro="textbody">
|
||||
<tal:body define="body item/body"
|
||||
condition="body">
|
||||
<tal:body define="body item/body">
|
||||
<div class="content-1"
|
||||
tal:define="onclick string:openEditWindow('${item/url}/@@edit.html')"
|
||||
tal:condition="body"
|
||||
tal:attributes="class string:content-$level;
|
||||
ondblclick python: item.editable and onclick or ''"
|
||||
tal:content="structure body">
|
||||
|
@ -34,6 +34,21 @@
|
|||
</metal:body>
|
||||
|
||||
|
||||
<metal:body define-macro="conceptbody">
|
||||
<tal:body define="body item/body">
|
||||
<div class="content-1"
|
||||
tal:define="onclick string:openEditWindow('${item/url}/@@configure.html')"
|
||||
tal:attributes="class string:content-$level;
|
||||
ondblclick python: item.editable and onclick or ''">
|
||||
<a href="#"
|
||||
tal:omit-tag=""
|
||||
tal:attributes="href item/target/@@absolute_url"
|
||||
tal:content="structure body">The body</a>
|
||||
</div>
|
||||
</tal:body>
|
||||
</metal:body>
|
||||
|
||||
|
||||
<metal:body define-macro="filebody">
|
||||
<tal:body define="body item/body">
|
||||
<div class="content-1"
|
||||
|
|
153
browser/pageform.pt
Normal file
153
browser/pageform.pt
Normal file
|
@ -0,0 +1,153 @@
|
|||
<html metal:extend-macro="context/@@standard_macros/view"
|
||||
metal:define-macro="main">
|
||||
<head>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div metal:fill-slot="body">
|
||||
|
||||
<div metal:define-macro="form">
|
||||
|
||||
<form action="." metal:define-macro="master"
|
||||
tal:attributes="action request/URL" method="post"
|
||||
class="edit-form" enctype="multipart/form-data"
|
||||
id="zc.page.browser_form">
|
||||
|
||||
<script type="text/javascript"><!--
|
||||
|
||||
function toggleFormFieldHelp(ob,state) {
|
||||
// ob is the label element
|
||||
var field = ob.form[ob.htmlFor];
|
||||
if (field) {
|
||||
var viz = state && 'hidden' || 'visible';
|
||||
if (field.length == null) {
|
||||
field.style.visibility = viz;
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < field.length; ++i) {
|
||||
var e = field.item(i);
|
||||
e.style.visibility = viz;
|
||||
}
|
||||
}
|
||||
var help = document.getElementById("field-help-for-" + field.name);
|
||||
if (help) {
|
||||
help.style.visibility = state && 'visible' || 'hidden';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-->
|
||||
</script>
|
||||
|
||||
<div id="viewspace" metal:define-slot="viewspace">
|
||||
|
||||
<h1 i18n:translate="heading_editform"
|
||||
metal:define-slot="heading">Edit
|
||||
<span i18n:name="title"
|
||||
tal:content="context/title">Concept</span>
|
||||
</h1>
|
||||
|
||||
<metal:block define-macro="header">
|
||||
|
||||
<div class="form-status"
|
||||
tal:define="status view/status"
|
||||
tal:condition="status">
|
||||
|
||||
<div class="summary"
|
||||
i18n:translate=""
|
||||
tal:content="view/status">
|
||||
Form status summary
|
||||
</div>
|
||||
|
||||
<ul class="errors" tal:condition="view/errors">
|
||||
<li tal:repeat="error view/error_views">
|
||||
<span tal:replace="structure error">Error Type</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<br />
|
||||
</metal:block>
|
||||
|
||||
<div metal:define-slot="extra_info" tal:replace="nothing">
|
||||
</div>
|
||||
|
||||
<table class="form-fields">
|
||||
<tr class="row" metal:define-slot="extra_top" tal:replace="nothing">
|
||||
<td class="label">Extra top</td>
|
||||
<td class="label"><input type="text" /></td>
|
||||
</tr>
|
||||
<tbody metal:define-slot="formbody" tal:omit-tag="">
|
||||
<tr tal:repeat="widget view/widgets">
|
||||
<td class="label" tal:define="hint widget/hint"
|
||||
metal:define-macro="labelcell">
|
||||
<label tal:condition="python:hint"
|
||||
tal:attributes="for widget/name"
|
||||
onmousedown="toggleFormFieldHelp(this,1)"
|
||||
onmouseup="toggleFormFieldHelp(this,0)"
|
||||
onmouseout="toggleFormFieldHelp(this,0)"
|
||||
style="cursor: help">
|
||||
<span class="required" tal:condition="widget/required"
|
||||
>*</span><span i18n:translate=""
|
||||
tal:content="widget/label">label</span>
|
||||
</label>
|
||||
<label tal:condition="python:not hint"
|
||||
tal:attributes="for widget/name">
|
||||
<span class="required" tal:condition="widget/required"
|
||||
>*</span><span i18n:translate=""
|
||||
tal:content="widget/label">label</span>
|
||||
</label>
|
||||
</td>
|
||||
<td class="field" tal:define="hint widget/hint"
|
||||
metal:define-macro="widgetcell">
|
||||
<div class="form-fields-help"
|
||||
i18n:translate=""
|
||||
tal:content="hint"
|
||||
tal:condition="hint"
|
||||
tal:attributes="id string:field-help-for-${widget/name}"
|
||||
onclick="this.style.visibility='hidden';"
|
||||
style="visibility: hidden; position: absolute;"
|
||||
>Title of this content object.</div>
|
||||
<div class="widget" tal:content="structure widget">
|
||||
<input type="text" /></div>
|
||||
<div class="error"
|
||||
tal:condition="widget/error"
|
||||
>
|
||||
<!-- TODO Put this back, the Zope3 way.
|
||||
<img src="alert.gif" alt="Error"
|
||||
tal:replace="structure context/alert.gif" />
|
||||
-->
|
||||
<span tal:replace="structure widget/error">error</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tr class="row" metal:define-slot="extra_bottom" tal:replace="nothing">
|
||||
<td class="label">Extra bottom</td>
|
||||
<td class="label"><input type="text" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<metal:block define-slot="above_buttons" />
|
||||
</div>
|
||||
<div id="actionsView">
|
||||
<br />
|
||||
<span class="actionButtons"
|
||||
tal:condition="view/availableActions"
|
||||
metal:define-slot="bottom_buttons">
|
||||
<input tal:repeat="action view/actions"
|
||||
tal:replace="structure action/render"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
<script type="text/javascript" metal:define-slot="trackChanges">
|
||||
zc_trackChanges(document.getElementById('zc.page.browser_form'));
|
||||
</script>
|
||||
|
||||
<script type="text/javascript"
|
||||
tal:define="extra_script view/extra_script | nothing"
|
||||
tal:condition="extra_script"
|
||||
tal:content="structure extra_script" />
|
||||
|
||||
</div></div></body></html>
|
|
@ -23,8 +23,13 @@ $Id$
|
|||
"""
|
||||
|
||||
from zope.app import zapi
|
||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||
from zope.app.publisher.browser.menu import BrowserMenu
|
||||
from zope.app.publisher.interfaces.browser import IBrowserSubMenuItem
|
||||
from zope.formlib.namedtemplate import NamedTemplateImplementation
|
||||
|
||||
|
||||
pageform = NamedTemplateImplementation(ViewPageTemplateFile('pageform.pt'))
|
||||
|
||||
|
||||
class LoopsMenu(BrowserMenu):
|
||||
|
|
|
@ -107,6 +107,8 @@ So let's check the type of the type object:
|
|||
'.loops/concepts/type'
|
||||
>>> type_type.tokenForSearch
|
||||
'loops:concept:type'
|
||||
>>> type_type.qualifiers
|
||||
('concept', 'system',)
|
||||
|
||||
Now we register another type ('topic') and assign it to cc1:
|
||||
|
||||
|
@ -126,6 +128,8 @@ lazy properties, one should always get a new adapter:
|
|||
False
|
||||
>>> cc1_type.typeProvider == topic
|
||||
True
|
||||
>>> topic_type.qualifiers
|
||||
('concept',)
|
||||
|
||||
Now let's have a look at resources.
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue