Results for tag "customizations-xml"

CRM 2011 – ValueRule und OrRule kombinieren

Hallo Leute,

in einem meiner letzten Blogs habe ich mal über die Verwendung von ValueRules geschrieben (Blog). Was aber tun, wenn man zwei oder mehrere Optionen hat, die man mit einem ValueRule abfragen möchte?

Die Antwort habe ich auf Vikranth’s Blog gefunden.

Im wesentlichen ist die Lösung folgendes:

[sourcecode language=“xml“]
<DisplayRule Id="ShowUndo">
<OrRule>
<Or>
<ValueRule Field="xxx_type" Value="val1"></ValueRule>
</Or>
<Or>
<ValueRule Field="xxx_type" Value="val2"></ValueRule>
</Or>
</OrRule>
</DisplayRule>
[/sourcecode]

Nicht ganz logisch aber eigentlich recht einfach.

Cheers,
Christian

CRM 2011 – Original Ribbon Button – Andere (Javascript) Aktion hinterlegen

Hallo Leute,

aufbauend auf meinem letzten Beispiel (siehe Original Ribbon Button ausblenden) möchte ich euch nun zeigen, wie Ihr die Aktion, die hinter einem Original-Ribbon-Button liegt verändern könnt.

Im Konkreten möchte ich euch zeigen, wie Ihr dem Button „Verkaufschance als verloren schließen“ (im Form, nicht auf der Hauptseite) eine eigene Javascript-Funktion zuweisen könnt.

Dafür geht Ihr bitte wie im Artikel Original Ribbon Button ausblenden beschrieben vor.

Extrahiert also das ZIP-File und öffnet die Customizations.xml. Parallel dazu öffnet Ihr bitte wieder die „opportunityribbon.xml“-Datei aus dem SDK-Sample-Projekt.
Sucht in der XML-Datei nun nach „MarkAsLost“. Ihr werden nun folgende Zeile finden:

Kopiert das gesamte -Element am besten temporär in einen Text-Editor (Notepad) und merkt euch die ID des übergeordneten Elements. Wechselt in die Customizations.xml. Sucht dort (wie im anderen Artikel beschrieben) nach dem RibbonDiffXml-Node und fügt dort die folgenden Zeilen ein:

[sourcecode language=“xml“]
<CustomAction Id="eigeneid" Location="Mscrm.Form.opportunity.MainTab.Actions.Controls._children">
<CommandUIDefinition>

</CommandUIDefinition>
</CustomAction>
[/sourcecode]

Als Location gebt bitte die ID des übergenordneten Elements ein und fügt ein „._children“ an.
Zwischen die beiden CommandUIDefinition-Tags kopiert nun das zwischengespeichert Button-Element. Fertig sieht das nun ungefähr wie folgt aus:

[sourcecode language=“xml“]
<CustomAction Id="eigeneid" Location="Mscrm.Form.opportunity.MainTab.Actions.Controls._children">
<CommandUIDefinition>
<Button Id="Mscrm.Form.opportunity.MarkAsLost" Command="Mscrm.Form.opportunity.MarkAsLost" Sequence="4" Alt="$Resources:Ribbon.Form.opportunity.MainTab.Actions.MarkAsLost" LabelText="$Resources:Ribbon.Form.opportunity.MainTab.Actions.MarkAsLost" Image16by16="/_imgs/SFA/MarkAsLost_16.png" Image32by32="/_imgs/SFA/MarkAsLost_32.png" TemplateAlias="o1" ToolTipTitle="$Resources:Mscrm_Form_opportunity_MainTab_Actions_MarkAsLost_ToolTipTitle" ToolTipDescription="$Resources:Mscrm_Form_opportunity_MainTab_Actions_MarkAsLost_ToolTipDescription" />
</CommandUIDefinition>
</CustomAction>
[/sourcecode]

