You are not logged in Log in Join
You are here: Home » Resources » Mozilla » ZWiki » ZopeMVCProposal » wikipage_view

Log in
Name

Password

 
 
FrontPage » ZopeMozillaDashboard » ModelViewController » ZopeMVC »

ZopeMVCProposal

*Watch it, when I am editing this page, I'll be saving often! I will probably not notice other edits on this page! Rather, email me your comments. --MartijnPieters*

Intro

This part always gets fleshed out last, dontyathink?

Goals

  • Cleaner API
    • Reduce dependency on HTTP specifics
    • More powerful access to the Framework by applications build on Zope
    • Easier to document
  • Ease of adding support for other protocols and presentations

Proposal

Model-View in Zope

First of all, I see no need for a separate Controller or Presenter class in Zope. As a control message from the browser to the server usually results in the View needing regenerating, an integrated View-Controller system would be more efficient. Also, the View returned is very often closely related to the Control message, like a response code from a WebDAV? DELETE action.

In Zope, there are different layers of Models and Views, where one View can serve as a Model for another View. This chain will always end in a Response from Zope, relevant to the Request. Right now, a stock Zope installation has two layers of presentation: The protocol layer (like HTTP, FTP, WebDAV? and XML-RPC), and then an optional management View. Further layers include the widgets like the <dtml-tree> tag.

Layers and Stages

This layered cake of Models and Views makes it possible to introduce Model-View to Zope in stages, where we start with the basic OFS objects (Folder, File, Image, etc.). Then we can move on to the protocol implementations. Each step we take more presentation logic out of the Models, and move those to the Views.

Management View

The management View of the OFS objects currently consists of a collection of methods on those objects themselves, their names often starting with manage_. They are solely designed to be viewed through a HTML browser, which connects to Zope via the HTTP protocol.

The methods should be moved to ManagementView objects, one for each type of OFS Model object. As these objects hold no state, only one ManagementView instance is needed for each Model class, and they are not Persistent. A OFS Model will have its ManagementView object associated with it via a manage class attribute. This goes somewhat against the principle of MVC design that a Model should not know about its Views, but it is the most efficient and effective way for Zope to detect that the management View should be presented.

The ManagementView objects will take care of all management related presentation and control messages from the user, where the underlying Model is manipulated using methods on that Model. The View knows what Model it should act upon via the aq_parent attribute. Also, permissions should be acquired this way.

This scheme will break current Zope applications that use the current manage_* methods for object manipulation. We will have to device a scheme for redirection to or proxying of the new methods on the new View objects. This could maybe include optional raising of exceptions when an old style method was used somewhere. In a future version of Zope these old style methods could be phased out.

The ManagementView class should use inheritance to reduce complexity, where the class hierarchy parallels that of the OFS Model objects.

Example

The Image class inherits from the File class, which in turn inherits (amongst others) from PropertyManager and RoleManager. The ImageManagementView class should therefor be based on the FileManagementView, which itself is based on the PropertyManagerManagementView and RoleManagerManagementView classes.

Image instances will have a property manage that will return the ImageManagementView object. When called, it will render the default management screen for the referred Image instance. All further management tasks and screens will be calls to methods of the ImageManagementView object.

The OFS objects only become Model objects when they are completely independant from protocol and presentation. This means that REQUEST and RESPONSE parameters to methods on these objects will have to be eliminated. All data taken from the REQUEST object by the method will have to be passed in explicitly.

The Protocol View

Right now, objects are published by calling methods on them, and returning the result of this call. For the different protocols Zope supports, various hacks have been added to alter the way objects are being called to adjust the behaviour of those objects. For FTP and WebDAV? methods have been added to the requisted objects to support those protocols.

With Model-View, we could just have the ORB return the requisted objects, and then have more intelligent protocol View objects act on these returned objects. This does mean that the Views will have to adjust to the different types of objects returned, by checking for class inheritence for example. But if the returned objects adhere more to the Model paradigm, the required information to generate the right view should be easier to obtain.

Future Directions

What more can we do, but is better for a later phase?

--MartijnPieters