close

Development, Coding

AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridOffice 365On-PremisesScripting, PowerShellSharePoint 2013SharePoint 2016SharePoint Online

SharePoint 2013 DEV: Javascript – ein Must-Have!

Bekannt ist, dass Javascript eine Scriptsprache und keine Programmiersprache ist. Zumindest für Entwickler. Trotzdem stehen genau diese oft vor der Anforderung, dass genausoviel von Solutions in Javascript wie von Solutions in anderen vollständigen Programmiersprachen gefordert wird. Nur wie soll eine prozedurale Scriptsprache dabei mithalten können?

In vielen Punkten gibt es keine Möglichkeit dafür, an anderer Stelle mittlerweile sehr wohl. In letzter Zeit sind sehr viele Libraries entstanden, die mit vielen Schwierigkeiten, die sich in Javascript stellen, leicht umgehen können. Im Falle von Databinding sind Knockout oder AngularJS wahre Problemlöser. Bei 2D-Geometry hilft Svg, bei 3D ThreeJS.

Trotz aller Neuerungen kämpft man aber leider immer noch mit Unterschieden unter den verschiedenen Browsern. Eine einheitliche Standardisierung könnte hier vieles vereinfachen, allerdings ist so etwas noch ferne Zukunftsmusik, falls es überhaupt eintritt. Deshalb ist es unter Umständen vernünftiger auf Technologie zu setzen, die auf Basis von Plugins arbeitet.

In diesem Fall muss sich der Hersteller des Plugins um die Unterschiede in den Browsern kümmern, während sich der Entwickler auf die Umsetzung seiner Solution konzentrieren kann. Eines der bekanntesten Beispiele dafür ist Unity. Diese Engine läuft sowohl in allen größeren Browsern als auch auf Applikationsebene und allen mobilen Devices. Eine durchaus abzuwägende Alternative, besonders weil Unity auch C# unterstützt.

Happy Coding!

Published: 08.09.2014 08:42

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

SharePoint 2013 DEV: Apps, Apps, Apps

Sharepoint Apps sind die Zukunft. Nur leider ist die Zukunft in diesem Fall schlecht und oft auch fehlerhaft dokumentiert. Die einfachsten Implementierungen können so schnell viel Zeit kosten, weil Fehler an der falschen Stelle gesucht werden, geht man doch nicht davon aus, dass die Dokumentation in diversen Büchern und auf guten Developerseiten einfach falsch ist.

Ein gutes Beispiel dafür sind Rest-Services, die schnell und damit hervorragend zur App-Entwicklung eingesetzt werden können. Zu Beachten dabei ist, dass die Verwendung von “ajax” zum Aufruf selbiger nicht funktioniert. Warum? Weil jede App in ihrer eigenen Domäne läuft und deshalb jeder Zugriff Cross-Domain ist. Damit bleibt der “/_layouts/15/SP.RequestExecutor.js” als einzige Möglichkeit übrig, diesen Zugriff durchzuführen.

Die notwendige Url dafür gestaltet sich noch einmal so schwierig, denn bei vielen Anleitungen wird das notwendig setzen des “Targets” gar nicht erwähnt. Eine mögliche Url wäre:

appweburl + „/_api/SP.AppContextSite(@target)/web/getfolderbyserverrelativeurl(‚“ + listname + „‚)/files?@target='“ + hostweburl + „‚&$top=“ + 10+ „&$skip=“ + 10;

Und aufpassen, nicht vertippen, denn Compiler-Checks für einen String gibt es natürlich nicht.

Für viele andere Cross-Domain Aufrufe findet sich leider nicht so leicht ein möglicher Weg. Somit ist wieder einmal die Kreativität des Entwicklers gefragt, um solche Dinge zu umschiffen.

Happy Coding!

Published: 01.08.2014 08:51

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

SharePoint 2013 DEV: List Url Filter, Migrations Highlights

In SharePoint 2010 kann eine Liste bequem per Url-Parameter gefiltert werden. Ob mit

FieldField1=MusterFieldName&FieldValue1=MusterValue
FieldName=MusterFieldName&FieldMultiValue=MusterValue1;MusterValue2

können schnell Filterergebnisse erzielt werden. Zusätzlich kann mit “FilterOp1” ein Operator gesetzt werden, um nicht nur Equal sondern auch “StartsWith”, “Contains” oder andere Filteroptionen umzusetzen.