Nun ist es notwendig den „Command“ des Button-Elements zu verändern, z.B. auf: Mscrm.Isv.Form.opportunity.MarkAsLost.
Nachdem dieser „Command“ noch nicht existiert, muss er nun hinzugefügt werden, z.B. so:

[sourcecode language=“xml“]
<CommandDefinition Id="Mscrm.Isv.Form.opportunity.MarkAsLost">
<EnableRules />
<DisplayRules />
<Actions>
<JavaScriptFunction Library="$webresource:prefix_cs_opportunity" FunctionName="MarkAsLost" />
</Actions>
</CommandDefinition>
[/sourcecode]

Beachtet hier vor allem die JavaScriptFunction. Dort wird die Webresource angegeben, in der sich die JS-Methode befinden soll und der Name der JS-Methode selbst angegeben.

Passt das entsprechend euren Wünschen an und erstellt im Anschluss ein ZIP-File. Dieses kann dann wieder in gewohnter Manier in das CRM importiert werden.

Cheers,
Christian

CRM 2011 – Ribbon Button hinzufügen + Custom Rule

Christian Wagnsonner 1 Comment

Eine gängige Anforderung in einem CRM-Projekt ist es div. Schaltflächen den Ribbons hinzuzufügen, auszublenden oder zu aktivieren/deaktivieren.

Ich zeige euch in diesem Blog, wie man einen Button hinzufügt, der nur sichtbar ist, wenn die aufgerufene Entität bereits über eine ID verfügt (also bereits gespeichert wurde).

Zunächst muss man der Solution eine „Clienterweiterung“ hinzufügen, nämlich die „Anwendungsmenübänder“. Das geht wie folgt:

Danach ist es notwendig die Solution zu exportieren. Die heruntergeladene ZIP-Datei müsst Ihr irgendwohin extrahieren und die Datei „customizations.xml“ mit einem Editor öffnen. Ich empfehle euch dies direkt im Visual Studio zu tun, dort kann man auch recht einfach die Schema-Dateien zur Validierung einbinden. Wie das funktioniert, erfährt Ihr in folgendem Blog: Customizations XML validieren

Sucht nun in der Datei nach der Entität, welcher Ihr den Ribbon-Button hinzufügen möchtet. Solltet Ihr diese nicht finden, müsst Ihr diese zuerst der Solution hinzufügen und den Export wiederholen.

[sourcecode language=“xml“]
<Entity>
<Name LocalizedName="Lead" OriginalName="Lead">Lead</Name>
<ObjectTypeCode>4</ObjectTypeCode>
<strong><RibbonDiffXml></strong>
<CustomActions />
<Templates>
<RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
</Templates>
<CommandDefinitions />
<strong><RuleDefinitions></strong>
<TabDisplayRules />
<DisplayRules />
<strong><EnableRules /></strong>
</RuleDefinitions>
<LocLabels />
</RibbonDiffXml>
</Entity>
[/sourcecode]

Das Beispiel zeigt eine Standard-Entität. Für dieses Beispiel ist nur die Bearbeitung der „RibbonDiffXml“-Sektion notwendig.
Zunächst fügt man eine CustomAction hinzu:

[sourcecode language=“xml“]
<CustomAction Id="Mscrm.Isv.wit_schnellerfassung.FormCustomAction" Location="Mscrm.Form.wit_schnellerfassung.MainTab.Groups._children" Sequence="6000">
<CommandUIDefinition>
<Group Id="Mscrm.Isv.wit_schnellerfassung.Form.Group0" Sequence="400" Command="Mscrm.Isv.wit_schnellerfassung.Form.Group0" Title="$LocLabels:CustomGroup.Title" Description="$LocLabels:CustomGroup.Description" Template="Mscrm.Templates.3.3">
<Controls Id="Mscrm.Isv.wit_schnellerfassung.Form.Group0.Controls">
<Button Id="Mscrm.Isv.wit_schnellerfassung.Form.Group0.Control0" Sequence="10" <strong>Command="Mscrm.Isv.wit_schnellerfassung.Form.Group0.Control0"</strong> Image16by16="$webresource:wit_icon_schnellerfassung" Image32by32="$webresource:wit_icon_schnellerfassung" TemplateAlias="o1"></Button>
</Controls>
</Group>
</CommandUIDefinition>
</CustomAction>
</CustomActions>
[/sourcecode]
Achtet auf die fett markierte Stelle. Der Command ist für das Hinzufügen der Rules (aktivieren/deaktivieren) wichtig. Die Attributes „Image16by16“ und „Image32by32“ zeigen auf Resourcen (in diesem Fall Icons), welche schon vorweg in der Solution sein müssen. Habt Ihr noch keine hinzugefügt, könnt Ihr diese Attributes vorerst auch leer lassen.

