David Schneider

SharePoint and Office 365 Blog


Hinterlasse einen Kommentar

Reindex einer Liste anstossen

SharePoint bietet die Möglichkeit, bestimmte Listen explizit neu indexieren zu lassen. Beim nächsten Incremental Crawl wird dann der Inhalt dieser einen Listen neu indexiert. Normalerweise geschieht dies nur bei einem Full Crawl. In grossen Farmen kann ein solcher Full Crawl aber Stunden oder gar Tage dauern.

In den List Settings unter Advanced kann man für jede beliebige Liste eine Reindexierung anstossen.

reindex

Ändert man die Konfiguration des Search Schemas (z.B. neue Managed Properties) kann man mit dem nachfolgenden PowerShell Script einfach einen Reindex aller Liste eines bestimmten Typs (hier mit dem Namen „Tasks“) initiieren.

$wa = get-spwebapplication "https://intranet.contoso.com"
foreach($site in $wa.sites)
{
  foreach($web in $site.AllWebs)
  {
    $list = $web.Lists["Tasks"]
    if($list -ne $null)
    {
      Write-Host "Reindex $($web.Title)"
      $version = $list.RootFolder.Properties["vti_searchversion"]
      $list.RootFolder.SetProperty("vti_searchversion", ($version + 1)); 
      $list.Update();                
    } 
    $web.Dispose()
  } 
  $site.Dispose()
}


Hinterlasse einen Kommentar

Einfache Integration von Yammer in SharePoint

Bei vielen Unternehmen verschiebt sich ein Teil der Kommunikation und dadurch auch der Kollaboration von SharePoint nach Yammer. Wenn es um den Austausch zu Projekten oder Themen geht hat Yammer klare Vorteile. Daher gilt es die beiden Welten zu vereinen.

Die Yammer App, welche im SharePoint App Store angeboten ist, überzeugt nicht wirklich. Einfacher und flexibler ist die Integration des Yammer Feeds mittels Yammer Embed und dem Script Web Part. Diese Anleitung funktioniert übrigens auch auf Office 365.

Mit einigen Zeilen JavaScript Code kann auf einer Web Part Page der Yammer Feed eines Networks oder einer Group angezeigt werden. Zuerst müssen folgende Vorbedingungen erfüllt sein.

  • Damit sich die Benutzer nicht extra für Yammer einloggen müssen, ist ein SSO hilfreich. Dabei gibt es das alte Yammer SSO oder das neue Office 365 sign-in for Yammer, welches laut Office 365 Roadmap aktuell ausgerollt wird.
  • Nutzt man den Internet Explorer, müssen folgende die Domains in die „Trusted Sites“ aufgenommen werden. Am besten über die GPO.
https://*.yammer.com
https://*assets-yammer.com

Die Integration auf SharePoint 2013 erfolgt mit dem Script Editor Web Part. Das Web Part kann auf jeder beliebigen Web Part Page über den „Embed Code“ Button eingefügt werden.

embed2

Zum Start fügen wir einfach folgendes Code Snippet ein.

<script type="text/javascript" src="https://assets.yammer.com/assets/platform_embed.js"></script>
<div id="embedded-feed" style="height:600px;width:600px;"></div>
<script>
  yam.connect.embedFeed({
    container: '#embedded-feed'
    , feedType: ''
    , feedId: ''
    , config: {
      use_sso: false
      , header: true
      , footer: true
      , showOpenGraphPreview: false
      , defaultToCanonical: false
      , hideNetworkName: false
    }
  });
</script>

Sofort wird der Yammer Feed des Default Networks geladen. Über folgende Website können wir nun das Snippet gemäss unseren Bedürfnissen konfigurieren: https://www.yammer.com/widget/configure.

embed

Die wichtigsten Parameter sind die folgenden.

  • Network Permalink:  Name des Yammer Networks. Wenn man Yammer aufruft, erscheint der Permalink als erster „Ordner“ des URLs.
  • Feed Type:
    • „My Feed“ ist der persönliche Feed, ideal für die Startseite.
    • „Group“ zeigt den Inhalt einer Gruppe an.
    • „Topic“ zeigt die Posts zu einem Hashtag an
  • Feed ID: Abhängig davon, was als Feed Type ausgewählt wurde, muss hier die ID angegeben werden. Am Besten wählt man die Gruppe, den Hashtag, etc. auf Yammer aus und kopiert die ID aus der URL Zeile.