In SharePoint 2013 funktioniert diese Filterung noch immer, allerdings nur solange bis man mehr Items in der Liste hat, als auf eine Seite passen. Dann nämlich kann geblättert werden und “FilterOp1” funktioniert nicht mehr.

Versuche, diese Option mit anderen Url-Filtern umzusetzen, scheitern. Also greift man auf Tricks wie das Anlegen von “Calculated Fields” zurück, um auf diese mit “Equal” zu filtern. Allerdings scheitert Url-Filterung bei “Calculated Fields” komplett.

Eine mögliche Lösung ist ein “List Event Receiver”. Dieser wird an die Liste gehängt und befüllt ein “Hidden Field” mit Werten, mit Hilfe derer auf “Equal” gefiltert werden kann. Ob das allerdings noch bequem ist, sei dahingestellt.

Published: 16.07.2014 10:57

Source: New feed

mehr lesen
AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridOffice 365SharePoint OnlineTool, Bot, App, Add-In

Eine SharePoint 2013 App mit NAPA

In einem meiner letzten Blog Beiträge hatte ich angekündigt eine App mit NAPA zu erstellen.

NAPA ist bereits eine App, die es ermöglicht einfache SharePoint 2013 Apps oder Office 2013 Apps zu erstellen. Wenn man NAPA nutzen möchte, muss man dies in einer Developer Site Collection tun. Außerdem sollte man die NAPA App anschließend im SharePoint Store suchen und in der Site Collection hinzufügen.

SharePoint 2013 Bloglog, SharePoint Store NAPA App

Nachdem man NAPA hinzugefügt hat (Add und Trust), kann man diese auch aufrufen. NAPA zeigt anschließend folgenden Dialog.

Hinweis: Sollte der Benutzer mit dem die NAPA App geöffnet wird, ein Sonderzeichen wie z.B. ein | oder Klammern-Symbol im Displaynamen haben, dann liefert Office365 einen HTTP 500 Internal Server Error zurück. Es soll ja Benutzer geben, deren Organisationskonto einen Aufbau wie “Benutzernamen | Abteilungsnamen” haben. Wenn das der Fall ist, dann sollte man sich ein Benutzerkonto anlegen, das ohne diese Zeichen auskommt.

SharePoint 2013 Bloglog, NAPA Add New Project

Klickt man anschließend auf “Add New Project” kann man sich entscheiden, wofür man eine App entwickeln möchte. In unserem Fall wird es eine App für SharePoint sein.

SharePoint 2013 Bloglog, NAPA App for SharePoint

Hier kann man noch den Projekt Namen vergeben, in meinem Fall möchte ich eine App für eine einfache Zeiterfassung erstellen. Anschließend wird der Quellcode der Default.aspx Page angezeigt.

SharePoint 2013 Bloglog, SharePoint NAPA Default_aspx App

Klickt man in der Tool-Leiste (links im Bild) auf den “Play” Button, dann wird diese App innerhalb der SiteCollection auch deployed und kann verwendet werden.

SharePoint 2013 Bloglog, App Page Title

Natürlich ist diese App völlig unbrauchbar, allerdings hat sie bereits sämtlich Bestandteile, die auch bei komplexen Apps vorhanden sein müssen, damit sie auf SharePoint 2013/Office 365 deployed werden kann. Die App selbst läuft als SharePoint-hosted App und kann somit nur Logik abbilden, die in JavaScript programmiert werden kann. Dazu gehören natürlich auch Web-Service Aufrufe, die mittels JavaScript implementiert werden. Zusätzlich zur Startseite Default.aspx der App wird seitens NAPA noch ein wichtiger Bestandteil angelegt um ein App Part zu realisieren. Der Solution Tree im Folder “Pages” beinhaltet auch die Seite ClientWebPart.aspx.

SharePoint 2013 Bloglog, SharePoint NAPA ClientWebPart_aspx

Ein Client Webpart ist eigentlich ein App Part, das auf Seiten wie ein gewöhnliches Webpart positioniert werden kann. Der Unterschied zu einem Standard Webpart liegt darin, dass die gesamte Logik clientseitig abläuft, somit ist es ein Client Webpart (=App Part).

Wichtig ist dabei, der Code in der 1. Zeile:

<WebPartPages:AllowFraming runat=“server“ />

Damit ist sichergestellt, dass diese Page in einem iFrame verwendet werden kann, was absolut notwendig ist, um ein App Part auf einer Seite hinzufügen zu können. Das automatisch generierte App Part sieht dann auf einer Testpage in der Site Collection wie folgt aus.

