Chapter 4
Page 87: Expression for related portlet should be here/portlet_related/macros/portlet and the caption for the recent portlet should read Recent portlet.
Page 93: The value to put in for the type of value should be lines not list
In Chapter 4 I state "Id: this is a unique ID for the action" yet the screenshot shows non-unique actions. Unfortunately this policy has been questionable for a while the original intent was that they would be unique. Recently it was laid down that to uniquely identify an action you use a combination of its id, path and category.
Nothing in the code actually enforces a unique id. In later versions of the CMF this uniqueness may be enforced. Since id's are generally not used outside of code and using unique ones will only make your life easier, I recommend this. I've found that programatically changing actions (an advanced technique) is easier with unique ids.
Chapter 5
Page 120: Someone asked the question regarding the test_context script, wether it works because it defines context. The answer is it does, it's fine. At the time of writing the term context seemed to be an ideal variable to define the singular of CONTEXTS.
However of course, that is now a variable in Zope 2.7 and
contradicts the tip earlier in the book. So yes it's a valid point and
the if you replace those two instances of context with say var, the Page Template will work just fine.
Page 123: The code for multiple tal attributes should read:
<a href="http://plone.org/Members/andy/book" title="Plone Book">Link to item</a>
And the following code for an example using default should read:
<a href="#"
tal:attributes="href python:request.get('message', default)">
Link
</a>
Chapter 6
Several
people have emailed me with questions regarding the feedback form.
Rather than type this all in yourself, you might like to note that this
can be found in the PloneBookExamples.zip
file. Install this product (unzip, place in Products, restart Zope, go
to Add/Remove) and the feedback form will automatically be created for
you. All you have to do after installing is go to http://yoursite.com/feedbackForm. If you follow through the example, on the last page of this chapter, the TALES expression should read string:sendEmail and string:feedbackForm.
Page 137, paragraph one: replace use-slot with define-slot
Chapter 7
Instead of Dynamic HTML, it should say Document Template Markup Language (p. 181). Unfortunately a common mistake confusing DHTML and DTML.
The script to change the skin dynamically on an access rule, at the end needs to be:
else:
context.changeSkin("Plone Default")
In the code listing for NASA skin, the URL's do not include the site URL of http://mars.telascience.org/ for example background: url("http://mars.telascience.org/liststart.gif").
Although the full URL is in the original CSS I have removed it. If you
use this skin on your site it means you will be directly linking to the
NASA website for the pictures. This is bad practice and unfriendly to
those nice people at NASA who have helped us out. For this reason I
removed the absolute URL, please download the pictures.
Also note that the quoting around URL's is optional according to the W3C specification. Having the double quotes or not makes no difference.
Chapter 8
Page 232: there is no WorkflowException on Workflow expressions.
Chapter 9
On page 269, the import script should read:
for groupId in groups:
It looks like in formatting the line on page 268, groups = groups.split(,) got pushed out of spacing.
On page 270, the fixUsers script should read:
if p is not None and p != 'Epoz':
m.setMemberProperties({'wysiwyg_editor': 'Epoz',})
It's worth noting that the signature for changing properties was changed in CMF 1.4.
On page 272, the getGroups script should read:
group = pg.getGroupById(group)
Chapter 13
Robert Boulanger was incorrectly credited for writing ArchGenXML, its actually the great Phil Auersperg. The documentation for ArchGenXML was incorrectly credited to Sidnei Da Silva, when it was written my Jens W. Klein. My apologies to both Robert and Jens.
The SQLStorage example at the back of the chapter should read: PostgresSQLStorage() instead of SQLStorage()
Chapter 14
The Vary support didn't actually make it in CMF 1.4, if you'd like it a patch from CVS head is available in the software section. Unzip copy over the two files (as noted in the README.txt inside and restart).