Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
Zope
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
Zope
Commits
3e0ffac6
Commit
3e0ffac6
authored
Nov 25, 2003
by
Amos Latteier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated the Zope Tutorial to use ZPT in place of DTML.
parent
11ac7685
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
416 additions
and
295 deletions
+416
-295
import/ZopeTutorialExamples.zexp
import/ZopeTutorialExamples.zexp
+0
-0
lib/python/Products/ZopeTutorial/CHANGES.txt
lib/python/Products/ZopeTutorial/CHANGES.txt
+16
-0
lib/python/Products/ZopeTutorial/TutorialTopic.py
lib/python/Products/ZopeTutorial/TutorialTopic.py
+11
-5
lib/python/Products/ZopeTutorial/dtml/lessonView.dtml
lib/python/Products/ZopeTutorial/dtml/lessonView.dtml
+0
-4
lib/python/Products/ZopeTutorial/glossary.stx
lib/python/Products/ZopeTutorial/glossary.stx
+86
-4
lib/python/Products/ZopeTutorial/tutorial.stx
lib/python/Products/ZopeTutorial/tutorial.stx
+302
-281
lib/python/Products/ZopeTutorial/version.txt
lib/python/Products/ZopeTutorial/version.txt
+1
-1
No files found.
import/ZopeTutorialExamples.zexp
View file @
3e0ffac6
No preview for this file type
lib/python/Products/ZopeTutorial/CHANGES.txt
View file @
3e0ffac6
Zope Tutorial 1.1
Features
* Updates lessions to use ZPT in place of DTML. This required
extensive reworking in some lessons.
* Update the examples .zexp file.
* Updated likes to the Zope book to refer to the current online
version.
* Updated the glossary.
* Added a ZPT reference link feature for the glossary.
Zope Tutorial 1.0a6
Zope Tutorial 1.0a6
Bug Fixes
Bug Fixes
...
...
lib/python/Products/ZopeTutorial/TutorialTopic.py
View file @
3e0ffac6
...
@@ -18,8 +18,6 @@ import DocumentTemplate
...
@@ -18,8 +18,6 @@ import DocumentTemplate
import
StructuredText
import
StructuredText
import
re
import
re
from
zExceptions
import
BadRequest
pre_pat
=
re
.
compile
(
r'<PRE>(.+?)</PRE>'
,
re
.
IGNORECASE
|
re
.
DOTALL
)
pre_pat
=
re
.
compile
(
r'<PRE>(.+?)</PRE>'
,
re
.
IGNORECASE
|
re
.
DOTALL
)
tutorialExamplesFile
=
'ZopeTutorialExamples.zexp'
tutorialExamplesFile
=
'ZopeTutorialExamples.zexp'
...
@@ -132,7 +130,7 @@ class GlossaryTopic(TutorialTopic):
...
@@ -132,7 +130,7 @@ class GlossaryTopic(TutorialTopic):
Returns the URL to a API documentation for a given class.
Returns the URL to a API documentation for a given class.
"""
"""
names
=
klass
.
split
(
'.'
)
names
=
klass
.
split
(
'.'
)
url
=
"%s/Control_Panel/Products/%s/Help/%s.py#%s"
%
(
REQUEST
[
'
BASEPATH1
'
],
url
=
"%s/Control_Panel/Products/%s/Help/%s.py#%s"
%
(
REQUEST
[
'
SCRIPT_NAME
'
],
names
[
0
],
names
[
1
],
names
[
2
])
names
[
0
],
names
[
1
],
names
[
2
])
return
'<a href="%s">API Documentation</a>'
%
url
return
'<a href="%s">API Documentation</a>'
%
url
...
@@ -140,9 +138,17 @@ class GlossaryTopic(TutorialTopic):
...
@@ -140,9 +138,17 @@ class GlossaryTopic(TutorialTopic):
"""
"""
Returns the URL to a DTML Reference page for a given tag.
Returns the URL to a DTML Reference page for a given tag.
"""
"""
url
=
"%s/Control_Panel/Products/OFSP/Help/dtml-%s.stx"
%
(
REQUEST
[
'
BASEPATH1
'
],
tag
)
url
=
"%s/Control_Panel/Products/OFSP/Help/dtml-%s.stx"
%
(
REQUEST
[
'
SCRIPT_NAME
'
],
tag
)
return
'<a href="%s">DTML Reference</a>'
%
url
return
'<a href="%s">DTML Reference</a>'
%
url
def
zptLink
(
self
,
tag
,
REQUEST
):
"""
Returns the URL to a ZPT Reference page for a given topic.
"""
url
=
"%s/Control_Panel/Products/PageTemplates/Help/%s.stx"
%
(
REQUEST
[
'SCRIPT_NAME'
],
tag
)
return
'<a href="%s">ZPT Reference</a>'
%
url
addTutorialForm
=
DTMLFile
(
'dtml/tutorialAdd'
,
globals
())
addTutorialForm
=
DTMLFile
(
'dtml/tutorialAdd'
,
globals
())
...
@@ -162,7 +168,7 @@ def addTutorial(self, id, REQUEST=None, RESPONSE=None):
...
@@ -162,7 +168,7 @@ def addTutorial(self, id, REQUEST=None, RESPONSE=None):
from
Products.ZGadflyDA.DA
import
data_sources
from
Products.ZGadflyDA.DA
import
data_sources
data_sources
()
data_sources
()
except
:
except
:
raise
BadRequest
,
'The ZGadflyDA product must be installed!'
raise
'Bad Request'
,
'The ZGadflyDA product must be installed!'
# work around old Zope bug in importing
# work around old Zope bug in importing
try
:
try
:
...
...
lib/python/Products/ZopeTutorial/dtml/lessonView.dtml
View file @
3e0ffac6
...
@@ -34,10 +34,6 @@ PRE {
...
@@ -34,10 +34,6 @@ PRE {
<hr>
<hr>
<dtml-var tutorialNavigation>
<dtml-var tutorialNavigation>
<p class="feedback">Comments on this lesson?
<a href="mailto:zdp@zope.org?subject=&dtml.url_quote_plus-title;">Email feedback</a>.
</p>
<dtml-var standard_html_footer>
<dtml-var standard_html_footer>
lib/python/Products/ZopeTutorial/glossary.stx
View file @
3e0ffac6
Glossary
Glossary
<!-- XXX fix this -->
For general information about Zope <a href="http://www.zope.org/"
For general information about Zope <a
href="http://www.zope.org/SiteIndex/searchForm"
target="_blank">search</a> Zope.org.
target="_blank">search</a> Zope.org.
For Zope documentation try the <a href="http://zdp.zope.org"
For Zope documentation try the <a href="http://zdp.zope.org"
...
@@ -100,6 +98,13 @@ Glossary
...
@@ -100,6 +98,13 @@ Glossary
<dtml-var "dtmlLink('sendmail', REQUEST)">
<dtml-var "dtmlLink('sendmail', REQUEST)">
[File] -- A Zope object that contains binary or textual data. Files
don't contain dynamic data.
For more information on Folders see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/BasicObject.stx"
target="_blank">Basic Objects chapter</a> of The Zope Book.
[Folder] -- A Zope object that contains other Zope objects. You can
[Folder] -- A Zope object that contains other Zope objects. You can
move objects between Folders by cutting and pasting them. You can
move objects between Folders by cutting and pasting them. You can
add new objects to Folders with the product add list.
add new objects to Folders with the product add list.
...
@@ -136,6 +141,29 @@ Glossary
...
@@ -136,6 +141,29 @@ Glossary
<dtml-var "apiLink('MailHost.MailHost.MailHost', REQUEST)">
<dtml-var "apiLink('MailHost.MailHost.MailHost', REQUEST)">
[Page Template] -- A dynamic web page object.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
[Page Template Macro] -- A device for sharing presentation between
page templates.
For more information on macros see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/AdvZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
[Page Template Statements] -- Special attributes that connect
templates to other components and dynamically tailor the HTML of the
template.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
<dtml-var "zptLink('tal', REQUEST)">
[Paste] -- Insert the objects from the clipboard into the current Folder.
[Paste] -- Insert the objects from the clipboard into the current Folder.
[product add list] -- The list of addable objects. Select an object
[product add list] -- The list of addable objects. Select an object
...
@@ -156,6 +184,60 @@ Glossary
...
@@ -156,6 +184,60 @@ Glossary
[standard_html_footer] -- The standard Zope footer object. By
[standard_html_footer] -- The standard Zope footer object. By
convention this object displays an HTML footer.
convention this object displays an HTML footer.
[standard_template.pt] -- The standard Zope macro template. By
convention this object defines a whole page macro and a number of
slots. Other templates then use the macro and fill one or more
slots.
[tal:attributes] -- A ZTP statement that sets one or more tag
attributes.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
[tal:condition] -- A ZTP statement that conditionally includes a tag.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
<dtml-var "zptLink('tal-condition', REQUEST)">
[tal:content] -- A ZPT statement that replaces the content of a tag.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
<dtml-var "zptLink('tal-content', REQUEST)">
[tal:define] -- A ZPT statement that defines one or more variables.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
<dtml-var "zptLink('tal-define', REQUEST)">
[tal:repeat] -- A ZPT statement that loops over a list of objects
inserting a copy of the statement element for each item in the list.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
<dtml-var "zptLink('tal-repeat', REQUEST)">
[tal:replace] -- A ZPT statement that replaces a tag and its
contents entirely.
For more information on ZPT see the <a
href="http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx"
target="_blank">Page Templates chapter</a> of The Zope Book.
<dtml-var "zptLink('tal-replace', REQUEST)">
[title] -- Most Zope objects can have titles. Titles are optional
[title] -- Most Zope objects can have titles. Titles are optional
one line descriptions.
one line descriptions.
...
...
lib/python/Products/ZopeTutorial/tutorial.stx
View file @
3e0ffac6
...
@@ -43,47 +43,47 @@ Lesson 1. "Elvis Lives" Home Page
...
@@ -43,47 +43,47 @@ Lesson 1. "Elvis Lives" Home Page
Let's create a home page for "Elvis Lives", an organization that
Let's create a home page for "Elvis Lives", an organization that
tracks Elvis sightings.
tracks Elvis sightings.
First you need to create a [
DTML Document
]
First you need to create a [
Page Template
]
for the home page. Zope uses '
DTML Document
s' for web pages.
for the home page. Zope uses '
Page Template
s' for web pages.
1. Select '
DTML Document
' from the "Select type to add..." list.
1. Select '
Page Template
' from the "Select type to add..." list.
2. Type 'home.html' for the
document
[id].
2. Type 'home.html' for the
template
[id].
3. Type 'Elvis Lives' for the document [title].
3. Click the 'Add and Edit' button.
4. Click the 'Add and Edit' button.
You should now see a screen
You should now see a screen
where you can edit your web page.
where you can edit your web page.
1. Change the contents of the document to::
1. Change the title of the template to 'Elvis Lives'.
1. Change the contents of the template to::
<
dtml-var standard_html_header
>
<
html
>
<
dtml-var header.gif
>
<
img
tal:replace=
"structure container/header.gif"
>
<p>
<p>
Welcome to <i
><dtml-var title>
</i>,
Welcome to
<i
tal:content=
"template/title"
>
title
</i>
,
your source for information about
your source for information about
Elvis and
Elvis
and Elvis
sightings.
Elvis sightings.
</p>
</p>
<
dtml-var standard_html_footer
>
<
/html
>
2. Click the 'Save Changes' button.
2. Click the 'Save Changes' button.
The contents of the
document are a mixture of HTML and special
The contents of the
template is HTML along with special attributes
tags called [DTML
].
called [Page Template Statements
].
The [
<dtml-var>] tag inserts things into web pages. In this page,
The [
tal:content] and [tal:replace] statements inserts things into
we use this tag to insert a page header, an image, a title, and a
tags. In this page we use these statement to insert an image and
page footer
.
a title
.
Now let's see what our page
Now let's see what our page
looks like.
looks like.
1. Click the '
View
' tab at the top of the screen.
1. Click the '
Test
' tab at the top of the screen.
Congratulations you've created
Congratulations you've created
a web page with Zope.
a web page with Zope.
...
@@ -93,16 +93,14 @@ Lesson 1. "Elvis Lives" Home Page
...
@@ -93,16 +93,14 @@ Lesson 1. "Elvis Lives" Home Page
Zope allows you to create and manage objects through
Zope allows you to create and manage objects through
the web.
the web.
* Zope uses [
DTML Document
]s
* Zope uses [
Page Template
]s
for web pages.
for web pages.
* You can create Zope objects by choosing them from the "Select
* You can create Zope objects by choosing them from the "Select
type to add..." list.
type to add..." list.
* You can view Zope objects by clicking the 'View' tab.
* You can insert content in web pages with the
* You can insert content in web pages with the
[
<dtml-var>] tag
.
[
tal:content] and [tal:replace] statements
.
In the next lesson you'll expand
In the next lesson you'll expand
your web site.
your web site.
...
@@ -117,7 +115,7 @@ Lesson 2. Going to Graceland
...
@@ -117,7 +115,7 @@ Lesson 2. Going to Graceland
1. Click on the 'graceland' [Folder].
1. Click on the 'graceland' [Folder].
2. Inside you should see a number of objects including an
2. Inside you should see a number of objects including an
'index_html'
document
.
'index_html'
page
.
If a [Folder] contains an object named [index_html], that object
If a [Folder] contains an object named [index_html], that object
provides the folder's default view. This is just like how an
provides the folder's default view. This is just like how an
...
@@ -133,44 +131,42 @@ Lesson 2. Going to Graceland
...
@@ -133,44 +131,42 @@ Lesson 2. Going to Graceland
3. Return to the enclosing folder by clicking the 'lesson2' link
3. Return to the enclosing folder by clicking the 'lesson2' link
in the folder's URL.
in the folder's URL.
4. Click on the 'home.html'
document
to edit it.
4. Click on the 'home.html'
template
to edit it.
5. Change the contents of the 'home.html'
document
to::
5. Change the contents of the 'home.html'
template
to::
<
dtml-var standard_html_header
>
<
html
>
<
dtml-var header.gif
>
<
img
tal:replace=
"structure container/header.gif"
>
<p>
<p>
Welcome to <i
><dtml-var title>
</i>,
Welcome to
<i
tal:content=
"template/title"
>
title
</i>
,
your source for information about
your source for information about
Elvis and
Elvis
and Elvis
sightings.
Elvis sightings.
</p>
</p>
<h2>About Elvis</h2>
<p>
<p>
Elvis was born in
Elvis was born in
<a
href=
"graceland"
>
Graceland
</a>
.
<a
href=
"graceland"
>
Graceland
</a>
.
</p>
</p>
<
dtml-var standard_html_footer
>
<
/html
>
6. Click the 'Save Changes' button.
6. Click the 'Save Changes' button.
This adds a link the the 'graceland' folder. Now let's test
This adds a link the the 'graceland' folder. Now let's test
out the link.
out the link.
7. Click the '
View
' tab.
7. Click the '
Test
' tab.
You've successfully created a multi-page site with a link between two
You've successfully created a multi-page site with a link between two
Zope objects.
Zope objects.
Summary
Summary
Zope files and
documents have a lot in common with
Zope files and
templates have a lot in common with conventional
conventional web pages--they have names, are arranged in hierarchies,
web pages--they have names, are arranged in hierarchies, and have
and have
URLs that correspond to their locations.
URLs that correspond to their locations.
* [Folder]s contain other Zope objects.
* [Folder]s contain other Zope objects.
...
@@ -201,8 +197,8 @@ Lesson 3. Elvis's Favorite Foods
...
@@ -201,8 +197,8 @@ Lesson 3. Elvis's Favorite Foods
Now we've got some place to put our food related resources. Let's
Now we've got some place to put our food related resources. Let's
move some objects into this folder.
move some objects into this folder.
1. Select the 'sandwiches
', 'pie', and 'meatloaf' documents by
1. Select the 'sandwiches
.html', 'pie.html', and 'meatloaf.html'
clicking their check boxes.
templates by
clicking their check boxes.
2. Click the 'Cut' button.
2. Click the 'Cut' button.
...
@@ -213,23 +209,23 @@ Lesson 3. Elvis's Favorite Foods
...
@@ -213,23 +209,23 @@ Lesson 3. Elvis's Favorite Foods
Now that we've moved some objects, we need to update the links to
Now that we've moved some objects, we need to update the links to
them because an object's URL is related to its location.
them because an object's URL is related to its location.
1. Return to the 'home.html'
document
in the 'lesson3' folder,
1. Return to the 'home.html'
template
in the 'lesson3' folder,
by clicking on the 'lesson3' location link and then clicking
by clicking on the 'lesson3' location link and then clicking
on the 'home.html'
document
.
on the 'home.html'
page
.
2. Change the links to the sandwiches, pie and cake
document
s
2. Change the links to the sandwiches, pie and cake
template
s
to::
to::
<p>
<p>
Elvis liked to eat
Elvis liked to eat
<a href="food/sandwiches">sandwiches</a>,
<a
href=
"food/sandwiches
.html
"
>
sandwiches
</a>
,
<a href="food/pie">pie</a>, and
<a
href=
"food/pie
.html
"
>
pie
</a>
, and
<a href="food/meatloaf">meatloaf</a>.
<a
href=
"food/meatloaf
.html
"
>
meatloaf
</a>
.
</p>
</p>
3. Click the 'Save Changes' button.
3. Click the 'Save Changes' button.
4. Click the '
View
' tab at the top of the screen.
4. Click the '
Test
' tab at the top of the screen.
Notice that the food resources are now correctly linked from the home
Notice that the food resources are now correctly linked from the home
page in their new location.
page in their new location.
...
@@ -263,9 +259,10 @@ Lesson 4. Site Contact Information
...
@@ -263,9 +259,10 @@ Lesson 4. Site Contact Information
1. Click the 'Properties' tab.
1. Click the 'Properties' tab.
2. Type '
webmaster
' in the Name field.
2. Type '
mail_link
' in the Name field.
3. Type your email address in the Value field.
3. Type a mail link to your email address
(e.g. 'mailto:me@example.com') in the Value field.
4. Click the 'Add' button.
4. Click the 'Add' button.
...
@@ -274,35 +271,43 @@ Lesson 4. Site Contact Information
...
@@ -274,35 +271,43 @@ Lesson 4. Site Contact Information
address on each web page by changing the standard web page footer.
address on each web page by changing the standard web page footer.
1. Click the 'Contents' tab to return to the list of items in the
1. Click the 'Contents' tab to return to the list of items in the
folder, then click the 'standard_
html_footer' [DTML Method
] to
folder, then click the 'standard_
template.pt' [Page Template
] to
edit it.
edit it.
2. Change the contents of the method to::
2. Change the contents of the template to add a mail to link at
the bottom of the page::
<html
metal:define-macro=
"page"
>
<body>
<div
metal:define-slot=
"body"
>
This is where the page's body text goes.
</div>
<hr>
<hr>
<a href="mailto:<dtml-var webmaster>?subject=<dtml-var
<a
tal:attributes=
"href container/mail_link"
>
mail
title>">Email W
ebmaster</a>
w
ebmaster
</a>
</body>
</body>
</html>
</html>
3. Click the 'Save Changes' button.
3. Click the 'Save Changes' button.
We've change the standard Zope
footer. Now let's verify that this
We've change the standard Zope
page macro. Now let's verify that
change is reflected in our web pages.
this
change is reflected in our web pages.
1. Navigate to the 'home.html'
document
in the 'lesson4' folder
1. Navigate to the 'home.html'
template
in the 'lesson4' folder
by clicking on the 'lesson4' location link and then clicking
by clicking on the 'lesson4' location link and then clicking
on the 'home.html'
document
.
on the 'home.html'
page
.
2. Now click the '
View
' tab to view the web site.
2. Now click the '
Test
' tab to view the web site.
Notice that there is now an email link at the bottom of every web
Notice that there is now an email link at the bottom of every web
page. The email link uses the property you defined and includes the
page. The email link uses the property you defined and includes the
title of the web page as the email subject.
title of the web page as the email subject.
The email link appears on every page because every page
The email link appears on every page because every page template
includes the 'standard_html_footer' object with the
uses a [Page Template Macro] defined in the 'standard_template.pt'
[<dtml-var>] tag.
template. Macros provide a way of sharing presentation elements
between pages. The 'standard_template.pt' template gives you a
convention for making pages share a common structure.
Summary
Summary
...
@@ -311,10 +316,10 @@ Lesson 4. Site Contact Information
...
@@ -311,10 +316,10 @@ Lesson 4. Site Contact Information
* [Properties] contain small pieces of content.
* [Properties] contain small pieces of content.
* Use the [<dtml-var>] tag to insert properties into web
* Use the [tal:attributes] statement to change tag attributes.
pages.
* [standard_html_footer] is used as the default Zope web page footer.
* [standard_template.pt] is used to provide shared look and feel
between templates.
In the next lesson you'll see how to organize content
In the next lesson you'll see how to organize content
with a collection of Zope objects.
with a collection of Zope objects.
...
@@ -326,9 +331,9 @@ Lesson 5. Recent Elvis Sightings
...
@@ -326,9 +331,9 @@ Lesson 5. Recent Elvis Sightings
list them on your web site. Let's look at a simple system for
list them on your web site. Let's look at a simple system for
organizing sightings and displaying them on your web site.
organizing sightings and displaying them on your web site.
1. Click the 'sightings' web page.
1. Click the 'sightings
.html
' web page.
2. Click the '
View
' tab to view it.
2. Click the '
Test
' tab to view it.
Notice how the page lists a number of Elvis sightings. Also notice
Notice how the page lists a number of Elvis sightings. Also notice
that these sightings weren't specifically listed in the contents of
that these sightings weren't specifically listed in the contents of
...
@@ -336,24 +341,24 @@ Lesson 5. Recent Elvis Sightings
...
@@ -336,24 +341,24 @@ Lesson 5. Recent Elvis Sightings
1. Click the 'sightingsFolder' folder to enter it.
1. Click the 'sightingsFolder' folder to enter it.
2. Click on the '
Shelbyville' method
to examine it.
2. Click on the '
sighting2' file
to examine it.
3. Go back the 'sightingsFolder' folder by clicking the
3. Go back the 'sightingsFolder' folder by clicking the
'sightingsFolder' location link.
'sightingsFolder' location link.
4. Select the '
Shelbyville' method
by clicking its check box.
4. Select the '
sighting2' file
by clicking its check box.
5. Click the 'Delete' button.
5. Click the 'Delete' button.
You just deleted a Zope object that describes an Elvis sighting.
You just deleted a Zope object that describes an Elvis sighting.
Let's see how this affects the 'sightings' web page.
Let's see how this affects the 'sightings' web page.
1. Click the 'sightings' web page.
1. Click the 'sightings
.html
' web page.
2. Click the '
View
' tab to view it.
2. Click the '
Test
' tab to view it.
The Shelbyville sighting is not longer listed. So the list of
The Shelbyville sighting is not longer listed. So the list of
sightings is somehow built from the
method
s in the 'sightingsFolder'
sightings is somehow built from the
file
s in the 'sightingsFolder'
folder.
folder.
What if you want the Shelbyville sighting back? Since you deleted
What if you want the Shelbyville sighting back? Since you deleted
...
@@ -368,15 +373,15 @@ Lesson 5. Recent Elvis Sightings
...
@@ -368,15 +373,15 @@ Lesson 5. Recent Elvis Sightings
4. Click the 'sightingsFolder' folder to enter it.
4. Click the 'sightingsFolder' folder to enter it.
Sure enough the '
Shelbyville
' sighting has returned.
Sure enough the '
sighting2
' sighting has returned.
Summary
Summary
Multiple Zope objects can be combined to form complex web pages.
Multiple Zope objects can be combined to form complex web pages.
* [
DTML Method]s contain chunks of
content.
* [
File]s contain chunks of textual or binary
content.
* Web pages can insert content from '
DTML Method
s'.
* Web pages can insert content from '
File
s'.
* You can recover from mistakes with [Undo].
* You can recover from mistakes with [Undo].
...
@@ -386,48 +391,56 @@ Lesson 5. Recent Elvis Sightings
...
@@ -386,48 +391,56 @@ Lesson 5. Recent Elvis Sightings
Lesson 6. Recent Elvis Sightings, cont.
Lesson 6. Recent Elvis Sightings, cont.
<dtml-var
"
tutorialShowLesson
(
6
,
REQUEST
)"
>
<dtml-var
"
tutorialShowLesson
(
6
,
REQUEST
)"
>
So we've seen that the 'sightings' page is built from objects in the
So we've seen that the 'sightings.html' page is built from objects
'sightingsFolder' folder. How does it work?
in the 'sightingsFolder' folder. How does it work?
1. Click the 'sightings.html' template to edit it.
1. Click the 'sightings' document to edit it.
2. Change the contents of the template to::
2. Change the contents of the document to::
<html>
<dtml-var standard_html_header>
<h1
tal:content=
"template/title"
>
title
</h1>
<h2><dtml-var title></h2>
<table
border=
"1"
>
<table
border=
"1"
>
<dtml-in expr="sightingsFolder.objectValues()">
<tr>
<tr><td>
<td>
<dtml-var sequence-item>
<div
tal:repeat=
"sighting container/sightingsFolder/objectValues"
</td></tr>
tal:content=
"structure sighting"
>
</dtml-in>
Sighting goes here
</div>
</td>
</tr>
</table>
</table>
<
dtml-var standard_html_footer
>
<
/html
>
3. Click the 'Save Changes' button.
3. Click the 'Save Changes' button.
4. Click the '
View
' tab.
4. Click the '
Test
' tab.
Notice how each sighting now has a box drawn around it.
Notice how each sighting now has a box drawn around it.
What's going on? The [<dtml-in>] tag iterates over a list of
What's going on? The [tal:repeat] statement iterates over a list of
objects. The <'dtml-var sequence-item'> tag inserts the
sightings. The list is defined by the expression
current object. The 'expr="sightingsFolder.objectValues()"' part of
'container/sightingsFolder/objectValues'. The expression calls the
the [<dtml-in>] tags tells it how to get a list of objects. It
'objectValues' method of the 'sightingsFolder' folder. It returns
calls the 'objectValues' method of the 'sightingsFolder' folder.
all the objects contained by a folder.
'objectValues' returns all the objects contained by a folder.
Notice the 'sighting' part of the repeat statement. It is a local
variable that takes the value of each object in the list in
turn. This variable is used by the the [tal:content] statement to
insert the contents of each file object inside the table.
Summary
Summary
You can programmatically build web pages with groups of objects
You can programmatically build web pages with groups of objects
by looping over them and inserting them.
by looping over them and inserting them.
* [
<dtml-in>
] iterates over a list of objects.
* [
tal:repeat
] iterates over a list of objects.
*
<'dtml-var sequence-item'> inserts the current objec
t
*
[tal:repeat] defines a local variable that you can use to ge
t
when looping over a list of objects
.
access to objects in the list
.
* You can get the contents of a folder by calling its
* You can get the contents of a folder by calling its
'objectValues' method.
'objectValues' method.
...
@@ -441,42 +454,36 @@ Lesson 7. Elvis Photo Archive
...
@@ -441,42 +454,36 @@ Lesson 7. Elvis Photo Archive
The King had many faces. We can offer our site visitors a peek at
The King had many faces. We can offer our site visitors a peek at
the many sides of Elvis with a photo archive.
the many sides of Elvis with a photo archive.
1. Click the 'photos
' document
.
1. Click the 'photos
.html' template
.
2. Click the '
View
' tab to view it.
2. Click the '
Test
' tab to view it.
This page shows the photos in the archive one after another. It's not
This page shows the photos in the archive one after another. It uses
very fancy.
Image objects stored in the 'photoArchive' folder. It's not very
fancy. Let's improve it to display the title and size of the
photos.
Let's improve it to organize the photos by title and size.
1. Click your browser's back button to return to the 'photos.html'
The improved photo archive will list
template to edit it.
the photos by title and includes a link each
picture.
1. Click your browser's back button to return to the 'photos'
2. Change the contents to::
document to edit it.
2. Change the document contents to::
<html>
<dtml-var standard_html_header>
<p
tal:repeat=
"photo container/photoArchive/objectValues"
>
<img
tal:replace=
"structure photo"
>
<h2><dtml-var title></h2>
<span
tal:replace=
"photo/title"
>
title
</span>
(
<span
tal:replace=
"photo/getSize"
>
size
</span>
bytes)
<dtml-in expr="photoArchive.objectValues()">
<p>
<a href="<dtml-var absolute_url>"><dtml-var title></a>
(<dtml-var getSize> bytes)
</p>
</p>
</dtml-in>
<
dtml-var standard_html_footer
>
<
/html
>
3. Click the 'Save Changes' button.
3. Click the 'Save Changes' button.
4. Click the '
View
' tab.
4. Click the '
Test
' tab.
Notice how
the photo list now shows a link to each photo along with
Notice how
each photo now includes a title
its size
.
and size information
.
Summary
Summary
...
@@ -487,10 +494,8 @@ Lesson 7. Elvis Photo Archive
...
@@ -487,10 +494,8 @@ Lesson 7. Elvis Photo Archive
* Get the size of an [Image] with the 'getSize' method.
* Get the size of an [Image] with the 'getSize' method.
* Get the URL of an object with the 'absolute_url' method.
In the next lesson you'll learn how to create
In the next lesson you'll learn how to create
pictures with
DTML
scripting.
pictures with
Python
scripting.
Lesson 8. Elvis Photo Archive, cont.
Lesson 8. Elvis Photo Archive, cont.
...
@@ -498,9 +503,9 @@ Lesson 8. Elvis Photo Archive, cont.
...
@@ -498,9 +503,9 @@ Lesson 8. Elvis Photo Archive, cont.
Now that we have a working photo archive, let's enhance it to handle
Now that we have a working photo archive, let's enhance it to handle
submissions from site visitors.
submissions from site visitors.
1. Click the '
photoForm' document
.
1. Click the '
form.html' template
.
2. Click the '
View
' tab to view it.
2. Click the '
Test
' tab to view it.
3. Upload a picture (JPG, GIF, PNG or other graphics format supported
3. Upload a picture (JPG, GIF, PNG or other graphics format supported
by your browser.)
by your browser.)
...
@@ -516,150 +521,162 @@ Lesson 8. Elvis Photo Archive, cont.
...
@@ -516,150 +521,162 @@ Lesson 8. Elvis Photo Archive, cont.
Let's investigate how this works, and add the ability to give our
Let's investigate how this works, and add the ability to give our
uploaded photo a title.
uploaded photo a title.
1. Click the '
photoForm' document
.
1. Click the '
form.html' template
.
2. Change the contents
of the document
to::
2. Change the contents to::
<
dtml-var standard_html_header
>
<
html
>
<h
2><dtml-var title></h2
>
<h
1
tal:content=
"template/title"
>
title
</h1
>
<p>
Upload a picture to the Elvis Photo Archive.
</p>
<p>
Upload a picture to the Elvis Photo Archive.
</p>
<form action="
photoAction
" method="post"
<form
action=
"
action.py
"
method=
"post"
enctype=
"multipart/form-data"
>
enctype=
"multipart/form-data"
>
<p>Title: <input type="text" name="photo_title"></p>
<p>
File:
<input
type=
"file"
name=
"file"
></p>
<p>
File:
<input
type=
"file"
name=
"file"
></p>
<p>
Title:
<input
type=
"text"
name=
"title"
></p>
<input
type=
"submit"
>
<input
type=
"submit"
>
</form>
</form>
<
dtml-var standard_html_footer
>
<
/html
>
3. Click the 'Save Changes' button.
3. Click the 'Save Changes' button.
This document collects data needed to create an Image. It calls the
This page collects data needed to create an Image. It calls the
'photoAction' document with that data. The 'photoAction' document
'action.py' script with that data. The 'action.py' script actually
actually creates the Image. Now let's customize the 'photoAction'
creates the Image. Now let's customize the script to handle the
document to handle the image title.
image title.
1. Click the 'photoAction' document to edit it.
2. Change the contents of the document to::
<dtml-var standard_html_header>
<h2><dtml-var title></h2>
1. Click the 'action.py' script to edit it.
<dtml-call
2. Change the parameter list to 'file, title'.
expr="photoArchive.manage_addImage(
id='', file=file, title=photo_title)">
<p>Thanks for your photo submission.</p>
3. Change the contents of the script to::
<dtml-var standard_html_footer>
"""
Create a new image in the photo archive folder.
Then return a confirmation page.
"""
folder=container['photoArchive']
folder.manage_addImage(id='', file=file, title=title)
page=container['thanks.html']
return page()
The
'photoAction' document uses the [<dtml-call>] tag to
The
script collects the form data, creates an image object in a
perform an action without inserting anything into the web page. It
folder and then returns a thanks page. It gets access to form data
calls the 'manage_addImage' method on the 'photoArchive' folder.
through its parameters. It calls the 'manage_addImage' folder method
'manage_addImage' is a folder method that creates a new
on the photo archive folder to create a new image there. Finally it
Image
.
locates the thanks page and renders and returns it
.
Summary
Summary
You can use forms to pass information between Zope objects.
*
You can use forms to pass information between Zope objects.
You can programmatically create new Zope objects.
You can programmatically create new Zope objects.
* Zope documents can be the action of HTML forms.
* Scripts can be the action of HTML forms.
* The [<dtml-call>] tag performs an action without inserting
anything into a web page.
* Create new [Image]s in folder with the 'manage_addImage' method.
* Create new [Image]s in folder with the 'manage_addImage' method.
* Scripts can render and return templates.
In the next lesson you'll learn about [HTTP Cookies] and
In the next lesson you'll learn about [HTTP Cookies] and
personalizing your web site.
personalizing your web site.
Lesson 9. Elvis, Up Close and Personal
Lesson 9. Elvis, Up Close and Personal
<dtml-var "tutorialShowLesson(9, REQUEST)">
<dtml-var
"
tutorialShowLesson
(
9
,
REQUEST
)"
>
People who come to your
People who come to your site want a personal relationship with
site want a personal relationship with Elvis. You can provide this
Elvis. You can provide this by tailoring your site to your viewer's
by tailoring your site to the needs and preferences of your viewers.
needs and preferences. Let's add the ability to bring new Elvis
Let's add the ability to bring new Elvis sightings to the attention
sightings to the attention of site visitors. This way when a visitor
of site visitors. This way when a visitor comes to your site they'll
comes to your site they'll immediately know which sightings are new
immediately know which sightings are new since they last visited.
since they last visited.
1. Click the 'sightings
' document
to edit it.
1. Click the 'sightings
.html' template
to edit it.
2. Click the '
View
' tab to view it.
2. Click the '
Test
' tab to view it.
All the sightings should be
All the sightings should be
marked as
N
ew.
marked as
n
ew.
3. Reload the page.
3. Reload the page.
Now none of the sightings should be marked as
N
ew. This is because
Now none of the sightings should be marked as
n
ew. This is because
you've already seen them.
you've already seen them.
4. Click the 'sightingsFolder' folder to enter it.
4. Click the 'sightingsFolder' folder to enter it.
5. Choose 'DTML Method' from the "Select type to add..." list.
5. Choose 'File' from the "Select type to add..." list.
6. Type 'Seattle' for the id.
6. Type 'Seattle' for the id. Since the title is optional and isn't
7. Click the 'Add' button.
really needed in this case, leave the title field blank.
7. Click the 'Add and Edit' button
.
8. Now click on the new file to edit it
.
8. Change the contents of the method to::
9. Change the content type to "text/html'.
<p>6/1/2000 -- Seattle</p>
10. Change the contents of the file to::
<p>
6/1/2003 -- Seattle
</p>
<p>
Elvis spotted spare changing on Broadway.
<p>
Elvis spotted spare changing on Broadway.
He denied being the King.
</p>
He denied being the King.
</p>
9
. Click the 'Save Changes' button.
11
. Click the 'Save Changes' button.
Now you've created a new sighting. Let's see if it is marked as new
Now you've created a new sighting. Let's see if it is marked as new
by the sightings page.
by the sightings page.
1
0. Click the 'sightings' document
in the 'lesson9' folder.
1
2. Click the 'sightings.html' page
in the 'lesson9' folder.
1
1. Click the 'View
' tab.
1
3. Click the 'Test
' tab.
Sure enough our new sighting is marked
N
ew.
Sure enough our new sighting is marked
n
ew.
How does this work? It uses [HTTP Cookies]. When you visit the
How does this work? It uses [HTTP Cookies]. When you visit the
'sightings' page a cookie is set that records the current time. Then
'sightings.html' page a cookie is set that records the current
each time you return to the page sightings that are newer than the
time. Then each time you return to the page sightings that are newer
cookie will be marked as new.
than the cookie will be marked as new.
Let's look at
how this works.
Let's look at the DTML for the 'sightings' page to see how this is
1. Click the 'sightings.html' template to view its contents.
done.
1. Click the 'sightings' document to view its contents.
Notice that the page uses the [tal:define] statement to defines a
'lastVisit' variable. It is defined by calling the 'lastVisit.py'
script. This variable holds the time that the user last visited the
page as recorded in a cookie.
The document sets a cookie with this code::
Later in the template this time is compared to the modification time
of each sighting object. If the sighting is new then it is marked as
such by including a bold tag. The bold tag uses the [tal:condition]
statement to optionally include its contents. In this case the
condition checks to see whether the 'bobobase_modification_date' of
the sighting is newer than the last visit. This strangely named
method keeps track of the last modification date of Zope objects.
<dtml-call expr="RESPONSE.setCookie('lastVisited',
Now let's examine the
_.DateTime())">
'lastVisit.py' script.
The document checks each sighting when displaying it to see if it is
2. Click on the 'lastVisit.py' script to view it.
newer than the 'lastVisited' cookie::
<dtml-if expr="bobobase_modification_time() >
Notice how it includes comments explaining its functioning. Comments
_.DateTime(lastVisited)">
begin with a number sign. The script does two things: it retrieves a
cookie from the request, and it sets a new cookie using the
response.
Summary
Summary
You can use cookies to personalize a web page. Zope
document
s
You can use cookies to personalize a web page. Zope
template
s
can dynamically control their presentation.
can dynamically control their presentation.
* You can set cookies with the
'RESPONSE.
setCookie' method.
* You can set cookies with the
response '
setCookie' method.
* The [
<dtml-if>] tag
allows you to test conditions.
* The [
tal:condition] statement
allows you to test conditions.
* The [DateTime] function allows you to get the current time.
* The [DateTime] function allows you to get the current time.
* The 'bobobase_modification_
tim
e' method returns the last
* The 'bobobase_modification_
dat
e' method returns the last
modification time of an object.
modification time of an object.
In the next lesson you'll learn how to create
In the next lesson you'll learn how to create
...
@@ -676,53 +693,53 @@ Lesson 10. So You've Seen Elvis
...
@@ -676,53 +693,53 @@ Lesson 10. So You've Seen Elvis
2. Type the name of your mail server in the 'SMTP Host' field.
2. Type the name of your mail server in the 'SMTP Host' field.
Your mail server is typically named 'mail'. For example,
Your mail server is typically named 'mail'
or 'smtp'
. For example,
'mail.elvislives.com'. If you don't know the name of your mail
'mail.elvislives.com'. If you don't know the name of your mail
server, ask your system administrator, or check the configuration of
server, ask your system administrator, or check the configuration of
your mail client.
your mail client.
3. Click the 'Save Changes' button.
3. Click the 'Save Changes' button.
Now Zope can send mail. Next let's edit the
template for the Elvis
Now Zope can send mail. Next let's edit the
mail
s
ighting report mail message
.
s
ending script
.
1. Click the '
reportAction' documen
t to edit it.
1. Click the '
action.py' scrip
t to edit it.
This
documen
t is called when a site visitor fills out an Elvis
This
scrip
t is called when a site visitor fills out an Elvis
sighting form.
This documen
t sends you mail telling you about the
sighting form.
I
t sends you mail telling you about the
sighting. Mail is sent
with the [<dtml-sendmail>] tag which
sighting. Mail is sent
by calling the 'simple_send' method of the
works with the mail host you just configured
.
Mail Host object
.
Notice that the 'to' and the 'from' line both reference a
To get this script to work you need to change the 'recipient' and
property named 'send_to'
.
'sender' variables
.
2. Click the 'Properties' tab to edit properties.
2. Change the 'recipient' and 'sender' variables to your email
address in place of 'user@host'.
3. Type your email address into the 'send_to' property field.
3. Click the 'Save Changes' button.
4. Click the 'Save Changes' button.
5. Now go to the 'reportForm' document
in the 'lesson10' folder.
4. Now go to the 'form.html' page
in the 'lesson10' folder.
6. Click the 'View
' tab to view it.
5. Click the 'Test
' tab to view it.
7
. Fill out the Elvis sighting form and submit it.
6
. Fill out the Elvis sighting form and submit it.
You should
now
receive a piece of email describing the Elvis
You should
soon
receive a piece of email describing the Elvis
sighting.
sighting.
Congratulations, you've built a mail form. If you receive
Congratulations, you've built a mail form. If you receive
a Zope
a Zope error, there is a good chance that you haven't set the 'SMTP
error, there is a good chance that you haven't set the 'SMTP Host'
Host' setting on your mail host object correctly.
setting on your mail host object correctly.
Summary
Summary
After you create a mail host, you can send mail from any
After you create a mail host, you can send mail from any
Zope document using the [<dtml-sendmail>] tag
.
script by calling its 'simple_send' method
.
* [Mail Host]s allow you to send email.
* [Mail Host]s allow you to send email.
* The [<dtml-sendmail>] tag sends an email message.
* The scripts format email messages and pass them to the Mail
Host.
In the next lesson you'll learn how to use Zope
In the next lesson you'll learn how to use Zope
to put a database on the web.
to put a database on the web.
...
@@ -768,30 +785,38 @@ Lesson 11. The Elvis Files
...
@@ -768,30 +785,38 @@ Lesson 11. The Elvis Files
Now let's see how to use
Now let's see how to use
this ZSQL Method in a web page.
this ZSQL Method in a web page.
1. Click the 'sightings
' DTML Document
in the 'lesson11' folder
1. Click the 'sightings
.html' template
in the 'lesson11' folder
to edit it.
to edit it.
Notice that the sightings are generated by iterating over the
Notice that the sightings are generated by iterating over the
'sightings' ZSQL Method with the [<dtml-in>] tag.
results of the 'getSightings' ZSQL Method with the [tal:repeat]
statement.
2. Add a line
between
each sighting by changing the contents of
2. Add a line
after
each sighting by changing the contents of
the 'sightings
' DTML Document
to::
the 'sightings
.html' template
to::
<dtml-var standard_html_header>
<html>
<h2><dtml-var title></h2>
<div
tal:repeat=
"sighting container/getSightings"
>
<p><span
tal:replace=
"sighting/date"
>
date
</span>
--
<span
tal:replace=
"sighting/location"
>
location
</span>
</p>
<p>
Reported by
<span
tal:replace=
"sighting/name"
>
name
</span>
</p>
<p
tal:content=
"sighting/description"
>
description
</p>
<dtml-in getSightings>
<p><dtml-var date> -- <dtml-var location></p>
<p>Reported by <dtml-var name></p>
<p><dtml-var description></p>
<hr>
<hr>
</d
tml-in
>
</d
iv
>
<
dtml-var standard_html_footer
>
<
/html
>
3. Click the 'Save Changes' button.
3. Click the 'Save Changes' button.
4. Click the '
View' tab to view the document
.
4. Click the '
Test' tab to view the page
.
Summary
Summary
...
@@ -813,23 +838,24 @@ Lesson 12. The Elvis Files, cont.
...
@@ -813,23 +838,24 @@ Lesson 12. The Elvis Files, cont.
allow folks to report sightings you'll need a report form just like
allow folks to report sightings you'll need a report form just like
you used in lesson 10.
you used in lesson 10.
1. Click on the '
reportForm' DTML Document
to view its contents.
1. Click on the '
form.html' template
to view its contents.
This
document
is almost exactly like the report form used in Lesson
This
page
is almost exactly like the report form used in Lesson
10. It collects data and calls the '
reportAction' documen
t to
10. It collects data and calls the '
action.py' scrip
t to
process the data.
process the data.
2. Click on the '
reportAction' DTML Documen
t to view its contents.
2. Click on the '
action.py' Python Scrip
t to view its contents.
This document is more simple than the 'reportAction' document in
It calls the 'insertSighting' ZSQL Method with this
Lesson 10. All it does is
thank the user and call the 'insertSighting' ZSQL Method with this
code::
code::
<dtml-call insertSighting>
insert(name=name, location=location, date=date,
description=description)
The real work is done by the 'insertSighting' ZSQL Method. Let's see
Then it returns a confirmation page.
how.
The real work is done by the
'insertSighting' ZSQL Method. Let's see how.
3. Click on the 'insertSighting' ZSQL Method to view its contents.
3. Click on the 'insertSighting' ZSQL Method to view its contents.
...
@@ -845,7 +871,7 @@ Lesson 12. The Elvis Files, cont.
...
@@ -845,7 +871,7 @@ Lesson 12. The Elvis Files, cont.
This code inserts a row into the 'elvis_sightings' table. Notice how
This code inserts a row into the 'elvis_sightings' table. Notice how
the arguments of this ZSQL Method correspond to the form elements in
the arguments of this ZSQL Method correspond to the form elements in
the '
reportSighting' document
.
the '
form.html' template
.
You can test this SQL code to make sure it
You can test this SQL code to make sure it
works correctly.
works correctly.
...
@@ -861,10 +887,10 @@ Lesson 12. The Elvis Files, cont.
...
@@ -861,10 +887,10 @@ Lesson 12. The Elvis Files, cont.
returned. In this case the database will not return anything, since
returned. In this case the database will not return anything, since
the SQL 'INSERT' command produces no results.
the SQL 'INSERT' command produces no results.
Now return to the 'sightings
' document to see if the sample data was
Now return to the 'sightings
.html' page to see if the sample data
added to the list of sightings. Play with the system a little bit
was added to the list of sightings. Play with the system a little
and see how the links between the 'sightings', 'reportForm', and
bit and see how the links between the 'sightings.html', 'form.html',
'reportAction' documen
ts allow a visitor to navigate the site.
and 'action.py' objec
ts allow a visitor to navigate the site.
Summary
Summary
...
@@ -875,7 +901,7 @@ Lesson 12. The Elvis Files, cont.
...
@@ -875,7 +901,7 @@ Lesson 12. The Elvis Files, cont.
* [ZSQL Method]s can change information in a relational
* [ZSQL Method]s can change information in a relational
database.
database.
* You can pass arguments to ZSQL Methods from
DTML
.
* You can pass arguments to ZSQL Methods from
scripts
.
* Many ZSQL Methods can use the same [Database Connection].
* Many ZSQL Methods can use the same [Database Connection].
...
@@ -896,13 +922,8 @@ Congratulations
...
@@ -896,13 +922,8 @@ Congratulations
href=
"http://www.zope.org/Documentation/How-To"
href=
"http://www.zope.org/Documentation/How-To"
target=
"_blank"
>
How-Tos
</a>
,
<a
target=
"_blank"
>
How-Tos
</a>
,
<a
href=
"http://www.zope.org/Resources/MailingLists"
href=
"http://www.zope.org/Resources/MailingLists"
target="_blank">mailing lists</a>, Guides and the <a
target=
"_blank"
>
mailing lists
</a>
, example applications (available in
the 'Examples' folder in the root folder, and the
<a
href=
"http://zdp.zope.org"
target=
"_blank"
>
Zope Documentation
href=
"http://zdp.zope.org"
target=
"_blank"
>
Zope Documentation
Project
</a>
.
Project
</a>
.
Please <a href="mailto:docs@zope.com">let us know</a> what you
liked and disliked about the Zope Tutorial. Telling us what you
think helps us improve it. *Please note*: email sent to this
address may be posted to a publically-accessible forum, and
your email address may be exposed on this forum.
lib/python/Products/ZopeTutorial/version.txt
View file @
3e0ffac6
Zope Tutorial 1.
0
Zope Tutorial 1.
1
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment