Meta-Elemente in Veröffentlichungsseiten

In diesem Beitrag soll gezeigt werden, wie man in SharePoint 2010 Veröffentlichungsseiten Meta-Elemente pflegen und ausgeben kann. Der Beitrag soll als Dokumentation zu einem Vortrag bei der SharePoint Usergroup Stuttgart dienen. Dieser wiederum geht auf eine Anfrage von Dennis Scherrer zurück. Dennis hat im Vorfeld auch Recherchearbeit dazu geleistet, deshalb auch hier nochmal ein herzliches Danke dafür.

Was sind Meta-Elemente?

Hier der Link zur englischen Wikipedia-Seite. Eine kurze und prägnante Beschreibung gibt es hier bei Microsoft:

"Metatags sind für den Benutzer nicht sichtbare Codeabschnitte, die von Suchmaschinen häufig zum Indizieren von Websites verwendet werden. Anhand der Metatags können Suchmaschinen die relevantesten Ergebnisse für eine bestimmte Suchanfrage zurückgeben. Zwei wichtige Metatags sind das Tag keyword und das Tag description."

Microsoft spricht hier zwar von Tags, korrekter ist aber die Bezeichnung Elemente, da es sich um eigene Elemente innerhalb des HTML-Quelltextes handelt.

Meta-Elemente werden immer als leere Elemente mit name– und content-Attribut notiert. In der fertigen Seite erscheinen sie so:

<meta name="description" content="Das ist die Beschreibung der Seite" />

SharePoint Veröffentlichungsseiten

Meta-Elemente werden von der On-Premise-Version von SharePoint 2010 nicht direkt unterstützt. In SharePoint Online ist die Unterstützung allerdings eingebaut. Wie man sie benutzt, steht ebenfalls auf der oben verlinkten Seite.

Im Folgenden wird anhand eines Enterprise-Wiki gezeigt, wie man die Unterstützung für Meta-Elemente hinzufügt. Das Enterprise-Wiki wurde gewählt, weil es einfacher strukturiert und damit das Beispiel leichter nachzuvollziehen ist. Die Vorgehensweise läßt sich aber 1:1 auf die "normalen" Veröffentlichungsseiten übertragen.

Websitespalten

Wir brauchen zuerst die Felder, die die Informationen aufnehmen, die wir später als Meta-Elemente ausgeben wollen. Dazu legt man für jedes gewünschte Element eine Websitespalte vom Typ Mehrere Textzeilen an. Wichtig dabei ist, daß bei zulässigem Texttyp Nur-Text gewählt wird. Der Feldinhalt wird später als Attributwert im HTML verwendet und Rich-Text-Formatierungen sind dort nicht erlaubt (und damit sinnlos). Im Beispiel verwenden wir eine Spalte für description und eine für keywords:

Als nächstes müssen wir dafür sorgen, daß wir diese Spalten auch in unseren Wikiseiten verwenden können. Die Seiten im Enterprise-Wiki basieren standardmäßig auf dem Inhaltstyp Unternehmenswiki-Seite. Wir fügen die Spalten also diesem Inhaltstyp hinzu.

Meta-Inhalte pflegen

Man könnte die Daten jetzt pflegen, indem man auf die Seitenbibliothek geht, eine Seite auswählt und ihre Eigenschaften bearbeitet:

Das ist natürlich nicht das, was wir unseren Benutzern anbieten möchten. Die Benutzer wollen auch die Meta-Informationen so pflegen, wie sie die eigentlichen Inhalte der Seite pflegen. Ein Benutzer geht dazu auf die gewünschte Seite und klickt auf das Bearbeiten-Symbol oder den Link Diese Seite berabeiten, wählt Seite bearbeiten aus dem Menü Websiteaktionen oder geht auf den Reiter Seite und dort auf Seite bearbeiten. In jedem Fall wird dadurch die Seite in den Bearbeitungsmodus versetzt und die Inhalte können geändert werden. Allerdings erscheinen unsere Felder noch nicht im Bearbeitungsmodus und können damit nicht mit Inhalt gefüllt werden.

Das Aussehen und Verhalten aller Wikiseiten wird durch die Vorlage EnterpriseWikis.aspx festgelegt. Wir müssen also diese Vorlage bearbeiten, damit wir unsere Felder pflegen können. Dazu öffnet man die Website in SharePoint Designer. Am Einfachsten geht das über Websiteaktionen In SharePoint Designer bearbeiten. Die Vorlage findet man dann im linken Menü unter Seitenlayouts. Man klickt auf EnterpriseWiki.aspx und dann auf Datei bearbeiten. Übrigens findet man unter Seitenlayouts auch die ganzen anderen Vorlagen, die für Veröffentlichungsseiten benutzt werden und die man auf dieselbe Weise bearbeiten kann.

Wenn die Seite geladen ist, sucht man sich eine geeignete Stelle, an der man die Felder zur Pflege einbinden möchte. Im Beispiel wurde der Bereich rechts unterhalb Kategorien gewählt. Die eigentlichen Änderungen macht man dann in der Codeansicht.

