„Publishing-Status“ im Content-Editor anzeigen

Standardmässig ist im Sitecore-Content-Editor nicht ersichtlich, welche Items bereits publiziert wurden und welche nicht. Mit ein wenig Programmieraufwand kann man jedoch übersichtliche Anzeigen erstellen, welche den „Publizierungs-Status“ für jedes Item direkt darstellen. Dabei kann einerseits eine eigene „Content Editor Warning“ erstellt, andererseits kann die „Quick Action Bar“ mit einem neuen Eintrag erweitert werden. Dieser Artikel soll diese beiden Techniken kurz vorstellen und mit Programm-Beispielen zeigen, wie sich diese Techniken implementieren lassen.

„Publishing-Status“ als „Content Editor Warning“ anzeigen

In einem ausführlichen Blog-Post von John West wird genau beschrieben, wie man eine „Content Editor Warning“ erstellen kann, welche den „Publizierungs-Status“ eines Items anzeigt. Wir wollen hier die einzelnen Schritte zum Erzeugen der „Warning“ nochmals diskutieren und mit Code-Beispielen verdeutlichen.

Zunächst einmal muss ein neuer „Pipeline-Prozessor“ implementiert werden, welcher eine Methode „Process“ enthält, welche einen Parameter vom Typ „Sitecore.Pipelines.GetContentEditorWarnings.GetContentEditorWarningsArgs“ akzeptiert. Folgendes Listing zeigt ein Beispiel eines solchen Prozessors zum Anzeigen des „Publishing Status“ als „Content Editor Warning“.

public class PublishingStatusContentEditorWarning
{
public string SourceDatabase
{
get;
set;
}

public void Process(GetContentEditorWarningsArgs args)
{
Sitecore.Diagnostics.Assert.IsNotNullOrEmpty(this.SourceDatabase, „SourceDatabase“);
Sitecore.Diagnostics.Assert.IsNotNull(args, „args“);
Item sourceItem = args.Item;
Sitecore.Diagnostics.Assert.IsNotNull(sourceItem, „args.Item“);

if (string.CompareOrdinal(sourceItem.Database.Name, this.SourceDatabase) != 0)
{
return;
}

if (!this.IsLatest(sourceItem))
{
return;
}

PublishingStatusInfo publishingStatusInfo = PublishingStatusInfo.GetPublishingStatusInfo(sourceItem);

if (!string.IsNullOrEmpty(publishingStatusInfo.WarningMessage))
{
this.AddWarning(publishingStatusInfo.WarningMessage, sourceItem, args);
}
}

protected bool IsLatest(Item item)
{
Item latest = item.Database.GetItem(
item.ID,
item.Language,
Sitecore.Data.Version.Latest);

if (latest.Version.Number != item.Version.Number)
{
return false;
}

return true;
}

protected void AddWarning(string message, Item item, GetContentEditorWarningsArgs args)
{
GetContentEditorWarningsArgs.ContentEditorWarning warning = args.Add();
warning.Title = „Publishing Status“;
warning.Text = message;
string command = string.Format(
„item:load(id={0},language={1},version={2})“,
item.ID,
item.Language,
item.Version.Number);
warning.AddOption(„Refresh“, command);
}
}

Der Code entspricht im Wesentlichen der Lösung, wie sie auch von John West in seinem Blog-Post vorgeschlagen wird. Allerdings verwenden wir hier eine neue Klasse „PublishingStatusInfo“, um den Text für die „Warning“ zu generieren. Diese Klasse wird dann auch weiter unten in diesem Artikel verwendet, um die „Quick Action Bar“ mit einem Eintrag zu erweitern. Folgendes Listing zeigt den Source-Code der Klasse „PublishingStatusInfo“.

