SharePoint und DNN Blog

Im Blog von 2sicGeeks schreibe ich regelmässig zu Themen rund um SharePoint 2010/2013 und DNN.

Aktuelle Blog-Beiträge

Migration einer SharePoint Website auf eine andere Websitevorlage

Vom 31.5.2016, Kategorie: 2sic Internet solutions GmbH, SharePoint, Tipps & Tricks

Im Microsoft SharePoint ist es grundsätzlich nicht möglich, bei einer bestehenden Website die Website-Vorlage auszutauschen. Der einzige Weg dies zu erreichen, ist eine neue Website mit der gewünschten Vorlage zu erstellen und den gewünschten Inhalt irgendwie übernommen. In diesem Beitrag zeige ich, welche Möglichkeiten es gibt und wie dieser Schritt mit zwei PowerShell-Scripts sehr einfach automatisiert werden kann.

Wird im SharePoint beispielsweise eine Teamwebsite erstellt, bleibt diese für immer eine Team-Site. Soweit so gut. Wenn aber z.B. im früheren SharePoint 2010 ein Besprechungsarbeitsbereich (Meeting-Workspace) erstellt wurde, kann diese im SharePoint 2013 zu einer Herausforderung werden, da diese Website schlicht nicht mehr funktioniert. Wenn die Website also noch benötigt wird, muss diese auf eine andere Vorlage migriert werden.

Ein anderes Praxisbeispiel ist, dass früher einmal mit dem Project Server experimentiert wurde und darauf produktiver Inhalt erstellt wurde. Jetzt will man aber den Project Server nicht mehr betreiben. So müssen alle noch benötigten Project-Websites migriert werden auf andere Websites. Ähnliches trifft zu, wenn man ein Downgrade von SharePoint Standard auf SharePoint Foundation durchführen will.

Zur Unterstützung der Datenmigration gibt es entweder umfangreiche Enterprise-Lösungen von Drittherstellern wie MetaLogix, AvePoint oder Sharegate. Über PowerShell können diese Schritte aber auch sehr leicht automatisiert werden, ohne Dritthersteller-Tools.

Schritt 1: Alle Listen exportieren auf das Datei-System

Als ersten werden von einer Website alle Listen und Bibliotheken einzeln exportiert auf das Dateisystem. Falls gewünscht kann der Export jetzt oder später noch gefiltert werden, sodass z.B. versteckte Listen wie die Benutzerinformationsliste ausgeschlossen werden. Der Befehl Export-SPWeb erstellt standardmässig komprimierte cmp-Dateien. In Einzelfällen empfehle ich aber -NoFileCompression zu verwenden, weil das Export-Format für den Menschen lesbarer ist. Der Export-Vorgang dauert aber dann ca. 30% länger.

$sourceWebUrl = "https://contoso.ch/alte_website"
$backupFolder = "C:\Backup\alte_website\"
$sourceWeb = Get-SPWeb $sourceWebUrl
    $sourceWeb.Lists | ForEach-Object {
    $list = $PSItem
    $backupPath = $backupFolder + $list.Title + ".cmp"
    $itemUrl = "/" + $list.RootFolder.Url
    Write-Host "Will Backup $($list.Title) URL $itemUrl" -ForegroundColor Yellow
    Export-SPWeb $sourceWeb -Path $backupPath -ItemUrl $itemUrl -IncludeVersions All -IncludeUserSecurity -NoFileCompression
 }

Schritt 2: Importieren der gewünschten Listen

Mit dem vorherigen Script wurden alle Listen exportiert auf das Dateisystem. Von Dateisystem werden sie nun wieder importiert auf der neuen Ziel-Website. Falls einige Listen nicht importiert werden sollen, empfehle ich einfach die entsprechende Backup-Datei zu löschen (bzw. den Backup-Ordner bei der NoFileCompression-Methode).

$backupFolder = "C:\Backup\alte_website\"
$targetWebUrl = "https://contoso.ch/neue_website"
Get-ChildItem "$backupFolder\*.cmp" | ForEach-Object {
    $backupPath = $PSItem.FullName
    Write-Host "Will Restore $($PSItem.Name)" -ForegroundColor Yellow
    Import-SPWeb $targetWebUrl -Path $backupPath -IncludeUserSecurity -NoFileCompression
}

Vorteile dieses Lösungsansatzes

  • Sehr schlanke und schnelle Lösung
  • Spart im Vergleich zu einer manuellen Migration der Listen und Bibliotheken mehrere Stunden Arbeit
  • Alle Versionen und Berechtigungen können übernommen werden
  • Es wird ein Standard-Tool von Microsoft verwendet
  • Es muss keine zusätzliche Software evaluiert, installiert oder lizenziert werden
  • Da alle Listen als XML-Dateien abgebildet werden, können, falls gewünscht, kleinere Korrekturen durchgeführt werden, die sonst umständlich bis unmöglich wären (z.B. löschen von beschädigten Spalten oder fehlenden Feldtypen am Zielort) – mit entsprechender Vorsicht!

Einschränkungen dieses Lösungsansatzes

  • Unterwebsites (Subsites) müssen einzeln exportiert und wieder importiert werden
  • Website-Einstellungen und Workflow-Verlauf werden nicht übernommen

Siehe auch


Ansicht-Filter in SharePoint 2013 Task-Listen funktionieren nicht mehr nach SharePoint-Updates vom März 2015

Vom 13.4.2015, Kategorie: 2sic Internet solutions GmbH, SharePoint, Bug, SharePoint Update, Windows Update

Die Microsoft/SharePoint Updates vom März 2015 verursachen, dass in Aufgabenlisten in sämtlichen Ansichten die Filter nicht mehr angewendet werden. Der Fehler tritt in Standard- und Benutzerdefinierten Ansichten/Views auf, egal nach welchem Feld gefiltert wird. Betroffen sind SharePoint Foundation 2013 und SharePoint Server 2013.

Das Problem tritt auf, nachdem das letzte Windows Update KB 2956175 vom 10.3.2015 installiert wurde (MS15-022, Build 15.0.4701.1000) oder das März 2015 CU (KB 2956159, Build 15.0.4701.1001).

Der Microsoft Support kann das Problem reproduzieren und arbeitet derzeit an einer Lösung. Es wird demnächst ein Software-Update angeboten, welches dieses Problem behebt (vermutlich im Mai 2015 Update enthalten). Im November 2014 CU gab es bereits einen ähnlichen Hotfix, welcher jedoch keinen Bezug hat zum aktuellen Bug (KB 2899546: Assume that you create a custom view for a SharePoint Foundation 2013 task list and configure a filter for the view. The filter may not work.)

Update: Dieser Fehler ist mit dem Mai 2015 CU behoben.

Workarounds

Aktuell gibt es folgende Möglichkeiten, das Problem zu umgehen:

  1. In den Views bei den Web Part Properties die Option Server render aktivieren. Dies hat den Nebeneffekt, dass die View-Navigation nicht mehr angezeigt wird und die Seite bei Interaktionen komplett neu geladen wird.
  2. Alternativ kann z.B. in der Ansicht „Alle Aufgaben“ der gewünschte Spalten-Filter manuell durch den Anwender gesetzt werden. Clientseitige Spaltenfilter werden korrekt angewendet.
  3. Alternativ kann eine Ansicht gruppiert angezeigt werden statt gefiltert. So kann der Anwender die gewünschte Filter-Gruppe ausklappen.
Ansichts-Filter werde nicht mehr angewendet in Aufgabenlisten

Use INCLUDEPICTURE Field-Code in Microsoft Word for cool Letterheads and workaround some issues

Vom 15.8.2014, Kategorie: 2sic Internet solutions GmbH, SharePoint, Microsoft Word, Word 2010, Word 2013

In Microsoft Word you can do very cool stuff using Field Codes (Formulas). For example you could create a condition to show a Picture and with a few of them you’ll have a nice Picture Randomizer for your Document Header and Footer.

After you finished such an amazing Field Code you probably want to reuse it in other Documents but ran into some issues. Even in small documents Microsoft Word might become not responding, show totally or partially blank Pages or other strange display Issues. I’ll explain you what it causes and how to work around it.

The cool thing

We created a Word Template which looks similar to this simplified one:

Random Picture in Word Document Header Field Codes for Random Picture