Wir möchten unsere Felder nur im Bearbeitungsmodus darstellen. Die Inhalte selbst sollen ja unsichtbar als Meta-Elemente ausgegeben werden. Um etwas nur im Bearbeitungsmodus auszugeben, bietet SharePoint das praktische Control Microsoft.SharePoint.Publishing.WebControls.EditModePanel, das so eingefügt wird:

<PublishingWebControls:EditModePanel class="ewiki-margin" runat="server">
</PublishingWebControls:EditModePanel>

Dieses Control sorgt automatisch dafür, daß sein Inhalt nur im Bearbeitungsmodus in der Seite erscheint. Zur Pflege unserer Felder verwenden wir ein weiteres mitgeliefertes Control: Microsoft.SharePoint.WebControls.FormField. Es wird so eingefügt:

<SharePoint:FormField id="metaDescField" ControlMode="Edit" FieldName="MetaDescription" runat="server"/>

Wichtig sind die Attribute ControlMode, das unbedingt auf Edit gesetzt warden muß, und FieldName, das den internen Namen des Feldes enthalten muß. Als Wert für id kann ein beliebiger Wert verwendet werden.

Das Tagprefix SharePoint steht in der Wikivorlage standardmäßig nicht zur Verfügung. Man muß die notwendige Deklaration noch im Kopf der Seite einfügen:

<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

Insgesamt fügen wir zur Pflege der Metainformationen also folgendes ein (hier wurde noch eine Überschrift verwendet):

<PublishingWebControls:EditModePanel class="ewiki-margin" runat="server">
 
<b>Meta-Informationen:</b><br/>
 
<SharePoint:FormField id="metaDescField" ControlMode="Edit" FieldName="MetaDescription" runat="server"/>
 
<SharePoint:FormField id="metaKeyField" ControlMode="Edit" FieldName="MetaKeywords" runat="server"/>
</PublishingWebControls:EditModePanel>

Damit haben wir bereits alles, was wir zur Pflege der Meta-Informationen benötigen. Eine Seite im Bearbetungsmodus sieht dann so aus:

Meta-Elemente ausgeben

Wir müssen jetzt noch dafür sorgen, daß unsere Felder im Kopf der Seite als Meta-Elemente ausgegeben werden. Den Code dazu fügt man in den Platzhalter PlaceHolderAdditionalPageHead ein.

Zum Ausgeben eines bestimmten Feldwertes gibt es ebenfalls ein praktisches Control: Microsoft.SharePoint.WebControls.FieldValue. Es wird so verwendet:

<SharePoint:FieldValue id="metaDescValue" FieldName="MetaDescription" runat="server"/>

Wichtig ist auch hier wieder, daß das Attribut FieldName mit dem internen Namen des gewünschten Feldes belegt wird.

Damit wird allerdings nur der eigentliche Feldinhalt im HTML-Quelltext ausgegeben. Wir brauchen diesen Inhalt aber im content-Attribut eines meta-Elements. Für Meta-Elemente gibt es kein eigenes Control in ASP.NET und wir müssen uns deshalb mit Literal-Controls behelfen. Mit einem Literal kann man direkt HTML-Text erzeugen. Wir verwenden also jeweils ein Literal um den Teil des meta-Elements vor und hinter dem eigentlichen Feldwert auszugeben. Es sind dann so aus:

<asp:Literal ID="metaDesc1" runat="server" Text="&lt;meta name=&quot;description&quot; content=&quot;"/>
<SharePoint:FieldValue id="metaDescValue" FieldName="MetaDescription" runat="server"/>
<asp:Literal ID="metaDesc2" runat="server" Text="&quot;&gt;"/>

Damit haben wir alles, um in einem Enterprise-Wiki Meta-Informatione zu pflegen und korrekt als meta-Elemente in der Seite auszugeben. Die genannten Anpassungen müssen allerdings in jeder Websitesammlung neu durchgeführt werden. Bei Veröffentlichungsseiten ist das etwas umfangreicher als beim Enterprise-Wiki, weil mehr Inhaltstypen und mehr Seitenvorlagen verwendet werden.

Fertige Lösung

Dennis ist bei seinen Recherchen auf eine kostenlose Lösung gestoßen, die den Prozeß etwas automatisiert, die Mavention Meta Fields. Dabei handelt es sich um eine SharePoint Farm-Solution. Alle Texte sind fest einprogrammiert englisch. Zur Verwendung muß das zugehörige Websitesammlungsfeature aktiviert werden. Dadurch wird ein Delegate Control registriert, das den Platzhalter PlaceHolderAdditionalPageHead ersetzt.

Dieses Control prüft, ob es sich bei der aktuellen Seite um eine Veröffentlichungsseite handelt und falls ja, werden alle Felder der Seite, die zur Gruppe Publishing Meta Tags (fest einprogrammiert) gehören, als meta-Elemente ausgegeben. Als name-Attribut wird dabei der sichtbare Name des Feldes verwendet.

Außerdem fügt das Control im Bearbeitungsmodus ein div-Element in die Seite ein (als Kind des form-Elements). Dieses Element enthält wiederum Controls, die als Pflegemaske für die Felder dienen. Das Element wird dabei durch fest einprogrammiertes CSS positioniert und mittels jQuery 1.4.2 aus- und eingeblendet.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s