Re: selection list confusion ...
Thanks Jim,
If you are doing this within a ZClass, you can put Choices on a PropertySheet, then refer to it as
<dtml-in Choices>
As I understand it though, Zope does not have class variables. If Choices is on a property sheet each instance will have its own copy which seems like needless bloat. Ideally, what I'd like to do is either of the following. Imagine I have the following ZODB hierarchy: root Control_Panel Products MyClassProduct MyClass Properties - MakeChoice (type selection) globals - GetChoices (DTML method) 1) I would like the value field of MakeChoice to call the DTML method GetChoices which resides in the globals folder. As it stands, GetChoices needs to live in the root in order to be found by acquisition. Is there a way around this? Alternatively, 2) I would like GetChoices to live in MyClassProduct. This does not work for reasons that elude me. One would naively think that since GetChoices is in the same location as both the class addForm and the constructor, it would be found by acquisition. It isn't. Any clarification of these issues would be most appreciated. Cheers, Darran.
Hi, Darran Darran Edmundson wrote:
Thanks Jim,
If you are doing this within a ZClass, you can put Choices on a PropertySheet, then refer to it as
<dtml-in Choices>
As I understand it though, Zope does not have class variables. If Choices is on a property sheet each instance will have its own copy which seems like needless bloat.
My zope installation seems to act as if the values in the class property sheets are class variables. Try this: In your zClass, make a property sheet called 'MyClassGlobals' On that sheet, put in a property of type 'lines' called 'MyClassSelections'. Put in the values one two three In your zClass's methods, make a dtml method called 'showselections' that looks like: <ul> <dtml-in MyClassSelections> <li><dtml-var sequence-item></li> </dtml-in> </ul> Now, make an index_html DTML method in your zclass's methods (or edit your existing one). Within that method, put <dtml-var showselections>. Now go somewhere in your site and create an instance of your zClass called 'test'. View it by opening http://[mysite][/path]/test. It should have * one * two * three Now, go back to the ZClass and change the values in MyClassSelections: Bob Mary Fred View the previously-created test instance again. In my experience, it will now show * Bob * Mary * Fred This seems to have the behavior of a class variable, no? If MyClassSelections were copied into the new instance, it should still show *one *two *three, but it doesn't. I presume that these values are acquired unless overridden in the instance. So, what you may want to do is have a 'MyClassGlobals' property sheet with the information that want to be global for all instances of the zClass, and make it changeable only within the zClasses structure, i.e., do not make a 'view' of it, so it cannot ordinarily be overridden. Then, you can have a visible property sheet that makes use of these globals. For example, in another property sheet, make a property with an id of 'MyChoice' with type 'selection' and a value of 'MyClassSelections'. Zope will display that it has 'No value', which is a bit misleading, since it will show the list within an instance of the ZClass. Assure this property sheet is visible in the management interface by making a 'view' of it. Now, within that tab of the management interface for an item of that class, you should have a select item that has the values from MyClassSelections on the MyClassGlobals sheet. You may ask, what happens if you make a selection, then change the selection list so that the selection is no longer valid on the globals property sheet. The answer is that Zope will store the value as a string, and hold on to it unless changed. Also, you must be sure that the values on that sheet get saved at least once for each instance or that MyChoice gets initialized programmatically with a default value, since (even though it may display the first item in the list) MyChoice will have an initial value of 'None' until saved.
Ideally, what I'd like to do is either of the following. Imagine I have the following ZODB hierarchy:
root Control_Panel Products MyClassProduct MyClass Properties - MakeChoice (type selection) globals - GetChoices (DTML method)
1) I would like the value field of MakeChoice to call the DTML method GetChoices which resides in the globals folder. As it stands, GetChoices needs to live in the root in order to be found by acquisition. Is there a way around this?
Alternatively,
2) I would like GetChoices to live in MyClassProduct. This does not work for reasons that elude me. One would naively think that since GetChoices is in the same location as both the class addForm and the constructor, it would be found by acquisition. It isn't.
AFAIK, your class's methods should be inside the zClass within its methods area, not in the Product area, where the addForm is.
Any clarification of these issues would be most appreciated.
I am not sure I answer all your questions, so if I am off-base, I will be happy to try again. But for the moment I will assume that a class-variables-ish solution is what you are looking for. Regards, -- Jim Washington
participants (2)
-
Darran Edmundson -
Jim Washington