Wildcard items
There are enough blogs already describing what a wildcard item in Sitecore is, so a very short intro should do here:
A Sitecore wildcard item is a regular item in Sitecore with "*" as name. The item has all the fields of a normal item.Some Sitecore versions have a bug when using a display name in the path up to a wildcard item (hotfix available).
The item will match on any url in its tree on its level that is not matched on any of its siblings. Wildcard items can have children.
The case
We had a case for a sports organisation with a few requirements:
- create a website for a competition that can host a few overall pages and 'subsites' for all 20 events in the competition
- editors do not want to create 20 trees in Sitecore
- all data about the competitions comes live from a backend system and is not copied into Sitecore
- the competition is yearly so the site needs to be ready to be copied next year
- each event has around 120 matches
- each event can have a mens and/or a womens tournament, each with around 60 competitors
The solution
We used some wildcards..
The first wildcard is right below the general home page, and defines a sub-homepage for the event. Underneath we have the complete set of items for each event.
More wildcards
Even more wildcards appear. In the (wo)mens section we have a wildcard to display a team, and underneath another one to display a player. This way we can have pages (seo friendly) for all teams and players in each event.
We also have wildcards for each game (under that wildcard we have subitems for the subpages of a match).
Navigation
The navigation is in 2 parts: first of all we have navigation that displays all events. That is not Sitecore related (data comes from backend system) but will point to the wildcard item under the home item - off course indicating the right event in the url.
The navigation inside an event can be set once. The links are automatically transferred into the correct url for that event (see part about code). Some pages will not have content, but that is handled on the page itself.
Content
Sitecore content is shown based on datasources - as it should. But here the datasource will not go to a specific item but to an item container. In that container we look for content that can be displayed for the current event. If that is not found we display a message that the content is not yet available.
The code
Events and tournaments have a unique code. That code will be used in the urls on the spot of the main wildcard. We will use the eventcode as much as possible, as soon as a selection is made for the men/women tournament, we use the tournament code. That is because we need the correct code to go to the backend system.
To accomplish this we wrote a context class (instance per request) that detects the "context" - the current event and or tournament - from the url and exposes this to everyone who needs it.
LinkProvider
The nifty stuff is in our custom LinkProvider. We wrote some code that determines the requested tournamentcode, applying some business rules and based on the current context. In the end, we replace the first wildcard in the url with the determined code (only the first one, as we might have multiple) with string manipulation.
Other wildcards
The other wildcards (team, player, match) are handled in their business objects. Each business class has it's own logic to create the urls and grab the information needed back from the url. As all our code passes through the business objects and nothing is done straight on the base Sitecore items, we are good here. Off course, it's not possible to put a url to a team or so from within the content but that was not a requirement anyway (actually it is possible as a 'external' url).
Components
The event homepage contains several components that need to be activated based on the status of the event (not started, ongoing, finished). This is also done automatically based on the event in our context. All components are placed on the page and the ones that are not compliant will be hidden.
We could have used a custom condition here and use the standard hide functionality to create conditional rendering rules, but we kept it simple and put the logic in a base function for all homepage components.
We could have used a custom condition here and use the standard hide functionality to create conditional rendering rules, but we kept it simple and put the logic in a base function for all homepage components.
Conclusion
We had a first version (poc) quite fast but it took us a few days and a lot of testing to get everything working as it should - especially the small and tricky parts like the multilingual aspect, canonical urls, links between tournaments, links from within event components showing data about more than one tournament...
I did not put any of the code in here as it is quite specific based on our business logic and the backend system used, but if there are questions or you want to see some code or config - just ask ;)