Nun sehen wir uns die „“-Sektion genauer an und fügen eine CommandDefinition hinzu:

[sourcecode language=“xml“]
<CommandDefinitions>
<CommandDefinition <strong>Id="Mscrm.Isv.wit_schnellerfassung.Form.Group0.Control0"></strong>
<EnableRules>
<EnableRule Id="schnellerfassungEnableDisable"></EnableRule>
</EnableRules>
<DisplayRules />
<Actions>
<JavaScriptFunction Library="$webresource:wit_schnellerfassung" FunctionName="Generate" />
</Actions>
</CommandDefinition>
</CommandDefinitions>
[/sourcecode]

Die fett markierte ID der CommandDefinition ist ident mit dem Command-Attribut von vorhin!! Achtet darauf, dass dies auch bei euch ident ist.
Unter EnableRules fügen wir nun eine Rule hinzu. Auch hier wird die ID später noch benötigt!! Unter Actions fügen wir eine Javascript Action hinzu. In diesem Fall soll bei Klick auf den Button die Funktion „GenerateName“ aus der WebResource „wit_schnellerfassung“ aufgerufen werden.

Und zu guter letzt muss noch die -Sektion angepasst werden:

[sourcecode language=“xml“]
<EnableRules>
<EnableRule Id="schnellerfassungEnableDisable">
<CustomRule FunctionName="ShowHideGenerateButton" Library="$webresource:wit_schnellerfassung"></CustomRule>
</EnableRule>
</EnableRules>
</RuleDefinitions>
[/sourcecode]

Die ID der EnableRule muss mit jener von vorhin übereinstimmen! Die CustomRule ruft wieder eine Javascript-Funktion aus der Resource „wit_schnellerfassung“ auf, welche true/false retournieren muss.

In meinem Fall sieht diese Funktion (noch) wie folgt aus:

[sourcecode language=“javascript“]
function ShowHideGenerateButton() {
var entityId = Xrm.Page.data.entity.getId();
if (!Utils.StringIsNullOrEmpty(entityId)) {
return true;
}
else {
return false;
}
}
[/sourcecode]

Viel Spaß beim Nachmachen.

Happy Programming!

CRM 2011 – Customizations.xml – Validieren!

Christian Wagnsonner 1 Comment

Ein Problem, das vielen vermutlich schon einige Produktivstunden gekostet hat, ist wohl das Erweitern bzw. Validieren der Solution-Customizations.xml-Datei. Wenn man da mal eine Menge an angepassten Entitäten drin hat, wird es schnell unübersichtlich und das Anpassen eine Tortur.

Am einfachsten hilft man sich, in dem man die Schema-Dateien (Teil der SDK) herunterlädt und im Visual Studio einbindet. Im Installations-Ordner der SDK befindet sich ein Ordner „schemas“. Öffnet nun einfach euer Visual Studio und bindet die Schema-Dateien mittels folgenden Schritten ein:

* XML –>
* Schemas… –>
* Add…

Und weil es mich gerade einiges an Zeit gekostet hat: Achtet auf die Sensitivity. Id != id.

Happy Programming!