public class PublishingStatusInfo
{
public string WarningMessage { get; set; }

public bool HasItemNotBeenPublishedToAllPublishingTargets { get; set; }

public bool HasItemVersionNotBeenPublishedToAllPublishingTargets { get; set; }

public bool HasItemRevisionNotBeenPublishedToAllPublishingTargets { get; set; }

public static PublishingStatusInfo GetPublishingStatusInfo(Item item)
{
Item publishingTargetsRoot =
item.Database.GetItem(„/sitecore/system/publishing targets“);
Sitecore.Diagnostics.Assert.IsNotNull(publishingTargetsRoot, „/sitecore/system/publishing targets“);
PublishingStatusInfo publishingStatusInfo = new PublishingStatusInfo();

foreach (Item publishingTarget in publishingTargetsRoot.Children)
{
if (!PublishingTargetAppliesToItem(item, publishingTarget.ID))
{
continue;
}

string publishingTargetDbName = publishingTarget[Sitecore.FieldIDs.PublishingTargetDatabase];
Sitecore.Diagnostics.Assert.IsNotNullOrEmpty(publishingTargetDbName, publishingTarget.Paths.FullPath);
Database publishingTargetDb = Sitecore.Configuration.Factory.GetDatabase(publishingTargetDbName);
Sitecore.Diagnostics.Assert.IsNotNull(publishingTargetDb, publishingTargetDbName);
Item targetItem = publishingTargetDb.GetItem(item.ID, item.Language);

if (targetItem == null)
{
publishingStatusInfo.WarningMessage += „You have not published this item to the “ + publishingTargetDbName + “ database.“;
publishingStatusInfo.HasItemNotBeenPublishedToAllPublishingTargets = true;
}
else if (item.Version.Number != targetItem.Version.Number)
{
publishingStatusInfo.WarningMessage += „You have not published this version to the “ + publishingTargetDbName + “ database.“;
publishingStatusInfo.HasItemVersionNotBeenPublishedToAllPublishingTargets = true;
}
else if (item[Sitecore.FieldIDs.Revision] != targetItem[Sitecore.FieldIDs.Revision])
{
publishingStatusInfo.WarningMessage += „You have not published this revision to the “ + publishingTargetDbName + “ database.“;
publishingStatusInfo.HasItemRevisionNotBeenPublishedToAllPublishingTargets = true;
}
}

return publishingStatusInfo;
}

private static bool PublishingTargetAppliesToItem(Item item, ID publishingTarget)
{
while (item != null)
{
string restricted = item[Sitecore.FieldIDs.PublishingTargets];

if (!(string.IsNullOrEmpty(restricted) || restricted.Contains(publishingTarget.ToString())))
{
return false;
}

item = item.Parent;
}

return true;
}
}

Nachdem der Prozessor erstellt wurde, muss er entsprechend noch in der Web.config-Datei registriert werden, wie folgendes Listing verdeutlicht.

 

master


Für die Platzhalter „MyNameSpace“ und „MyAssembly“ müssen entsprechend noch sinnvolle Werte eingefügt werden.

Das waren bereits alle Schritte, um eine Warnung für nicht publizierte Items im Content-Editor anzuzeigen. Je nachdem, ob das Item noch überhaupt nicht publiziert wurde, oder ob die neuste Version, bzw. Änderungen an der neusten Version (Revision) noch nicht publiziert wurde/n, werden entsprechend unterschiedliche Meldungen angezeigt (vgl. Blog-Post von John West). Folgende Abbildung zeigt ein Beispiel für ein nicht publiziertes Item.

Anzeige der Warnung im Content-Editor

Erweiterung der „Quick Action Bar“

Ein Blog-Post von Alex Washtell zeigt auf, wie die „Quick Action Bar“ des Sitecore-Content-Editors mit weiteren Einträgen erweitert werden kann. Wir wollen darauf aufbauend einen eigenen „Validator“ entwickeln, welcher je nach Publizierungs-Status eines Items eine andere Farbe anzeigt und zwar wie folgt:

  • grün: Für Items, welche in allen „Publishing-Targets“ publiziert wurden.
  • gelb: Für Items, deren aktuellste Version, bzw. dessen Änderungen an der aktuellsten Version noch nicht publiziert wurde/n (für mindestens ein Publishing-Target).
  • rot: Für Items, die noch überhaupt nicht publiziert wurden (für mindestens ein Publishing-Target).