SharePoint 2013 Bloglog, SharePoint NAPA Default AppPart

Die Entwicklungsumgebung selbst hilft beim Entwickeln mit Syntax-Highlighting und IntelliSense, aber ein Ersatz für Visual Studio ist es nicht. Daher gibt es einen Button in der Tools Leiste, mit dem das gesamte Projekt, das ursprünglich in der Developer Site Collection angelegt wurde, lokal in Visual Studio geöffnet werden kann.

Online in der NAPA App können lediglich CSS, ASPX und JS Dateien angelegt und bearbeitet werden. Des Weiteren können Bilder, die für die App relevant sind hochgeladen werden. Leider ist es aber nicht möglich z.B. Listdefinitionen oder Listinstanzen hinzuzufügen. Daher ist es unumgänglich den Weg Richtung Visual Studio zu gehen. Im nächsten Blogbeitrag zeig ich dann wie wir diese App erweitern.

Published: 14.07.2014 15:01

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

Kleine feine API: SPQuery mit Camlex.Net

Ein Assembly, das es schon seit einigen Jahren gibt und das mir bei einem meiner letzten Projekte sehr geholfen hat, ist Camlex.Net.

Dabei handelt es sich, um die Möglichkeit SPQuery Abfragen auf Basis von “Expression Trees” zu erstellen. Somit ist es nicht notwendig CAML Abfragen manuell zu erstellen. Wie fehleranfällig bzw. wie unflexibel die dynamische Erweiterung von solchen Abfragen ist, weiß jeder, der es einmal versucht hat. Die Fehlermeldungen, die man im Fehlerfall erhält, wenn Abfragen falsch sind, geben auch selten Informationen über das tatsächliche Problem.

