Thanks guys. Some of what we learned I shared on my blog,
http://chrisbower.com.

We used a lot of different techniques throughout the site, but the biggest
key for us were shape methods. It allowed us to call anything we needed to
from within a shape or layout, and also allowed us to have a very
easy-to-use cache methodology.

I've created a fairly comprehensive cache module that I'll be releasing to
the community in the coming weeks (once things slow down a bit, and I get
some rest) that I think will prove very beneficial. It vastly improved the
performance of our site, especially when so many different content items and
parts are pulled on to every page.

The gist of how our implementation works:
* We have 28 custom written modules, about 1 for every major section of the
site, plus a few miscellaneous things like: image management (we have a
module that crops and resizes images to the Rackspace file cloud), a YouTube
module that scrapes our YT feed and populates video content, a common shape
library module, caching modules, etc.
* We have a different layout file for every different template used on the
site (some dupes, based on a controller/action using the same sort of
template as another controller/action).
* The layout files pull shapes into the appropriate zones like so (An
example of some shapes pulled into our homepage layout):
>>     WorkContext.Layout.Featured.Add(New.TopStoriesArea(), "1");
>>     WorkContext.Layout.Featured.Add(New.MiniPetition(), "2");
>>     WorkContext.Layout.BeforeMain.Add(New.FeaturedMedia(), "1");
>>     WorkContext.Layout.BeforeMain.Add(New.FeaturedLinksArea(), "2");
>>     
>> WorkContext.Layout.AfterContent.Add(New.CurrentCasesScroller(CasesSetSize:4),
>> "1");
>>     WorkContext.Layout.TripelFirst.Add(New.MostRecentLegalDocs(), "1");
>>     WorkContext.Layout.TripelSecond.Add(New.MostRecentJusticeFiles(), "1");
>>     WorkContext.Layout.TripelThird.Add(New.FeaturedPoll(), "1");
> * Note that we experimented first with widgets, but decided that trying to
> create a widget for each of the 100+ widget-like shapes we have on our site
> wouldn't have been a good idea.
* Shapes are first defined by a shape method, then implemented by a "shape
view", like so:
>  [Shape,Cache] public IHtmlString SidebarAd(dynamic Display) { var ads =
> ContentManager.Query(VersionOptions.Published,
> "HouseAd").List().AsPart<HouseAdPart>().ToList(); return
> Display.SidebarAdView(Ads: ads);  }
> * (A file named SidebarAdView.cshtml would then implement the shape with the
> provided parameters.)
* Shape methods acted like controllers for partials. We could include logic
wherever we needed to, pulled in from services
* Shape methods were also called very often from other shapes:
>>  @foreach(var d in legalDocs)
>>         {
>>             var sourcePart = d.As<SourcePart>();
>>             var source = "";
>>             if(sourcePart!=null && sourcePart.Source !=null){
>>                 source = sourcePart.Source;
>>             }
>>             <li>@Display.ContentTitle(item:d, limit:35)<br />
>>                 <span>@Display.ContentDate(item:d)</span> </li>
>>         }
>> * ContentTitle and ContentDate are shape methods that are our standard way of
>> rendering a title and date for our content types.  We probably could have
>> done it in a more standard way by using Display(contentItem) and then defined
>> display types and placements, but this seemed to be less complicated for us.
>> That's one of the things I love about Orchard. There's not just one way to do
>> something. It allows us to be opinionated, rather than being forced to the
>> framework's opinion.
To answer the DB question, we're just using MSSQL. We're hosted on a virtual
web farm at Rackspace with a couple of web VMs and a DB vm. The entire site
was built on Orchard, with the only exception being our donations being
handled by Kimbia widgets.

>From a metrics standpoint, it might be interesting to note that our site was
developed by myself and Jesse Wise (who came up with the shape method
implementation, major props) in about 5 months. We 'broke ground' in Orchard
in the middle of January and launched on June 25th. Neither of us had any
Orchard experience before that point. Having been involved in a few other
larger sites, I felt pretty good about the speed which we were able to
implement this project in Orchard, even with the (somewhat steep) learning
curve.
>> 
From:  Troy Robinson <[email protected]>
Reply-To:  <[email protected]>
Date:  Sun, 26 Jun 2011 00:10:23 -0700
To:  <[email protected]>
Subject:  Re: New Orchard Site

Yes, very nicely done.  Curious to know how all the parts were mixed
together and if it was done only using orchard? Also, what kind of database
is being used?  Very interesting!

Regards,

Troy


On Sun, Jun 26, 2011 at 12:07 AM, Efe Kaptan <[email protected]> wrote:
> Thats a wonderful job, welldone. Please share your knowledge with
> community. We need tips&tricks of your implementation.
> 
> thanks.
> 
> On Sunday, 26 June 2011, Chris Bower <[email protected]> wrote:
>> > Hey everybody, I am proud to announce that after many many months of
>> development, we have officially launched our new Orchard-based site:
>> http://aclj.org
>> > Thank you Orchard team for all of your assistance, and for putting out such
>> a great platform. We're proud to be running on Orchard!
>> > Chris BowerLead DeveloperACLJ
>> > ---
>> >
>> > You are currently subscribed to orchard-discuss as: [email protected].
>> >
>> > To unsubscribe send a blank email to
>> [email protected].
>> >
>> >
>> >
> 
> ---
> You are currently subscribed to orchard-discuss as: [email protected].
> To unsubscribe send a blank email to
> [email protected].
> 

--- You are currently subscribed to orchard-discuss as: [email protected].
To unsubscribe send a blank email to
[email protected].



---
You are currently subscribed to orchard-discuss as: [email protected].
To unsubscribe send a blank email to [email protected].

Reply via email to