Um das zu bewerkstelligen, erstellen wir zunächst eine neue Klasse, welche von der Klasse „Sitecore.Shell.Applications.ContentEditor.Gutters.GutterRenderer“ erbt und die Methode „GetIconDescriptor(Item item)“ überschreibt. Folgendes Listing zeigt den Source-Code der Klasse.

public class PublishingStatusGutterWarning : GutterRenderer
{
protected override GutterIconDescriptor GetIconDescriptor(Item item)
{
Assert.ArgumentNotNull(item, "item");

return GetGutterDescriptor(item);
}

private static GutterIconDescriptor GetGutterDescriptor(Item item)
{
GutterIconDescriptor descriptor = new GutterIconDescriptor();
PublishingStatusInfo publishingStatusInfo = PublishingStatusInfo.GetPublishingStatusInfo(item);

if (publishingStatusInfo.HasItemNotBeenPublishedToAllPublishingTargets)
{
descriptor.Icon = „Applications/32×32/bullet_ball_red.png“;
descriptor.Tooltip = „This item has not been published to all publishing targets.“;
return descriptor;
}

if (publishingStatusInfo.HasItemVersionNotBeenPublishedToAllPublishingTargets)
{
descriptor.Icon = „Applications/32×32/bullet_ball_yellow.png“;
descriptor.Tooltip = „This item version has not been published to all publishing targets.“;
return descriptor;
}

if (publishingStatusInfo.HasItemRevisionNotBeenPublishedToAllPublishingTargets)
{
descriptor.Icon = „Applications/32×32/bullet_ball_yellow.png“;
descriptor.Tooltip = „This item revision has not been published to all publishing targets.“;
return descriptor;
}

descriptor.Icon = „Applications/32×32/bullet_ball_green.png“;
descriptor.Tooltip = „This item has been published to all publishing targets.“;
return descriptor;
}
}

Nachdem die Klasse erstellt wurde, muss der neue „Quick-Action-Bar“-Eintrag in der Sitecore-Core-Datenbank noch registriert werden, wie die folgende Abbildung demonstriert.

Neuen Eintrag der "Quick Action Bar" hinzufügen

Mit diesen Schritten haben wir unsere „Quick Action Bar“ bereits erweitert. Wenn wir nun mit der rechten Maustaste in die „Quick Action Bar“ klicken, müsste der neue Eintrag im Kontext-Menü ersichtlich sein, wie die folgende Abbildung verdeutlicht.

Eintrage der "Quick Action Bar"

Wenn der Eintrag „Publishing Status“ nun aktiviert wird, müssten in der „Quick Action Bar“ entsprechende Icons angezeigt werden, welche den Publizierungs-Status der Items wie weiter oben diskutiert mit unterschiedlichen Farben darstellen. Folgende Abbildung verdeutlicht das Resultat.

Anzeige des "Publishing Status"

Fazit

Sitecore bietet standardmässig keine visuelle Unterstützung im Content-Editor, um den Publizierungs-Status eines Items darzustellen. In diesem Artikel haben wir gesehen, wie man mit wenig Programmieraufwand übersichtliche Anzeigen erstellen kann, welche den Publizierungs-Status eines Items direkt sichtbar machen. Wir haben dabei zwei unterschiedliche Techniken diskutiert: Anzeige des „Publishing Status“ als „Content Editor Warning“ und in der „Quick Action Bar“.

Ein Gedanke zu “„Publishing-Status“ im Content-Editor anzeigen

  1. Pingback: Adventtipp 7 – Redakteure im Experience Editor benachrichtigen – Sitecore

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>