Navigation and service panel


Content

This text is fallbacked from the German Version. If you need use Google Translate


Standard Value Tokens Quo Vadis

By Reto Hugi on 7. November 2013, No comments

Standard Value Tokens sind in jedem sorgfältig konfigurierten Projekt Pflicht und unterstützen die Autoren mit dynamischen Standardwerten. Doch welche Tokens sind in der aktuellen Version von Sitecore verfügbar und wie baut man eigene Tokens dazu?

Tokens ersetzen Platzhalter während der Erstellung von Items einmalig und unterstützen damit Autoren bei der Inhaltserstellung. So füllt beispielsweise ein $name im "Titel" Feld des __Standard Values Items des Seitentemplates jeweils den vergebenen Item Name auch gleich in das Titel Feld ab.

Neben dem bekannten und oft genutzten $name stellt Sitecore noch weitere Tokens zur Verfügung. Nachfolgend ein Überblick:

  • $name: Setzt den Item Name ein
  • $id: Setzt die für das Item generierte GUID ein
  • $parentid: Setzt die GUID des Parent Item ein
  • $parentname: Setzt den Item Name des Eltern-Item ein
  • $date: Setzt das aktuelle Datum im ISO Format (DateUtil.IsoNowDate), also yyyymmdd
  • $time: Setzt die aktuelle Tageszeit im ISO Format (DateUtil.IsoNowTime), also hhmmss
  • $now: Setzt das aktuelle Datum inkl. Zeit im ISO Format (DateUtil.IsoNow), also yyyymmddThhmmss

Mit den Item Buckets sind in Sitecore 7 noch folgende neue Tokens dazu gekommen:

  • $currentuser: Setzt den Benutzernamen des Erstellers (Context.User.Name), also z.B. sitecore\admin
  • $allquery: Ersetzt das Token mit "text:*" (Wildcardsuche aller indexierten Felder)
  • $allmyworkflowitems: Ersetzt das Token mit "text:*&custom:isinworkflow|true" (Alle Treffer mit dem Feld "isinworkflow=true")

Trotz der offensichtlichen Einschränkung, dass Tokens jeweils nur einmalig bei der Erstellung von Items ersetzt werden, bleibt noch viel Potential dieses Features ungenutzt. Sitecore stellt eine Pipeline für das Ersetzen der Tokens zur Verfügung: die ExpandInitialFieldValue Pipeline. Deren Prozessoren erhalten die Item Felder samt Standard Values bei der Erstellung von Items als Argumente.

In nachfolgendem Beispiel erweitern wir die Pipeline mit einem $query() Token, welches einmalig ein Sitecore Query relativ zum erstellten Item ausführt.

namespace SitecoreExample
{
using System;
using System.Text.RegularExpressions;

using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Pipelines.ExpandInitialFieldValue;

using Debug = System.Diagnostics.Debug;

/// 
/// Processor to execute queries during token replacement in standard values.
/// 
public class QueryToken : ExpandInitialFieldValueProcessor
{
/// 
/// Processes the specified args.
/// 
/// The args.</param>
public override void Process(ExpandInitialFieldValueArgs args)
{
    Assert.ArgumentNotNull(args, "args");

    if (args.SourceField.Value.Length == 0 || 
        args.Result.IndexOf("$query", StringComparison.OrdinalIgnoreCase) < 0)
    {
        return;
    }

    var fieldValue = args.Result;
    
    const string Pattern = @"(\$query\((.*[^\|])\|(\w*)\))";
    var regex = new Regex(Pattern, RegexOptions.IgnoreCase);
    var match = regex.Match(fieldValue);

    if (match.Success)
    {
        var token = match.Groups[1].Value;
        var query = match.Groups[2].Value;
        var fieldname = match.Groups[3].Value;

        if (query.Length > 0 && fieldname.Length > 0)
        {
            var resultItem = this.GetItemFromRelativeQuery(query, args.TargetItem);
            if (resultItem != null)
            {
                args.Result = string.IsNullOrEmpty(resultItem[fieldname]) ? 
                    args.Result.Replace(token, string.Empty) : 
                    args.Result.Replace(token, resultItem[fieldname]);
            }
        }
    }
    else
    {
        Log.Error("Invalid $query() token. Expected format: $query(<query>|<fieldname>)", this);
    }
}

/// 
/// Gets the item from a query relativ to the provided item. Fastquery and
/// Sitecore queries are supported.
/// 
/// The query.</param>
/// The Sitecore item.</param>
/// the matching item or null
private Item GetItemFromRelativeQuery(string query, Item item)
{
    Assert.ArgumentNotNull(item, "item");

    try
    {
        var queryResultItem = query.StartsWith("fast:", StringComparison.OrdinalIgnoreCase) ? 
            item.Database.SelectSingleItem(query) : 
            Sitecore.Data.Query.Query.SelectItems(query, item)[0];
        return queryResultItem;
    }
    catch (Exception)
    {
        Log.Error("Failed to execute query [" + query + "]", this);
        return null;
    }
}
}
}

Beispiel: Default Werte für Standard Values

Wie der Name sagt, sollen Standard Values sinnvolle Standardwerte für Autoren zur Verfügung stellen. Autoren sollten aber keinen Zugriff auf die _Standard Values Templates haben. Mit einem Query auf Default Werte unter /sitecore/content kann man den Autoren die Standardwerte selber verwalten lassen.

Das Query $query(/sitecore/content/Website/Config//*[@@name="Default config"]|Default Title) liest z.B. den Wert aus dem Feld "Default Title" aus dem "Default config" Item im Konfigurationsbereich der Webseite.

Beispiel 2: Übernehmen von Inhalten des Parent Items

Mit einem simplen Query $query(..|Description) kann das Feld "Description" des Eltern-Items ausgelesen und für den Autoren vor ausgefüllt werden.

Marketplace

Das $query Token ist Teil des Token Set Moduls. Es steht im Sitecore Marketplace und in der Nuget Gallery zum Download bereit.

Categories  Features  Modules Tags  standard value  token  query

No comments

Add your comment

Your email address will not be published. Required fields are marked *

*