Hello all,

A question on MVC-like architecture for EmeraldView, the Greenstone PHP frontend I'm working on. First, a crash-course in the Greenstone data model...

The biggest unit of content in Greenstone is the "collection." Within each collection, G references content in "documents" which are broken into "sections." Each document and section (I've taken to calling them nodes) is represented in a datastore by a record with metadata. So for example, represented in YAML:

DOC123:
  Title: "Pigs in space"
  Subject: "pigs, space"
  Contains: DOC123.1,DOC123.2
DOC123.1:
  Title: "The mission begins"
  Contains: DOC123.1.1
DOC123.1.1:
  Title: "More of the mission beginning"
DOC123.2:
  Title: "The mission continues"

Browse trees can be created on arbitrary metadata fields, and are called "classifiers." They also consist of a root "node" and subnodes; for example:
CL1:
  Title: "Author"
  Contains: CL1.1,CL1.2
CL1.1:
  Title: "Aardvark, Larry"
  Contains: DOC123,DOC456
CL1.2:
  Title: "Milton, John"
  Contains: DOC789,DOC654

Okay, now for the question. I have written a Node class to represent this most basic level of organization, with subclasses Node_Document (representing a document or section thereof) and Node_Classifier (for a classifier or subnode thereof). This makes sense to me for representing the metadata, as described above.

http://bitbucket.org/yitznewton/emeraldview/src/tip/application/libraries/Node.php
http://bitbucket.org/yitznewton/emeraldview/src/tip/application/libraries/Node/Classifier.php
http://bitbucket.org/yitznewton/emeraldview/src/tip/application/libraries/Node/Document.php

What happens when I need to deal with the *web page* representing the content of a node? In Greenstone (and thus in EmeraldView), each classifier, document, and section has a page view associated with it. There are certain behaviors that apply to a web page and not a "Model"-level node, such as getUrl(), getSourceDocumentUrl(), getHTML()...

I have been using wrapper classes for the Nodes (Classifier and DocumentSection), and, realizing that there is much duplicate functionality between the two, thought to make them inherit from a common class.

[there are a couple of obsolete duplicate methods in here that I haven't cleaned out yet]
http://bitbucket.org/yitznewton/emeraldview/src/tip/application/libraries/Classifier.php
http://bitbucket.org/yitznewton/emeraldview/src/tip/application/libraries/DocumentSection.php

When I came to the question of what to call this parent class, I took a step back, wondering, what sort of class is this, exactly? Does it merit a distinct class apart from Node? I looked through Gang of Four, but couldn't find anything that really reflected what I'm trying to do - this seems simpler than most of their patterns. Intuitively it feels to me like this should indeed be a separate class from Node, as Node is for metadata, and this class is to be for web page behavior. Perhaps:

NodeWrapper
NodePage
NodePageWrapper
NodeView

Thoughts?

Thanks so much!

--
Yitzchak Schaffer
Systems Manager
Touro College Libraries
33 West 23rd Street
New York, NY 10010
Tel (212) 463-0400 x5230
Fax (212) 627-3197
Email yitzchak.schaf...@tourolib.org

Reply via email to