Um Camlex.Net verwenden zu können, braucht man lediglich die Camlex.Net.dll (oder für den Client-Zugriff die Camlex.Client.dll). Diese kann man auf Codeplex (http://camlex.codeplex.com/) herunterladen oder per Install-Package installieren. Wichtig dabei ist, wenn man es in einer SharePoint Lösung verwendet, muss diese DLL im Package inkludiert werden, falls sie nicht am Ziel SharePoint vorhanden ist. Zusätzlich muss man noch ein using System.Linq im Source Code hinzufügen und schon kann man mit Hilfe von LINQ komfortable Abfragen erstellen.

Eine einfache Abfrage

Stellen wir uns vor, wir suchen in einer Liste, die Büchertitel speichert, ein bestimmtes Buch mit dem Titel “Intrigen der Macht”. Diese Abfrage sieht mit Camlex.Net wie folgt aus.

var camlQuery = Camlex.Query()

.Where(item => (string)item[„Title“] == „Intrigen der Macht“);

Man erhält dadurch eine Instanz vom Type IQuery zurück, die eine Methode implementiert, um daraus ein SPQuery Objekt zu erzeugen.

camlQuery.ToSPQuery() liefert ein SPQuery Objekt zurück, das anschließend an die Methode SPLiist.GetItems(SPQuery) wie gewohnt übergeben werden kann.

Dieses einfache Beispiel zeigt, die Abfrage für konstante Werte.

Eine Abfrage mit dynamischen Werten

Nehmen wir aber an, man will einen dynamischen nicht konstanten Ausdruck, der über ein entsprechendes Interface übergeben wurde, abfragen. Das nachfolgende Beispiel ist die Umsetzung einer TextBox (TitleTextBox) in einer ApplicationPage und einem entsprechenden Code-Behind File.

Func<object> booktitle = () => TitleTextBox.Text;

var camlQuery = Camlex.Query()

.Where(item => (string)item[„Title“] == booktitle());

Dieses Beispiel entspricht nun schon eher einem echten Anwendungsfall, gehen wir aber noch einen Schritt weiter.

Eine dynamische Abfrage

Wenn man z.B. ein Suchformular hat, das es ermöglicht nach dem Titel und nach dem Autor zu suchen, wobei der Autor als optionaler Suchparameter mitgegeben werden kann, so muss man eine dynamische Abfrage erstellen. Dies würde dann mit Hilfe von Camlex.Net wie folgt umgesetzt werden:

Func<object> booktitle = () => TitleTextBox.Text;

Func<object> bookautor = () => AuthorTextBox.Text;

var expressions = new List<Expression<Func<SPListItem, bool>>>();

expressions.Add(item => (string)item[„Title“] == booktitle());

if (!string.IsNullOrEmpty(AuthorTextBox.Text))

expressions.Add(x => (string)item[„Author“] == bookauthor());

var camlQuery = Camlex.Query()

.WhereAll(expressions);

(Die Methode für OR wäre im obigen Beispiel .WhereAny(expressions).)

Somit hat man eine dynamische SPQuery, die nur den Autor in der Filterbedingung berücksichtigt, wenn dieser tatsächlich auch über das Suchformular eingegeben wird.

An dieser Stelle sei auch erwähnt, dass die Abfrage von verschiedenen Typen (Lookup, Int, DateTime, usw.), die Kombination von And und Or Operatoren, die Sortierung und die Gruppierung möglich sind.

Dem interessierten Leser empfehle ich folgende Links:

http://camlex.codeplex.com/ hier im Speziellen die Dokumentation und das Diskussionsforum.

http://camlex-online.org.

Published: 04.07.2014 15:16

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioMigration, UpgradeOn-PremisesSharePoint 2013

SharePoint 2013 DEV: Solution Migration, Migrations Highlights

Eine Solution von SharePoint 2010 auf SharePoint 2013 zu migrieren ist bis auf die Details eine feine Sache. Man folgt einfach den folgend angeführten Punkten und muss sich dann nur mehr um die eben erwähnten Details kümmern. Diese können in der Schwierigkeit von sehr einfach bis unmöglich variieren, je nachdem wie umfassend sich der anprogrammierte Bereich in den Versionen verändert hat.

Solution Migration 2010 – 2013

1. Unload des Csproj-Files und öffnen mit Editor

2. XML Element TargetFrameworkVersion auf v4.5 ändern:

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

3. TargetOfficeVersion direkt unter <Project><PropertyGroup>…<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>:

<TargetOfficeVersion>15.0</TargetOfficeVersion> (mehr …)

mehr lesen
AllgemeinDevelopment, CodingOn-PremisesSharePoint 2013Tool, Bot, App, Add-In

SharePoint 2013 App Modell – Hosting Möglichkeiten

In meinem letzten Blogbeitrag hab ich bereits angedeutet, dass es verschieden Möglichkeiten gibt SharePoint 2013 Apps zu hosten. Diesmal möchte ich eine kurze Zusammenfassung der Hosting Möglichkeiten geben. Das SharePoint App Model bietet drei Optionen, die man beim Entwickeln einer neuen SharePoint App bereits wissen sollte, da man sich in Visual Studio bei der Erstellung eines neuen Projekts dafür entscheiden muss.

SharePoint 2013 Bloglog, Visual Studio New project (HATAHET)

Die drei Möglichkeiten sind:

  1. Provider-hosted Apps
  2. Autohosted Apps
  3. SharePoint-hosted Apps

Remote Web

Um das besser zu verstehen, muss ich an dieser Stelle den Begriff Remote Web kurz erklären.

Das Remote Web bezeichnet einen Webserver, der außerhalb der SharePoint 2013 Farm Funktionalitäten für die App zur Verfügung stellt. Es kann nicht nur eigene komplexe Funktionalitäten zur Verfügung stellen, um in einer App verwendet zu werden, sondern es kann selbst auch über das Client Side Object Modell (CSOM) den SharePoint 2013 “anprogrammieren”. Die App, d.h. die Sub-Site, die im SharePoint die App repräsentiert, verwendet in so einem Fall Webseiten des Remote Webs als Startseite. Dies wird im App-Manifest als RemoteAppUrl hinterlegt. “~remoteAppUrl” ist ein dynamischer Token, der beim Entwickeln eine Erleichterung darstellt, da man nicht ständig die URL des Remote-Webservers eingeben muss. (mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioMigration, UpgradeOn-PremisesSharePoint 2013

SharePoint 2013 DEV: Workflow Manager 1.0, Migrations Highlights

Body:

Eines der neuen Features in SharePoint 2013 ist der eigenständig arbeitende Workflow-Manager. Erst einmal installiert, was durchaus aufgrund von Permission-Aspekten trickreich sein kann, eröffnet der Workflow-Manager neue Möglichkeiten um hilfreiche Workflows in einer SharePoint-Umgebung anzulegen.

image

Möchte man nun eine Custom-Workflow-Action von SharePoint2010 auf SharePoint2013 migrieren, kann man das tun, indem man die Abwärtskompatibilität nutzt. Diese funktioniert Out-of-the-Box und schafft keine neuen Herausforderungen. Ganz im Gegenteil zu einer vollständigen Migration auf SharePoint2013.

SharePoint Designer und der neue Workflow-Manager sind aktuell scheinbar nicht auf Entwicklungen in diesem Bereich ausgelegt. Gründe dafür sind, dass Dlls der entwickelten Assembly und eine AllowedTypes.xml händisch in zwei Ordner des Workflow-Managers kopiert werden müssen. Ein Deployment integiert in das Hinzufügen einer Solution in eine SharePoint-Umgebung gibt es derzeit nicht.

Zudem gestaltet sich das Entwickeln sehr mühsam. Bei jedem Entwicklungslauf muss der Cache des SharePoint-Designers geleert werden, der über drei Position im File-System verteilt ist. Die Custom-Workflow-Action muss komplett neu im VS-Projekt angelegt werden und manchmal muss sogar das entsprechende Feature neu erstellt werden. Erschwerend hinzukommt, dass Fehlermeldungen rar aufscheinen.

Fazit für das Migrieren und Entwickeln von Custom-Workflow-Actions ist das Umsatteln auf Web-Services. Der neue Workflow-Manager bietet nämlich die Möglichkeit, genau diese aufzurufen. Deshalb heißt es für uns Abschiednehmen von Custom-Workflow-Actions und die neue Möglichkeit der Web-Services im Workflow-Bereich Willkommen zu heißen.

lg Georg

Published: 05.03.2014 07:18

Source: New feed

mehr lesen
AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridOffice 365On-PremisesSharePoint 2013SharePoint OnlineTool, Bot, App, Add-In

SharePoint 2013: Apps, Apps überall!

… und jetzt auch für SharePoint 2013. Ich wurde unlängst von einem Kunden gefragt, warum es nun SharePoint Apps gibt, wo es doch ohnehin schon die server- und clientseitigen Möglichkeiten gibt, SharePoint „anzuprogrammieren“.

Also die Antwort darauf aus Microsoft Sicht ist durch aus nachvollziehbar und auch sinnvoll. Viele Entwickler und Systemadministration werden dem beipflichten, denn die technischen Gründe dafür sind absolut vertretbar. Bevor ich aber die Frage beantworte, blicken wir doch mal kurz in die Vergangenheit.

Mit SharePoint 2010 war es möglich Managed Code für SharePoint Farmen in Form von Full-trust Lösungen oder sogenannte Sandboxed-Solutions, die in einer eingeschränkten Umgebung laufen sollen, zu programmieren. Sandboxed-Solutions waren gedacht als die Lösung für Office 365, d.h. die Lösung die uns Entwicklern es ermöglicht SharePoint Lösungen für Office 365 zu programmieren.

Wer das jemals versucht hat, weiß, dass das eher eine sub-optimale Möglichkeit ist und war. Denn Sandboxed Solutions unterliegen gewaltigen Einschränkungen. Näher möchte ich darauf nicht eingehen. Aus Entwicklersicht kann ich aber behaupten, dass ich sehr glücklich bin, dass es dazu eine Alternative gibt. (mehr …)

mehr lesen
AllgemeinDevelopment, CodingKonfiguration, DeploymentOn-PremisesScripting, PowerShellSharePoint 2013Veranstaltung, Event, Konferenz

SPC2012: Anpassung der Oberfläche

Nahed hat ja schon einen Überblick über die wirklich tolle Keynote bei der SharePoint Conference 2012 gegeben. Ich selbst bin das erste mal bei der SPC dabei und muss sagen dass ich wirklich stark beeindruckt bin. Besonders dass hier alles so reibungslos abgewickelt wird, und dass bei den Massen von Teilnehmern. Da kann sich so manche andere kleine Veranstaltung ein Beispiel daran nehmen Zwinkerndes Smiley.

Eine kurze Demo im Rahmen der Keynote hat mich als alten Webdesigner und leidgeprüften SharePoint Designer User besonders beeindruckt und daher wollte ich das selbst gleich mal ausprobieren. Es geht dabei um die Anpassung des SharePoint 2013 Layouts mit einem beliebigen HTML Editor. Also vom Grundgedanken her so wie es z.B. auch bei Typo3 üblich ist. Einfach ein HTML Template erstellen in dem dann Platzhalter Tags eingefügt werden in denen dann der SharePoint Content gerendert wird.

Klingt ja prinzipiell gut, aber ich glaub es immer erst wenn ich es selbst mal gesehen habe Zwinkerndes Smiley. (mehr …)

mehr lesen
1 2 3 4
Page 3 of 4