That’s quite cool but requires no Macro! The Field Codes are like:
{ IF { =MOD({ PAGE }; 3 } = 0 { INCLUDEPICTURE „C:\\Letterhead\Blue.png“ } }

The ugly thing

If you use Word 2010 and copy and paste these to another document it looks ok for the first moment. But as soon as people start to work with it, they might get these issues:

Scrolling Issue in Word 2010 Scrolling Issue in Word 2010

The document looks wrong when you scroll, zoom in/out or type. During that the CPU usage might be very high which indicates a performance issue. If you Press ALT + F9 to Toggle the Field Codes you’ll see there’s something wrong:

Replaced Field Codes after Copy and Paste Field Codes for Random Picture

Word 2010 just replaces the INCLUDEPICTURE Code with the actual picture which causes that issues.

The fix

To fix this issue you can either write the Formula again and again in Word 2010. Paste alternate didn’t work for us.

Or you can use Word 2013 where Copy and Paste works as expected. You can then save the File again as Word 2010 Document (check Maintain compatibility with previous versions of Word).

Attention

If you use Word 2013 (or maybe Word 2015) and open an older Word Document in Compatibility Mode, ensure to save it with Maintain compatibility with previous versions of Word checked. If you don’t you get a warning about “some minor layout changes are possible”. If you ignore that, you run into the same issue that INCLUCEPICTURE gets changed after saving!

Maintain compatibility with previous versions of Word some minor layout changes are possible

PS: if you check “Do not ask me again” you can’t undo this in any settings. It’s stored binarily in the Windows Registry at HKCU\Software\Microsoft\Office\15.0\Word. Just rename or remove that key.


DNN: Allow Non-Admins to do Page Management

Vom 8.8.2014, Kategorie: 2sic Internet solutions GmbH, DotNetNuke, Page Management

In DNN 5.0 the artificial differences between Regular and Admin pages was removed. All Modules showed in the Admin-Menu can now also be placed on any custom page and basically everyone could use them. This article gives you instructions how to allow Non-Admins to access the DNN Page Management and workaround some limitations.

Erik Van Ballegoij already wrote about how to give non admins access to any admin page. You can just insert the module like any other to a desired Page. It’s important to give the desired user(s) Edit Permission on that Page (not just on that module) otherwise they get an “Access Denied” warning.

Basically that’s it. Users can now edit Page settings for Pages they have edit Permissions to but for no other Pages. There are just two limitations:

  1. Drag and drop to reorder Pages only works for Administrators
  2. Add Page(s) only works for Administrators

To get these functionality to work for Non-Administrators adapt the file at ~/DesktopModules/Admin/Tabs/Tabs.ascx.cs. You’d need to comment out a Security check PortalSecurity.IsInRole(PortalSettings.AdministratorRoleName) 3 times:

  1. OnInit: comment out the if-Condition (line ~237) and the else statement (~243-247)
  2. CtlPagesNodeDrop: comment out the if-Condition (first line)
  3. OnCreatePagesClick: comment out the if-Statement (first two lines)

That’s it. I tested it successfully on DNN 7.3.1.

DNN Page Management for Non-Admins 2 DNN Page Management for Non-Admins

Possible SharePoint Issues after Windows Updates on the Web Server

Vom 7.8.2014, Kategorie: 2sic Internet solutions GmbH, SharePoint, Windows Update, WSS3

After Windows Updates ran on a Windows Server 2008 R2 with WSS3 SP3 we ran into a few issues caused by the Configuration Cache. This post shows you lessons learned and recommendations in case you have similar issues, especially if the Configuration Wizard crashes the entire SharePoint Farm.

Many Errors but no useful details

After about 80 Windows Updates there were the following errors:

  • http://intranet.contoso.com showed HTTP 404
  • http://intranet.contoso.com/default.aspx showed: InvalidOperationException: Operation is not valid due to the current state of the object (Stack Trace: OpenWebInternal, SetThreadCulture, ValidateDatabaseSchemaCompatibility, PreinitializeServer, PostResolveRequestCacheHandler, …)
  • SharePoint Central Administration worked normally

The detailed error message indicates to run the SharePoint Products Configuration wizard. So we did. But the Configuration Wizard failed with many errors related to the Database:

  • ExecuteNonQuery requires an open and available Connection. The connection’s current state is closed.
  • Database state cannot be changed while other users are using the database ‚SharePoint_Config_4829eeec-f431-4665-b10c-09ac21b35094‘
    ALTER DATABASE statement failed

The SharePoint_Config DB stuck in Single User Mode and the SharePoint Farm was completely down. Central Administration showed “Cannot connect to the configuration database”, running the Configuration Wizard showed “Failed to detect if this server is joined to a server farm.” but all Windows Services were up and running. Also credentials IIS and the SQL Server were still correctly.

After a restore of the SharePoint_Config DB from a state before the Windows Update at lease Central Administration ran again. I ran psconfig -cmd upgrade -inplace b2b -wait -force which resulted in the same issue without any more details.

Don’t use the -force Parameter

I took a look at the documentation of psconfig and ran it without the -force attribute. I got the crucial message which was in no other Logfile before:

An update conflict has occurred, and you must re-try this action. The object SPConfigurationDatabase Name=SharePoint_Config_4829eeec-f431-4665-b10c-09ac21b35094 Parent=SPDatabaseServiceInstance Name=Microsoft##SSEE is being updated by NT AUTHORITY\SYSTEM, in the PSCONFIG process, on machine MYSERVERNAME. View the tracing log for more information about the conflict.

Solution

This leaded me to details about an update conflict has occurred, and you must re-try this. The Resolution to clear the Configuration Cache definitely fixed the issue even on WSS 3.

Here you’ll find more about what Is a Configuration Cache and Why Do I Care About It?

Lessons learned

  1. After Software Updates ran and the Configuration Wizard crashes the farm, restore the Farm Configuration DB might help
  2. Clear the configuration cache on servers you get curious errors about the SharePoint Config
  3. Run psconfig from the command line instead the GUI but don’t use the force attribute

 

Detailed Error Message of the SharePoint Content Application:

[InvalidOperationException: Operation is not valid due to the current state of the object.]

Microsoft.SharePoint.Library.SPRequestInternalClass.OpenWebInternal(String bstrUrl, Guid& pguidID, String& pbstrRequestAccessEmail, UInt32& pwebVersion, String& pbstrServerRelativeUrl, UInt32& pnLanguage, UInt32& pnLocale, String& pbstrDefaultTheme, String& pbstrDefaultThemeCSSUrl, String& pbstrAlternateCSSUrl, String& pbstrCustomizedCssFileList, String& pbstrCustomJSUrl, String& pbstrAlternateHeaderUrl, String& pbstrMasterUrl, String& pbstrCustomMasterUrl, String& pbstrSiteLogoUrl, String& pbstrSiteLogoDescription, Object& pvarUser, Boolean& pvarIsAuditor, Int32& plSiteFlags) +0
Microsoft.SharePoint.Library.SPRequest.OpenWebInternal(String bstrUrl, Guid& pguidID, String& pbstrRequestAccessEmail, UInt32& pwebVersion, String& pbstrServerRelativeUrl, UInt32& pnLanguage, UInt32& pnLocale, String& pbstrDefaultTheme, String& pbstrDefaultThemeCSSUrl, String& pbstrAlternateCSSUrl, String& pbstrCustomizedCssFileList, String& pbstrCustomJSUrl, String& pbstrAlternateHeaderUrl, String& pbstrMasterUrl, String& pbstrCustomMasterUrl, String& pbstrSiteLogoUrl, String& pbstrSiteLogoDescription, Object& pvarUser, Boolean& pvarIsAuditor, Int32& plSiteFlags) +429
Microsoft.SharePoint.SPWeb.InitWebPublic() +1091
Microsoft.SharePoint.SPWeb.get_Locale() +142
Microsoft.SharePoint.WebPartPages.Utility.SetThreadCulture(SPWeb spWeb, Boolean force) +95
Microsoft.SharePoint.WebPartPages.Utility.SetThreadCulture(SPWeb spWeb) +58
Microsoft.SharePoint.CoreResource.GetString(ResourceGroup rg, String name, Object[] values) +1081
Microsoft.SharePoint.SPResource.GetString(String name, Object[] values) +53
Microsoft.SharePoint.Administration.SPContentDatabase.ValidateDatabaseSchemaCompatibility() +534
Microsoft.SharePoint.SPSite.PreinitializeServer(SPRequest request) +99
Microsoft.SharePoint.SPWeb.InitializeSPRequest() +548
Microsoft.SharePoint.SPWeb.EnsureSPRequest() +75
Microsoft.SharePoint.SPWeb.get_Request() +74
Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl(HttpContext context) +613
Microsoft.SharePoint.WebControls.SPControl.GetContextWeb(HttpContext context) +41
Microsoft.SharePoint.ApplicationRuntime.SPRequestModule.PostResolveRequestCacheHandler(Object oSender, EventArgs ea) +595
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171


SharePoint 2013 PDF in neuem Fenster öffnen

Vom 16.7.2014, Kategorie: 2sic Internet solutions GmbH, SharePoint, PDF

Oft werde ich gefragt, wieso Office-Dateien (Word, Excel, PowerPoint) im jeweiligen Office-Programm öffnen aber PDFs im aktuellen Browser-Fenster/Register öffnen. Leider kann das auch heute noch nicht einfach konfiguriert werden.

Je nach Browser und PDF-Reader kann das vielleicht auf dem Client konfiguriert werden, aber spätestens seit Firefox und Chrome mit eigenen PDF-Viewern einen neue Vielfalt möglicher Konfigurationen hervorgebracht haben, muss dies im SharePoint gelöst werden.

Es gibt im Internet einige Beispiele um dieses Problem per JavaScript zu lösen (siehe unten), jedoch funktioniert keines davon mit neuen AJAX-Features in SharePoint 2013 (Minimal Download Strategy und Client Side Rendering).

In diesem Beitrag zeige ich, wie es in SharePoint 2013 und Office 365 mit JavaScript gelöst werden kann.

Einfachste Lösung

Der einfachste Weg ist natürlich mit jQuery. jQuery binde ich in der Regel über die Master Page ein und platziere Globale JavaScripts in /SiteAssets/Scripts/Global.js. Für SharePoint 2013 könnte eine einfache Lösung folgendermassen aussehen:

$(document).ready(function () {
  function updatePdfLinksTarget() {
    $("a[href*='.pdf']").attr('target', '_blank').prop("onclick", null).attr("onmousedown", null);
  }
  updatePdfLinksTarget();
  setInterval(updatePdfLinksTarget, 1000);
});

Die Lösung funktioniert mit sämtlichen PDF-Links aber ist nicht besonders effizient. Dieses JavaScript durchläuft jede Sekunde das gesamte DOM und modifiziert dabei immer alle Links mit .pdf im Pfadende. Somit müssen nicht alle möglichen Seiten-/DOM-Modifikationen von der Minimal Download Strategy (MDS) und Client-Side Rendering (CSR) speziell gehandelt werden.

Bessere Lösung

Eine effizientere Lösung ist, die PDF-Links auf der Seite nur zu suchen und modifizieren, wenn per MDS die Content Area aktualisiert wurde oder wenn per Client-Side Rendering sortiert, gefiltert oder die Seite gewechselt wurde (Paging). Das folgende JavaScript macht genau das:

function initUpdatePdfLinksTarget() {
  if (typeof SPClientTemplates != "undefined" && SPClientTemplates.TemplateManager)
    SPClientTemplates.TemplateManager.RegisterTemplateOverrides({ OnPostRender: [updatePdfLinksTarget] });
  updatePdfLinksTarget();
}
function updatePdfLinksTarget() {
  $("a[href*='.pdf']").attr('target', '_blank').prop("onclick", null).attr("onmousedown", null);
  return false;
}
ExecuteOrDelayUntilScriptLoaded(function () {
  if (typeof asyncDeltaManager != "undefined")
    asyncDeltaManager.add_endRequest(initUpdatePdfLinksTarget);
  else
    initUpdatePdfLinksTarget();
}, "start.js");

Erklärung:

ExecuteOrDelayUntilScriptLoaded ersetzt den $(document).ready Event und wird einmalig aufgerufen. Falls MDS aktiviert ist (asyncDeltaManager vorhanden), wird initUpdatePdfLinksTarget bei jedem end-Request ausgeführt, also immer wenn die Content Area geändert hat. Letzteres führt dann updatePdfLinksTarget aus und registriert diese Funktion beim Client Side Rendering, also wenn sortiert, gefiltert oder die Seite gewechselt wurde.

Die Problematik mit jQuery(document).ready in SharePoint ist u.a. hier beschrieben: https://spcafcontrib.codeplex.com/wikipage?title=AvoidJQueryDocumentReady

Alternativer Workaround

Wer ganz auf Code verzichten will, kann auch die Anwender einfach schulen, PDFs in „in neuem Tab“ zu öffnen per Kontext-Menü oder Control & Click.

PDF in neuem Tab öffnen per Kontext-Menü

PDF in neuem Tab öffnen per Kontext-Menü

Wie es in SharePoint 2010 gelöst werden kann


„Check Out & Open“ Dialog beim Öffnen von PDFs im SharePoint deaktivieren

Vom 26.6.2014, Kategorie: 2sic Internet solutions GmbH, SharePoint, Adobe Reader, PDF

Beim Öffnen von PDF Dateien aus SharePoint erscheint ein Dialog, ob das Dokument ausgecheckt werden soll (seit Adobe Reader Version 10). Meistens werden PDFs nur im Lesemodus benötigt, deshalb ist es insbesondere störend, dass „Check Out & Open“ der Standard-Button ist statt „Open“.

Seit Abode Reader Version 10.1 kann diese Funktion in der Windows Registry deaktiviert werden.

Vorgehen

  1. Adobe Reader schliessen
  2. Windows Registry öffnen (als Administrator)
  3. Navigieren zu: HKLM\SOFTWARE\Policies\Adobe\Adobe Reader\10\FeatureLockDown (ggf. andere Versionsnummer)
  4. Neuen Key/Ordner erstellen mit Namen cSharePoint.
  5. Neuen DWORD Wert erstellen mit Namen bDisableSharePointFeatures und Wert 1

Der Registry Eintrag kann auch über GPSo auf alle Workstations verteilt werden: http://blog.unidesk.com/gpos-set-custom-registry-entries-virtual-desktops-disabling-machine-password

Weiterführende Infos


SharePoint 2013 Kontaktliste mit Fotos erweitern

Vom 21.5.2014, Kategorie: 2sic Internet solutions GmbH, SharePoint, JavaScript, JS Link

SharePoint Kontaktlisten können per Mausklick im Outlook angezeigt werden. Dort kann auch für jeden Kontakt ein Foto hinterlegt und gespeichert werden, jedoch erscheint dieses auf der SharePoint Website überall nur als Attachment ohne Bildvorschau. Dank JS Link bzw. JavaScript kann dies im Browser sehr leicht angezeigt werden. Das Resultat sieht dann so aus:

Resultat mit JS Link in der Listenansicht

Resultat mit JS Link in der Listenansicht

Update 12.12.2014

SharePoint hat die Darstellung des Kontaktfotos bereits eingebaut. Dazu muss „aus vorhandenen Websitespalten hinzufügen“ die Spalte „Kontaktfoto“ zur Liste hinzugefügt werden. Dieses ist ein „Link oder Bild“ Feld, in welches automatisch die Bild-URL (des Attachments) eingetragen wird.

Vielen Dank an Uwe für den Hinweis.

 

 

Wird im Outlook in einer SharePoint Kontaktliste einem Kontakt ein Foto hinzugefügt, wird das Foto als Item-Attachment mit fixem Dateinamen ContactPicture.jpg gespeichert.

In SharePoint 2013 hat Microsoft das Client Side Rendering eingefügt, womit auf standardisierte Weise das Rendering bzw. die Darstellung jedes Feldes in allen Ansichten und Formularen gesteuert werden kann per JavaScript. Ross Bradbrook hat einen guten Artikel dazu geschrieben in seinem Blog www.rbradbrook.co.uk/sharepoint-2013/introduction-to-client-side-rendering-in-sharepoint-2013/. Es gibt bereits eine kleine Sammlung an Code Beispielen auf der Microsoft Website: http://code.msdn.microsoft.com/office/Client-side-rendering-JS-2ed3538a.

Dank JS Link muss nun noch bei den gewünschten Web Parts in den Einstellungen der Pfad zur JavaScript Datei eingetragen werden, der Rest geschieht quasi von selbst. Das macht die Anwendung insbesondere für Anwender ohne HTML-Kenntnisse einfacher.

In meinem JS Link muss in der Listenansicht die Attachments-Spalte angezeigt werden, diese wird dann per jQuery wieder ausgeblendet. Diesen Schritt habe ich gewählt, damit nicht bei jedem Kontakt versucht wird ein Bild anzuzeigen, wenn gar kein Attachment vorhanden ist. Deshalb bitte die Attachments-Spalte in den Views einblenden.

 

Vorgehen zur Initial-Einrichtung inklusive jQuery Integration

  1. In der Kontakte-Liste eine Platzhalter-Spalte erstellen für das Foto (Spaltenname Photo). Ich empfehle dafür eine berechnete Spalte, da diese in den New- und Edit-Formularen nicht erscheint. Als Formel kann =“ “ eingetragen werden.
    SharePoint Photo Column
  2. JavaScripts speichern unter ~/SiteAssets/Scripts
    jQuery and Contacts JS
    jQuery: http://code.jquery.com/jquery-1.11.1.min.js
    Contacts.js: http://www.spugs.ch/SPUGSBlog/SiteAssets/Lists/Posts/Contacts.js.txt
  3. jQuery in der Master Page einbinden
    <SharePoint:ScriptLink language=“javascript“ name=“~sitecollection/SiteAssets/Scripts/jquery-1.11.1.min.js“ runat=“server“ Localizable=“false“ />
    Embed jQuery into MasterPage
  4. Auf der Listen-Ansicht die Seite bearbeiten, WebPart bearbeiten und JS Link eintragen
    JS Link - Contacts
    Resultat:
    SharePoint Contacts with Photo
  5. Gleiches Vorgehen bei der Detail-Ansicht
    SharePoint Contact Details Photo
Standard Listen-Ansicht eines Kontakts in SharePoint 2013 Kontakt im Outlook bearbeiten und Foto speichern Bitte den Namen Photo wählen, dieser ist im JS Link fix hinterlegt jQuery und Contacts JavaScript Dateien in /SiteAssets/Scripts/ speichern jQuery in der MasterPage einbinden Listenansicht Seite bearbeiten um die Web Part Einstellungen zu öffen JS Link bei dem Listen-Ansicht Web Part eintragen Resultat mit JS Link in der Listenansicht JS Link bei dem Detail-Ansicht Web Part eintragen

Update 4.7.2014

Anstelle er Einbindung in die Master Page funktioniert auch die simplere Einbindung nur über die JS-Link Einstellung: ~sitecollection/SiteAssets/Scripts/jquery-1.11.1.min.js|~sitecollection/SiteAssets/Scripts/Contacts.js


SharePoint 2010/2013 Kalender-Monatsansichten drucken

Vom 23.12.2013, Kategorie: 2sic Internet solutions GmbH, SharePoint, Tipps & Tricks, Druckansicht, JavaScript, jQuery, Kalender, SharePoint 2013

In SharePoint 2010 und 2013 ist bei Kalendern die Wochen- und Monatsansicht nicht für den Druck optimiert. Termine werden entweder gar nicht angezeigt oder sie sind horizontal nicht korrekt ausgerichtet. Hier beschreibe ich zwei einfache Lösungen, um die Monatsansicht sauber auf ein A4 oder A3 Papier auszudrucken.

Hintergrund

In SharePoint 2010 und SharePoint 2013 (Foundation und Standard/Enterprise) passt sich der Kalender standardmässig der aktuellen Fenstergrösse des Browsers an. Die Termine werden dabei als Div-Layer darübergelegt und absolut positioniert mit left– & top-Position. Beim Ändern der Fenstergrösse werden die Positionen durch JavaScript neu berechnet (window.resized-Event und unter anderem SP.UI.ApplicationPages.CalendarStateHandler.prototype.parentResized()).

Diese Berechnung wird zwar auch bei der Druckansicht durchgeführt, jedoch werden die horizontalen Positionen (left-position) der Termine falsch berechnet. Das Resultat sind Kalender-Layouts, in denen die Termine bei 100% Zoom meist gar nicht angezeigt werden und bei ca. 80% Zoom die Termine horizontal falsch ausgerichtet sind.

Workaround mit korrektem Zoom-Level

Eine Lösung ist, den Zoom Level auf ein Prozent genau einzustellen. In meinem Beispiel mit der Monatsansicht für ein A4 Papier Querformat ist das 52 Prozent.

Workaround mit fixer Kalender-Breite

Im Microsoft Forum ist dieses Problem bereits beschrieben. Dort empfiehlt Darrin, dem Webpart eine fixe Breite von 12 Zoll (ca. 30 cm) zu setzen. Das funktioniert zwar, aber dadurch geht die dynamische Kalender-Breite verloren, zudem muss diese Einstellung auf jedem Kalender-Webpart und View separat gesetzt werden.

Mit einem 11 Zeilen jQuery lässt sich dasselbe Verhalten erreichen, und zwar auf allen Views auf einmal. Zudem gibt es im Internet Explorer und Firefox einen onbeforeprint-Event, in dem die fixe Breite gesetzt werden kann, und einen onafterprint-Event, in dem die fixe Breite wieder entfernt werden kann. Wichtig ist, dass der Resize-Eventhandler danach ausgelöst wird.

In meinem Beispiel für SharePoint 2013 kann der Anwender die fixe breite selber eingeben in einem Browser-Dialog.

// Print Optimization for Calendar. Set fix width before print and call resize-handler
window.onbeforeprint = function() {
  var newWidth = prompt("Seitenbreite eingeben (A4 query: ca. 22cm, A3 quer: ca. 38.1cm)", "38.1cm");
  if (newWidth) {
    $("#AsynchronousViewDefault_CalendarView").parents("div.ms-webpart-chrome,div.noindex").width(newWidth);
    window._events.resize[0].handler.call();
  }
}
window.onafterprint = function() {
  $("#AsynchronousViewDefault_CalendarView").parents("div.ms-webpart-chrome,div.noindex").width("100%");
  window._events.resize[0].handler.call();
}

Viel Spass damit und schöne Festtage.

100% Zoom, A4 quer, flexible Kalender-Breite 80% Zoom, A4 quer, flexible Kalender-Breite 52% Zoom, A4 quer, flexible Kalender-Breite JavaScript Dialog/Prompt zum setzen der fixen Kalender-Breite für den Druck 100% Zoom, A3 quer, fixe Kalender-Breite von 38.1cm

SharePoint Search Service Application lässt sich nicht mehr erstellen über den Browser-Wizard

Vom 11.10.2013, Kategorie: 2sic Internet solutions GmbH, SharePoint, Search Server, Search Service

Auf einem SharePoint Server 2010 liess sich plötzlich keine neue Search Service Application mehr erstellen über den Browser-Wizard. Es kam immer dieselbe Fehlermeldung „Error: Value cannot be null.  Parameter name: CurrentSearchApplication”. Auch die ULS Logs brachten nicht mehr Infos.

Die Lösung war in meinem Fall einfach: mit PowerShell funktioniert es.
Microsoft hat das gesamte Script im TechNet dokumentiert: Configure a service application by using a Windows PowerShell script

Detaillierte Fehlermeldung

Unhandled page level exception. Path: /_admin/search/TopologyConfigFinish.aspx, Error: Value cannot be null.  Parameter name: CurrentSearchApplication, Details: System.ArgumentNullException: Value cannot be null.  Parameter name: CurrentSearchApplication
at Microsoft.Office.Server.Search.Internal.UI.SearchConfigWizardFinish.OnInit()
at Microsoft.Office.Server.Search.Internal.UI.SearchConfigWizardBase.OnInit(EventArgs e)
at System.Web.UI.Control.InitRecursive(Control namingContainer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) System.ArgumentNullException: Value cannot be null.  Parameter name: CurrentSearchApplication
at Microsoft.Office.Server.Search.Internal.UI.SearchConfigWizardFinish.OnInit()
at Microsoft.Office.Server.Search.Internal.UI.SearchConfigWizardBase.OnInit(EventArgs e)
at System.Web.UI.Control.InitRecursive(Control namingContainer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)