On 30-Mar-08, at 10:44 PM, Chris Meyer wrote:

One pattern I find myself using often is that I have a page listing my objects (PeopleList) and a detail page (PersonDetail).

In my PeopleList component, I have a WORepetition of WOHyperlink's linking to specific PersonDetails.

To facilitate the hyperlink, I have an action in PeopleList.java that creates a new PeopleDetail page and sets the iterated Person in the WORepetition into a variable on that new page.

My questions:

Is this the right design pattern to use?

If so, is there any way to use ognl or some other mechanism to avoid writing the action method in PeopleList.java that loads the new page and sets the Person variable on the new page?

If not, is there any fundamental reason why this cannot be done automatically (with some syntax modifications/improvements in the WOParser, or whatever)?

<cough>DirectToWeb</cough>

Failing that, create some superclasses for you components to inherit from that contain the generic behaviour you want:

ListPage.java
        
        public EOEnterpriseObject listItem;
        public String detailsPageName; // set in your subclass;

        ...

        public WOComponent goToDetailsPage() {
                WOComponent nextPage = pageWithName(detailsPageName);
                nextPage.takeValueForKey(listItem, "detailItem");
                return nextPage;
        }


DetailsPage.java

        private EOEnterpriseObject _detailItem;
        private WOComponent _backPage;

        public DetailsPage(WOContext context) {
                super(context);
                setBackPage(this.context().page());
        }

        public EOEnterpriseObject detailItemt() {
                return _detailsItem;
        }
        
        public void setDetailItem(EOEnterpriseObject obj) {
                _detailItem = obj;
        }

        public WOComponent backPage() {
                return _backPage;
        }
        
        public void setBackPage(WOComponent page) {
                _backPage = page;
        }

        public WOComponent saveChanges() {
                WOComponent nextPage = backPage();
                try  {
                        detailItem.editingContext().saveChanges();      
                } catch (Exception e) {
                        // EXAMPLE ONLY :-)
                        nextPage = null;
                }
                return nextPage;
        }


PeopleList.wo:

<ul>
<wo:WORepetition list="people" item="person">
<li><wo:WOHyperlink action="gotoPersonDetail"><wo:string value="$person.name"/></wo:WOHyperlink></li>
</wo:WORepetition>
</ul>

PeopleList.java

class PeopleList
{
  public Person person;

  // can this be avoided?
  public WOComponent gotoPersonDetail()
  {
PersonDetail pd = (PersonDetail)pageWithName(PersonDetail.class.getSimpleName());
    pd.person = person;
    return pd;
  }
}

PersonDetail.java

class PersonDetail
{
  public Person person;
}

Code comment: Ooo ick - using public ivars in your api! - wrap that person with accessors!

;david

--
David LeBer
Codeferous Software
'co-def-er-ous' adj. Literally 'code-bearing'
site:   http://codeferous.com
blog: http://davidleber.net
profile: http://www.linkedin.com/in/davidleber
--
Toronto Area Cocoa / WebObjects developers group:
http://tacow.org


_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to