Felder in Inhaltstypen nutzen

20. Dezember 2010

Bereitstellen von Feldern:

  • Felder können Global in der Site- oder WebCollection bereitgestellt werden
  • Felder können auch nur für ein ListTemplate im List Schema bereitgestellt werden

Bereitstellen von Inhaltstypen:

  • können Global in der Site- oder WebCollection bereitgestellt werden
  • können auch nur für ein ListTemplate im List Schema bereitgestellt werden

In der (globalen) Inhaltstypdefinition kann auf Felder verwiesen werden welche nur im ListTemplate vorhanden sind, also müssen diese nicht zwingend global definiert sein. Dann sollte der Inhaltstyp aber der Gruppen “_Hidden” hinzugefügt werden, da diese Felder im Websiteinhaltstyp nicht angezeigt werden! Listen welche auf Basis der Vorlage erstellt werden enthalten alle im Inhaltstyp definierten Felder da diese im Schema vorhanden sind.

Für Dependent Lookup Fields und Computed Fields ist diese Nutzung sehr gut geeignet da diese auch kein Platz im SQL Server belegen.

Thomas Deployment, SharePoint , ,

CSS Rule dynamisch hinzufügen

14. Dezember 2010
private class MyStyle : Style
{
    protected override void FillStyleAttributes(CssStyleCollection attributes, IUrlResolutionService urlResolver)
    {
        base.FillStyleAttributes(attributes, urlResolver);
        attributes[HtmlTextWriterStyle.TextAlign] = "right";
        attributes[HtmlTextWriterStyle.PaddingRight] = "10px";
    }
}

this.Page.Header.StyleSheet.CreateStyleRule(new MyStyle(),
                                            this.Page,
                                            ".myRule");

// Erstellt folgende CSS Rule
// .myRule { text-align:right; padding-right:10px;}

Thomas Asp.Net ,

SharePoint DelegateControl selbst bereitstellen

10. Dezember 2010

Das SharePoint:DelegateCotnrol kann in allen Asp.Net Objekten (ServerControl, UserControl, Page) eingebunden werden. Somit ist es auch möglich in einer FormComponent einen Platzhalter für Erweiterungen über das DelegateControl zu ermöglichen.

<SharePoint:RenderingTemplate ID="SPTest1" runat="server">
    <Template>
        <asp:Label runat="server" ID="t1" Text="SPTest1" /><br />
        <SharePoint:DelegateControl ControlId="MyTestDelegate" runat="server" AllowMultipleControls="true" />
        <SharePoint:FormComponent TemplateName="ListForm" runat="server" />
    </Template>
</SharePoint:RenderingTemplate>

Eigenes UserControl:

<Control Id="MyTestDelegate"
         ControlSrc="~/_controltemplates/SPTest2Del.ascx"
         Sequence="100">
     <Property Name=”MeineEigenschaft”>Value</Property>
     <Property Name=”...”>...</Property>
</Control>

Eigenes ServerControl:

<Control Id="MyTestDelegate"
         ControlAssembly="$SharePoint.Project.AssemblyFullName$"
         ControlClass="SPTestCustomFormPage.EcmaScriptDelegateControl"
         Sequence="100"/>

Das ServerControl muss zusätlich zu den SafeControls hinzugefügt werden!

Thomas SharePoint , , , ,

SearchServer 2010 Express “Access Denied”

9. Dezember 2010

Sobald man im SearchServer 2010 Express eine WebAnwendung mit Forderungsbasierter Sicherheit (Claim based Security) hinzufügt ist die Verwaltungsseite zum Suchserver nicht mehr zugänglich “Access Denied”.

Im Eventlog und im SharePoint Log sind keine Informationen vorhanden um den Fehler zu beheben aber es gibt ja noch google….

Folgenden Code für die Web-Anwendungen ausführen wo Claim-based-security aktiviert ist.

$wa = Get-SPWebApplication –Identity “http://weburl
$user = "domain\FarmAdmin"
$policy = $wa.Policies.Add($user,$user)
$ploicy.PolicyRoleBinding.Add($wa.PolicyRoles.GetSpecialRole("FullControl"))

Thomas SharePoint ,

ID im Display und Edit Form anzeigen

25. November 2010

 

Field Definition:


<Field ID="{f1be43e9-418d-41b2-982e-8894e7ee6e13}"
       Type="Computed"
       Name="TaskID"
       StaticName="TaskID"
       DisplayName="Task ID"
       Group="_Hidden"
       SourceID="http://schemas.microsoft.com/sharepoint/v3">
  <FieldRefs>
    <FieldRef Name="ID" />
  </FieldRefs>
  <DisplayPattern>
    <Column Name="ID" />
  </DisplayPattern>
</Field>

 

ContentType Definition:

<FieldRef ID="{f1be43e9-418d-41b2-982e-8894e7ee6e13}" Name="TaskID" ShowInDisplayForm="TRUE" ShowInEditForm="TRUE" ShowInNewForm="FALSE"/>

 

