Sitecore Knowledge Session #1

Download Report

Transcript Sitecore Knowledge Session #1

Sitecore for Experts
“Sitecore skills for real men”
Session 1: Advanced Content Model
Wednesday 06 February 2007
Today’s Program
Introduction to the subject
1.
2.
3.
4.
Wildcard Items
Linkdatabase
Proxy items
Discussion: Relations
Questions & Additional reading
End
Different Content Models
1. Single simple model
Examples: Yoursite.com
2. Simple division divided model
Examples: Yoursite.com/Divsion1, Yoursite.com/Division2
3. Multi site model
Examples: Yoursite.com, Yoursite.nl, Yoursite.dk, Yoursite.fr
4. Multi language model
Examples: Yoursite.com/Int, Yoursite.com/nl Yoursite.com/dk
5. Multi languagal and site model
Examples: Yoursite.com/Int, Yoursite.com/nl Yoursite.com/dk
Yoursite.be/Int, Yoursite.be/nl Yoursite.be/fr
Different models have in common…
• Sharing of navigation
• Sharing of layouts
• Sharing of applications
• Sharing of news
• And legal content
• Relations in different sites and languages
• Thesauri?
Sitecore solution schematic
1. Wildcards items
The case
• It’s required to allow all kind of url’s. Even
those who doesn’t represent an item in
Sitecore.
• You want to make sure you can validate
your input
• Without using the QueryString, you are still
possible to pass parameter trough (SEO)
Solution: Wildcards
Item resolving in the pipeline
Site
Aliases
Item
Wilcards
• Resolve site so the Rootpath is defined
• Figure out if the item is an alias
• Try to locate the item
• When the item isn’t located, look if there
are any wildcards
Advantages:
1.
2.
3.
4.
Good argument to prevent the usage of the QueryString
Ability to control the return messages such as 404’s.
It’s processed in the Pipelines, so it’s easily extendable.
Protects you against possible security issues such as
database injections
Disadvantages:
1.
2.
3.
4.
5.
Aren’t able to set restrictions, so you have to write lots of
code* for right processing.
No native code* support
It’s processed in the Pipelines, so it’s might cxause some
preformence(not fully cachable on DataProvider level)
It responds by default as a valid page
(in headers) but in your opinion this
might not be right.
Support is limited to 4.3 and 5.3
* Code in this context means XSLT/C#/…?
XSLT Usage Example
1 <xsl:template match="*" mode="main">
2 <!-- Retrieve the first level and display when exists -->
3 <xsl:variable name="level1" select="webutil:GetUrlName(0)" />
4 <xsl:if test="$level1 != ''">
5 <xsl:value-of select="$level1"/>
6
7 <!-- Retrieve the first level and display when exists -->
8 <xsl:variable name="level2" select="webutil:GetUrlName(1)" />
9 <xsl:if test="$level2 != ''">
10
&gt; <xsl:value-of select="$level2"/>
11 </xsl:if>
12 </xsl:if>
13 </xsl:template>
C# Usage Example
<%
Sitecore.Data.Items.Item currItem = Sitecore.Context.Item;
int currLevel = 0;
int maxLevel = GetWebRootLevel();
do
{
Response.Write(currItem.DisplayName+ "<br/>");
Response.Write(currLevel + "<br/>");
Response.Write(GetUrlName(currLevel) + "<br/>");
Response.Write("<hr/>");
currItem = currItem.Parent;
currLevel++;
}
while (currItem.Parent != null && currLevel <= maxLevel);
%>
C# Usage Helpers
public string GetUrlName(Int32 index) {
string url = Sitecore.Web.WebUtil.GetRawUrl();
string path = url.Substring(1, url.LastIndexOf(".")-1);
string[] parts = path.Split("/".ToCharArray());
if (index < parts.Length)
return parts[parts.Length - 1 - index];
else
return "";
}
public int GetWebRootLevel()
{
string path = Sitecore.Context.Site.ContentStartPath;
return path.Split("/".ToCharArray()).Length;
}
2. Linkdatabase
The case
You want to have a full list:
1. Family members in the Tree
2. Items you do link to
3. Items who links to you
Solution: Linkdatabase
Advantages:
1.
2.
3.
Easily access from the API (Item.Links, Sitecore.Links)
Based on logical concept
Very fast(no preformence penalties)
Disadvantages:
1.
2.
3.
4.
‘Native’ not supported for XSLT
Seperated database, which implicates sync problems.
Hard to extend
Not all fields are supported
* Code in this context means XSLT/C#/…?
C# Example
private static Item[] GetFeedsInDatabase(Database database, Language language)
{
TemplateItem feedTemplate = database.Templates[Constants.FeedTemplateID];
if (feedTemplate == null)
{
return null;
}
// Get all items refering to the feed template
ItemLink[] links = Globals.LinkDatabase.GetReferers(feedTemplate.InnerItem);
if (links == null)
{
return null;
}
ArrayList result = new ArrayList(links.Length);
// and filter the referers - we dont need to include masters
foreach(ItemLink link in links)
{
if (link.SourceDatabaseName == database.Name)
{
Item item = database.Items[link.SourceItemID, language];
if ((item != null) && (IsMaster(item) == false))
{
result.Add(item);
}
}
}
return (Item[])result.ToArray(typeof(Item));
}
Possible cases
Where would you use this?
• ‘Related to’ links on the bottom of news/articles
• Navigations (Item groups, etc)
• As the technical basis for a Thesauris solution
• Others?
3. Proxy items
The case
• You want to reuse content nodes in different trees
or sites.
• For SEO, you want to make sure /sitecore/content
will not appear in URI’s.
Or
• Divide navigation management from content
The solution
Proxy Items…
Proxy template
• Source item: The item to copy it from
• Target item: Place where the item will be located
• Exclude subitems: In or exclude subitems
• Source database: Might be any database
Creation of Proxy items
Advantages:
1.
2.
3.
4.
Very fast as virtual items are also cached in the dataprovider
Easily to configure in the client(even more simple module
available)
Very powerfull as the API seems to think it are real items
Ability to publish virtal items to real items for preformence
improvements
Disadvantages:
1.
2.
3.
Solution seems to change in every version of Sitecore?
Might be confusing for users
There are no visible possibilities to select an item in another
database
Proxies in the API
• Item.RuntimeSettings.IsVirtual
Indicates whether the item is a virtual item or not.
• Item.RuntimeSettings.IsExternal
Indicates whether the source item is from a database other than the target database.
• Item.RuntimeSettings.OwnerDatabase
The database that owns the source item. Note the Item.Database property will always return the
target database!
Programmatically enable or disable proxies:
• bool Sitecore.Context.ProxiesActive
Enable (set to true) or disable (set to false) proxies for the current session.
• Sitecore.Data.Proxies.ProxyDisabler
Disable proxies for a block of code.
using (new Sitecore.Data.Proxies.ProxyDisabler()) {
// Proxies disabled here
}
4. Discussion: Relations
The case 1
You want to create a collections of
items, which aren’t always linked. This
collections should be changeable. And
is the members of this collections
should ofcourse be defined by your
own criteria.
The solution?
That’s up to the experts…
1. What are the requirements?
2. What do you want to store?
3. Where do you want to store it?
4. How should it be retrievable?
The case 2
You want to create a collections of
items divided by keywords or maybe
the alphabet.
Preformence is not an issue.
How can we solve this?
Next steps: Think about it!
Some review questions:
1.
2.
3.
4.
What kind of relations are available in Sitecore?
Why do you want to introduce more relations?
Are the examples provided clear? Do you have a better example?
What would be a nice addition to Sitecore for extending the
content model?
Next steps: Additional reading
• http://sdn5.sitecore.net
• http://www.lfn.dk
• http://www.alexeyrusakov.com/sitecoreblog/
• http://sitecore.alexiasoft.nl
Questions?
This is your last change…
Next month…
In the Sitecore API
The end…
Thank you for your attention!
And please, think about it and spread the
word…
Mistakes, corrections and additions can be mailed to Alex de Groot: [email protected]
The presentation is part of LECTRIC / Alex de Groot but can be used without any premission.