Mit einem Klick auf „Go“ kann man die Einstellungen sofort testen.

Easy, nicht?


Hinterlasse einen Kommentar

PDF Check Out funktioniert nicht

Seit dem March 2013 Public Update für SharePoint wird beim Öffnen von Adobe Acrobat PDF Dateien kein Check-Out Dialog mehr angezeigt. Wenn man die PDF nur lesen will, ist das nicht schlimm. Wenn es aber darum geht, die PDF Dateien zu bearbeiten oder Annotationen zu machen, fehlt eine wichtige Funktion. Microsoft hat den Bug bestätigt – wann wir mit einer Lösung rechnen können, steht aber in den Sternen.

In einem Adobe Forum findet man einen Workaround um das Problem zu umgehen. Dabei wir der JSLink auf dem SharePoint Field gesetzt. (Hey Developers, eine gute Gelegenheit, diese tolle, aber ziemlich unbekannte Funktion von SharePoint näher kennen zu lernen).

Zuerst geht es darum, eine JS Datei (wir nennen sie PDFFIX.JS) auf SharePoint zu hinterlegen. Das kann entweder via Module einer SharePoint Farm Solution geschehen. Man kann die Datei aber auch einfach in die Style Library hochladen. Anbei der Code von PDFFIX.JS

(function () {
 if (typeof SPClientTemplates === 'undefined')
 return;

 var PdfCtx = {};
 PdfCtx.Templates = {};
 PdfCtx.Templates.Fields = { 'LinkFilename': { 'View': PdfClientLinkFilenameNoMenu } };
 SPClientTemplates.TemplateManager.RegisterTemplateOverrides(PdfCtx);
})();

function GetExtension(szHref) {
 var sz = new String(szHref);
 var re = /^.*\.([^\.]*)$/;
 return (sz.replace(re, "$1")).toLowerCase();
}

var stsOpen = null;

function IsPdfClientInstalled() {
 if (stsOpen == null) {
 if (Boolean(window.ActiveXObject)) {
 try {
 stsOpen = new ActiveXObject("PdfFile.OpenDocuments");
 }
 catch (e) {
 stsOpen = null;
 }
 }
 }
 return (stsOpen != null);
}

function OpenPdfInClient(pdfFileUrl) {
 var fRet = true;
 try {
 fRet = typeof stsOpen.ViewDocument2 != "undefined" && stsOpen.ViewDocument2(window, pdfFileUrl, '');
 }
 catch (e) {
 fRet = false;
 };

 if (event != null) {
 event.cancelBubble = true;
 event.returnValue = false;
 }
 return fRet;
}

function PdfNewGif(listItem, listSchema, ret) {
 if (listItem["Created_x0020_Date.ifnew"] == "1") {
 var spCommonSrc = GetThemedImageUrl("spcommon.png");
 ret.push("<span class=\"ms-newdocument-iconouter\"><img class=\"ms-newdocument-icon\" src=\"");
 ret.push(spCommonSrc);
 ret.push("\" alt=\"");
 ret.push(Strings.STS.L_SPClientNew);
 ret.push("\" title=\"");
 ret.push(Strings.STS.L_SPClientNew);
 ret.push("\" /></span>");
 }
}

