Erweiterung des Formulareditors um einen zusätzlichen Link zu den Attributeigenschaften
Leider ist es nicht im Standard möglich, direkt aus dem Formulareditor auf die Attributeigenschaften zu gehen, um dort weitere Informationen zu einem bestimmten Feld zu erhalten. So möchte man beispielsweise die Länge eines Textfeldes sehen oder welche Listeneinträge eine Picklist besitzt.
Mit den nachfolgenden Änderungen ist dieses jedoch ohne weiteres möglich. Hierbei wird dem Formulareditor eine zusätzliche Schaltfläche hinzugefügt, über die man direkt in die Attributseigenschaften gelangt.
VORSICHT: Es handelt sich um eine unsupportete Erweiterung, da eine aspx-Datei verändert und eine zusätzliche Datei im CRM-Verzeichnis erstellt wird. Der Einsatz in einer Produktivumgebung ist somit also nicht zu empfehlen. Vor den nachfolgenden Änderungen sind entsprechende Sicherungen durchzuführen.
1. Schritt: Anzeige einer zusätzlichen Schaltfläche, die den Formulareditor aufruft
Der Formulareditor befindet sich in der folgenden Datei:
[..]\Microsoft CRM\CRMWeb\Tools\FormEditor\formeditor.aspx
Dort die folgenden Änderungen vornehmen:
function window.onload()
{
loadXmls();
SetPreviewXml();
Previewer.fieldXml.defaultValue = Previewer.fieldXml.value;
Previewer.propertiesXml.defaultValue = Previewer.propertiesXml.value;
Previewer.formXml.defaultValue = Previewer.formXml.value;
tabs.firstChild.click();
focus();
addNewWizard();
}
function addNewWizard() {
var trNodes;
trElements = document.documentElement.getElementsByTagName("TR");
var trViewFormProperties;
for (var i = 0; i<trElements.length; i++) {
if (trElements[i].attributes.getNamedItem("onclick").value == "ViewFormProperties();") {
trViewFormProperties = trElements[i];
}
}
var tableWizards;
tableWizards = trViewFormProperties.parentNode.parentNode;
var tr1NewWizard;
tr1NewWizard = tableWizards.insertRow(tableWizards.rows.length-1);
var td1NewWizard;
td1NewWizard = tr1NewWizard.insertCell();
td1NewWizard.setAttribute("colSpan", 2);
td1NewWizard.innerHTML = '<HR style="WIDTH: 120px; COLOR: #cccccc" SIZE=1>'
var tr2NewWizard;
tr2NewWizard = tableWizards.insertRow(tableWizards.rows.length-1);
tr2NewWizard.setAttribute("title", "Zeigt die Attributeigenschaften des Felds an.");
tr2NewWizard.setAttribute("className", "wizItem");
tr2NewWizard.attachEvent("onclick", ViewAttributeProperties);
var td21NewWizard;
td21NewWizard = tr2NewWizard.insertCell();
td21NewWizard.innerHTML = '<IMG id=_Attributeigenschaften src="../vieweditor/imgs/16_colProps.gif">';
td21NewWizard.setAttribute("className", "wizItem");
var td22NewWizard;
td22NewWizard = tr2NewWizard.insertCell();
td22NewWizard.setAttribute("className", "wizText");
td22NewWizard.setAttribute("tabIndex", "0");
td22NewWizard.innerHTML = 'Attributeigenschaften';
td22NewWizard.attachEvent("onkeyup", AccessibilityClick);
}
function ViewAttributeProperties() {
var oActive;
oActive = _oActive;
if (oActive != null) {
if (oActive.className == "cell") {
ViewAttributePropertiesHelper(oActive);
} else {
alert("Type '" + oActive.className + "' is not supported by this feature.");
}
}
else {
alert("Please select a cell.");
}
}
function ViewAttributePropertiesHelper(oActive) {
var request = new ActiveXObject("Microsoft.XMLHTTP")
request.onreadystatechange = function() {
if (request.readyState == 4) {
var response = request.responseText;
window.open("../SystemCustomization/Attributes/manageAttribute.aspx?attributeId={" + response + "}", "_blank", "width=800,height=600,status=1,resizable=1,scrollbars=0");
}
}
var entityName = oFieldsXml.selectSingleNode("/entity").attributes.getNamedItem("name").value;
var attributeName = oActive.name;
request.open("GET", "GetAttributeGuid.aspx?EntityName=" + entityName + "&AttributeName=" + attributeName);
request.setRequestHeader("If-Modified-Since", "Sun, 18 Jun 2006 10:38:00 GMT");
request.send(null);
}
2. Schritt: Damit die Schaltfläche an die interne Attributes-ID herankommen kann, muss dazu eine entsprechende Webanwendung geschrieben werden.
Die folgende neue Datei erstellen:
[..]\Microsoft CRM\CRMWeb\Tools\FormEditor\GetAttributeGuid.aspx
<%@ Page Language="C#" AutoEventWireup="true" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string cnString = "server=crm;database=Combeck_METABASE;Trusted_Connection=true";
string entityName = Request.QueryString["EntityName"];
string attributeName = Request.QueryString["AttributeName"];
if (entityName == null || attributeName == null) {
this.Response.Write("");
return;
}
System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(cnString);
string sql = "SELECT Attribute.AttributeId FROM Attribute INNER JOIN Entity ON Attribute.EntityId = Entity.EntityId WHERE Entity.Name = @EntityName AND Attribute.Name = @AttributeName";
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, cn);
cmd.Parameters.Add("@EntityName", entityName);
cmd.Parameters.Add("@AttributeName", attributeName);
cn.Open();
string attributeId = cmd.ExecuteScalar().ToString();
cn.Close();
this.Response.Write(attributeId); }
</script>
In der Zeile
string cnString = "server=crm;database=Combeck_METABASE;Trusted_Connection=true";
muss hierbei der Name des CRM-Server und der Datenbank angegeben werden.
Für Fragen und Anregungen hierzu und zu weiteren Dingen ist der Autor Jürgen Beck gerne unter [email protected] erreichbar.