I'm new to SilverStripe as well, and first off, I'm very impressed. I'd characterize it as an "everything you need, nothing you don't" type of CMS.
Unfortunately, the one functionality showstopper in implementing it for our group is the lack of hierarchical URLs.
One solution that I haven't seen mentioned in any of the posts on the topic (although I may have just missed it!) is to use the site navigation hierarchy to determine URLs. In the current model, lets say we had a top level page called "AboutUs", (URL "/AboutUs/"), and then a subpage called "Our Staff" (URL "/OurStaff/"). What would make sense to me is rather than ONLY having a top level URL, to use that page-subpage relationship to determine the URL, and give the subpage a URL of "/AboutUs/OurStaff/".
Since those page-subpage relationships are already in the database, I would think it would be possible to only specify the URL fragment (i.e. "OurStaff") for the subpage in the user interface, and have it build out the hierarchy in another field in the database to use in conjunction with the mod_rewrite rule.
This way, the URL is absolutely tied to the hierarchy in the interface, and there's no manual maintenance (which we definitely don't want!) or ambiguity (Did someone mean their "Products/Services" page, or is "Services" a subpage of products?").
As far as fixing the hierarchy if you change a parent, we'd know when the parent changed, so we could then go through and update URL for the children.
Just off the top of my head, I'd suggest something along these lines:
- Add a "FullURL" field to the "SiteTree" table.
- Create a "calculateFullURL" MySQL procedure that would concatenate the parent's "FullURL" field with the subpage's "URLSegment" field. This procedure would also recursively run itself for all of its children.
- Create "update" and "insert" triggers on the SiteTree table to run that procedure.
- Modify the code that does that initial lookup to use the "FullURL" field rather than the "URLSegment" field.
- Modify the user interface so that on the form where you're specifying the URL segment, it prepends the parent's FullURL as text to the text box where you specify the URL segment.
Of course, that's a very simplified version, and you could also execute the same logic in PHP. It's just easier for me to describe in SQL terms since I haven't really looked into the code.