function PdfClientLinkFilenameNoMenu(param1, param2, listItem, listSchema) {
 var ret = [];
 var fileUrl = listItem.FileRef;

 if (fileUrl != null && typeof fileUrl != 'undefined' && TrimSpaces(fileUrl) != "") {
 if (listItem.FSObjType == '1') {
 if (listSchema.IsDocLib == '1') {
 RenderDocFolderLink(ret, listItem.FileLeafRef, listItem, listSchema);
 }
 else {
 RenderListFolderLink(ret, listItem.FileLeafRef, listItem, listSchema);
 }
 }
 else {
 ret.push("<a class='ms-listlink' href=\"");
 ret.push(listItem.FileRef);
 ret.push("\" onmousedown=\"return VerifyHref(this,event,'");
 ret.push(listSchema.DefaultItemOpen);
 ret.push("','");
 ret.push(listItem["HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon"]);
 ret.push("','");
 ret.push(listItem["serverurl.progid"]);
 ret.push("')\" onclick=\"");

 var appInstalled = IsPdfClientInstalled();
 var szExt = GetExtension(listItem.FileRef);
 if (appInstalled && szExt == 'pdf' && browseris.ie) {
 ret.push("return OpenPdfInClient('");
 ret.push(window.location.protocol + "//");
 ret.push(window.location.hostname);
 ret.push(listItem.FileRef);
 }
 else {
 ret.push("return DispEx(this,event,'TRUE','FALSE','");
 ret.push(listItem["File_x0020_Type.url"]);
 ret.push("','");
 ret.push(listItem["File_x0020_Type.progid"]);
 ret.push("','");
 ret.push(listSchema.DefaultItemOpen);
 ret.push("','");
 ret.push(listItem["HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon"]);
 ret.push("','");
 ret.push(listItem["HTML_x0020_File_x0020_Type"]);
 ret.push("','");
 ret.push(listItem["serverurl.progid"]);
 ret.push("','");
 ret.push(Boolean(listItem["CheckoutUser"]) ? listItem["CheckoutUser"][0].id : '');
 ret.push("','");
 ret.push(listSchema.Userid);
 ret.push("','");
 ret.push(listSchema.ForceCheckout);
 ret.push("','");
 ret.push(listItem.IsCheckedoutToLocal);
 ret.push("','");
 ret.push(listItem.PermMask);
 }

 ret.push("')\">");

 var fileRef = listItem["FileLeafRef"];

 if (fileRef != null) {
 var index = fileRef.lastIndexOf('.');
 fileRef = index >= 0 ? fileRef.substring(0, index) : fileRef;
 }

 ret.push(fileRef);
 ret.push("</a>");

 PdfNewGif(listItem, listSchema, ret);
 }
 }
 else {
 ret.push("<nobr>");
 ret.push(listItem["FileLeafRef"]);
 ret.push("</nobr>");
 }

 return ret.join('');
}

Jetzt muss man die Eigenschaft JSLink auf dem SPField LinkName setzen. Am besten geht dies mit PowerShell. Man kann z.B. das Field im Rootweb verändern und setzt damit die Eigenschaft innerhalb der gesamten Site Collection. Nachdem man die Datei z.B. nach „/Style Library/scripts/pdffix.js“ kopiert hat, würde das PowerShell wie folgt lauten.

Add-PSSnapin "Microsoft.SharePoint.PowerShell"

$SPWebApp = Get-SPWebApplication "https://intranet"

foreach($SPSite in $SPWebApp.Sites)
{
 $web = $SPSite.RootWeb
 Write-Host $SPSite.RootWeb
 $field = $web.Fields.GetFieldByInternalName("LinkFilename")
 Write-Host $field.JSLink
 if ($field.JSLink -ne "/Style%20Library/scripts/PdfFix.js")
 {
 $field.JSLink = "/Style%20Library/scripts/PdfFix.js"
 $field.Update($true) #push change down to all lists
 }
}

Aber Achtung. Folgende Einschränkungen:

  • Wenn Microsoft den Bug gefixt hat, muss der Workaround wieder rückgängig gemacht werden. D.h. dokumentieren und die Beschreibung der Public und Cumulative Updates genau durchlesen.
  • Jedesmal wenn eine neue Site Collection erstellt wird, muss auf der neu erstellten Site Collection das PowerShell wieder ausgeführt werden.
  • Workaround ist immer ein anderer Name für Hack.


Hinterlasse einen Kommentar

ShareConf 2014: 10 Gründe warum der SharePoint langsam ist

Ich durfte heute an der ShareConf eine Session zum Titel „10 Gründe warum der SharePoint langsam ist“ halten. Anbei die Slides dazu.


Hinterlasse einen Kommentar

Search Driven Websites

An den Collaboration Days 2014 konnte ich eine Session über Search Driven Websites halten. Die Slides dazu findest du hier.