Es ist auch möglich über das UI eine berechnete Spalte zu erzeugen und dort als Formel =[ID] einzutragen.

Der Typ Computed hat aber den Vorteil das dieser keine Spalte im SQL Server benötigt im Gegensatz zu Calculated (SqlVariant)

Thomas Customization, SharePoint ,

Interna von SP.UI.Dialog

10. November 2010
Optionen

folgenden Optionen werden zum anzeigen vom SP.UI.ModalDialog.showModalDialog unterstützt:

  • width: 100px (null)
  • height: 100px (null)
  • autosize: true|false (null=true)
  • dialogReturnValueCallback: callback Methode
  • url: <url>
  • html: htmlNode
  • x: 10px (null)
  • y: 10px (null)
  • title: Text
  • allowMaximize: true|false (null=true)
  • showMaximized: true|false (null=false)
  • showClose: true|false (null=true)

wird width und height nicht gesetzt sollte autosize nicht auf false gesetzt werden.

Sollte im Dialog ein Html Element statt eine Url angezeigt werden kann diese Html Element in der Seite als nicht sichtbar gesetzt werden (übergeordnetes Element) und dann über element.cloneNode(true) in der options Property html gesetzt werden. Sollte man kein Clone des Nodes durchführen wird der Dialog beim schließen, diesen Node löschen. Diesen Node kann aber in eine Variable gespeichert werden so das dieser erhalten bleibt.

Dialog nach einen PostBack schließen

Sobald die benötigte Funktionalität auf der Serverseite ausgeführt wurde kann der Dialog wie folgt geschlossen werden:

this.Page.Response.Clear();
this.Page.Response.Write("<script type=\"text/javascript\">window.frameElement.commonModalDialogClose(1, 1);</script>");
this.Page.Response.End();

Parameter1 (SP.UI.DialogResult): –1 = invalid, 0 = cancel, 1 = OK

Parameter2: Result Value

Weitere windows.frameElement Methoden:

  • cancelPopup()
  • commitPopup(ReturnValue)
  • overrideDialogResult(DialogResult)
  • navigateParent(url)
  • commonModalDialogClose(DialogResult, ReturnValue)
  • dialogArgs(args)
  • autoSize(arg)

Thomas SharePoint ,

Ribbon GroupTemplates (CMDUI.XML)

8. November 2010
TemplateName
Title Type Template
Alias
DisplayMode
Ribbon.Templates.Flexible
Large OneRow o1 Large
Medium ThreeRow o1 Medium
MediumTwoRows TwoRow o1 Medium
Small ThreeRow o1 Small
Popup     Large

Ribbon.Templates.Flexible2

LargeLarge OneRow o1 Large
  OneRow o2 Large
LargeMedium OneRow o1 Large
  ThreeRow o2 Medium
LargeSmall OneRow o1 Large
  TreeRow o2 Small
MediumLarge ThreeRow o1 Medium
  OneRow o2 Large
MediumMedium ThreeRow o1 Medium
  ThreeRow o2 Medium
MediumSmall ThreeRow o1 Medium
  ThreeRow o2 Small
SmallLarge ThreeRow o1 Small
  OneRow o2 Large
SmallMedium ThreeRow o1 Small
  ThreeRow o2 Medium
SmallMedium ThreeRow o1 Small
  ThreeRow o2 Medium
SmallSmall ThreeRow o1 Small
  ThreeRow o2 Small
Popup     LargeMedium

 

Diese Templates sind vom Type “OverflowSection” und ermöglichen damit eine Dynamische Anzahl von Steuerelementen. 

  • Small = Icon (16×16) ohne Label Text
  • Medium = Icon (16×16) mit Label Text
  • Large = Icon (32×32) mit Label Text (unterhalb)

Thomas SharePoint

CustomForm in UserDisp.aspx

5. November 2010

Die UserDisp.aspx Page enthält ein DelegateControl mit der ID = “ProfileRedirection”. Der SharePoint Server nutzt diese Möglichkeit um die Benutzerinformationen aus der MySite darzustellen.

Meine Frage war nun wie kann ich auf der Seite einfach nur die Toolbar austauschen um so mein Button hinzuzufügen ohne eine neue Page bereitzustellen?

Eine Lösung ist eine eigenes Form (Kopie von  “UserListForm”) wo dann das “UserInfoListFormToolBar” ausgetauscht wird, da dieses nicht über TemplateName übersteuert werden kann. Alternativ kann auch ein Redirect auf eine eigene Page durchgeführt werden wo bei dann auch nur eine Kopie der UserDisp.aspx und UserListForm angelegt wird.

<SharePoint:UserInfoListFormToolBar runat="server" />

Ersetzen durch:

<SharePoint:FormComponent runat="server" TemplateName="MyUserInfoListDisplayFormToolBar" />
<SharePoint:RenderingTemplate id="MyUserInfoListDisplayFormToolBar" runat="server">
   <Template>
     <script type="text/javascript">
       recycleBinEnabled = <SharePoint:ProjectProperty Property="RecycleBinEnabled" runat="server"/>;
     </script>
     <wssuc:ToolBar CssClass="ms-toolbar" id="toolBarTbl" runat="server" FocusOnToolbar=true>
     <Template_Buttons>
         <SharePoint:UserInfoListEditItemButton runat="server"/>
         <SharePoint:UserInfoListDeleteItemButton runat="server"/>
     </Template_Buttons>
    </wssuc:ToolBar>
  </Template>
</SharePoint:RenderingTemplate>

Implementierung des UserControls um das Form auszutauschen:

CodeBehind:

public partial class UserProfModify : UserControl, IFormDelegateControlSource
{
    private static readonly Guid featureId = new Guid("0e2c460d-c1e1-4539-a88c-75db03816881");
    private static bool IsMyUserSettingsEnabled(SPSite site)
    {
        return site.Features[featureId] != null;
    }

    #region IFormDelegateControlSource Member

    public void OnFormInit(object objOfInterest)
    {
        SPListItem listItem = objOfInterest as SPListItem;
        if (listItem != null)
        {
            // Prüfen ob es sich um eine Person handelt.
            SPContentTypeId id = (SPContentTypeId)listItem["ContentTypeId"];
            if (SPBuiltInContentTypeId.Person.IsParentOf(id))
            {
                // Prüfen ob für diese SiteCollection das angepasste Form erwünscht ist.
                if (UserProfModify.IsMyUserSettingsEnabled(listItem.Web.Site))
                {
                    // ctl00, PlaceHolderMain, UserListForm
                    Control t = Page.Controls[0].FindControl("PlaceHolderMain");
                    if (t != null)
                    {
                        FormComponent userForm = t.FindControl("UserListForm") as FormComponent;
                        if (userForm != null)
                        {
                            userForm.TemplateName = "MyUserListForm";
                        }
                    }
                }
            }
        }
    }

    public void OnFormSave(object objOfInterest)
    {
    }

    #endregion
} 

UserControl (ascx)

<%@ Control Language="C#" AutoEventWireup="false" CodeBehind="UserProfModify.ascx.cs"    Inherits="TestUserPage.WebControls.UserProfModify, $SharePoint.Project.AssemblyFullName$" %>

Feature:

<?xml version="1.0" encoding="utf-8"?><Elements xmlns="http://schemas.microsoft.com/sharepoint/">  <Control Id="ProfileRedirection" Sequence="95" ControlSrc="~/_controltemplates/UserProfModify.ascx" /></Elements>

Thomas Customization, Deployment, SharePoint , , ,

SharePoint und .Net 3.5

10. Februar 2009

da ich keine funktionsfähige Implementierung (Package) für das .Net 3.5 Framework gefunden habe habe ich mal selbst ein Package erstellt was auch zu 100% funktioniert.

Die die ich im Web gefunden habe, haben alle das Problem mit der Reihenfolge in der Web.config gehabt.

    <httpHandlers>
      <remove verb="GET,HEAD,POST" path="*" />
      <add verb="GET,HEAD,POST" path="*" type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <add verb="OPTIONS,PROPFIND,PUT,LOCK,UNLOCK,MOVE,COPY,GETLIB,PROPPATCH,MKCOL,DELETE,(GETSOURCE),(HEADSOURCE),(POSTSOURCE)" path="*" type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" />
      <remove verb="*" path="*.asmx" />
    </httpHandlers>

Das Problem ist das die Änderungen in der DB gespeichert werden und nach Namen alphabetisch sortiert in die Web.config geschrieben werden.

Im Web habe ich eine Lösung gefunden die mich auf die richtig Spur geführt hat:

    mod.AddChildNodeModification(
        "handlers[1=1]/remove[@name='WebServiceHandlerFactory-Integrated']",
        "configuration/system.webServer/handlers",
        @"<remove name=""WebServiceHandlerFactory-Integrated"" />"
        );

Dabei war das Problem das, wenn man die Anwendung in der Zentraladministration zurück gezogen hat, die Unterknoten unter <httpHandlers> nicht entfernt wurden! Das Problem ist darauf zurückzuführen das er den Namen im angegebenen Path in nicht findet.

Der Name Parameter in SPWebConfigModification ist ein XPath Ausdruck welcher von angegebenen Path aus sucht und somit vom Parent aus suchen muss.

So funktioniert es besser:

    mod.AddChildNodeModification(
        "../handlers[1=1]/remove[@name='WebServiceHandlerFactory-Integrated']",
        "configuration/system.webServer/handlers",
        @"<remove name=""WebServiceHandlerFactory-Integrated"" />"
        );

Das Package enthält 3 Features:

  • .Net 3.5 Basis
  • WCF Support (Handler für *.svc”)
  • Silverlight 2 Support

Download wsp

Thomas SharePoint , , ,