13 feb 2014

MSCRM Cómo Crear un Campo de Tipo Password con JavaScript

Dynamics CRM no tiene la posibilidad de añadir campos de contraseña (Password) a un formulario. Con este script , mostramos una manera de cambiar el tipo de campo para que se pueda usar como campo de contrase­ña.

OGBIT.PasswordField = {
    Init: function (fields) {

        var ids = fields.split(';');
        for (var idx in ids) {
            var id = ids[idx];
            var control = document.getElementById(id);
            if (control && typeof (control) != "undefined") {
                control.setAttribute("type", "password");
                OGBIT.PasswordField.Show(id, true);
            }                           
        }       
    },
    Show: function (id, cmd) {
        var control = Xrm.Page.getControl(id);
        if (control)
            control.setVisible(cmd);
    }
}

La función Init toma un texto delimitado por punto y coma con los identificadores de campo. A cada campo, le cambiamos el atributo del campo a tipo Password. Esto automáticamente enmascara el texto en el campo con asteriscos (*), y los valores de los caracteres reales no son afectados. Dado que existe una demora entre el JavaScript cambiando el tipo de campo y el formulario de presentación de los valores , tenemos que ocultar inicialmente el campo en el formulario. Esto evita que los usuarios vean el texto real . Este script utiliza el framework XRM JavaScript para obtener la referencia de campo y establecer el atributo de visibilidad a TRUE después de cambiar el tipo de campo. Consulte la función Show para más detalles.

Para hacer trabajar esto en CRM, puedemos añadir este script como un recurso web y configurarlo en el evento OnLoad del formulario. Despues podemos añadir un STRING con los nombres de los campos que se deben cambiar. Este STRING es pasado como parametro a la function Init.

Debemos tener en cuenta que esta solución tiene una limitación . Si nos fijamos en el código fuente HTML , verá el valor real de la contraseña. Si esto no es deseable, hay que hacer trabajo adicional. Una manera puede ser de que nunca se incluya el campo real en la forma y manejar la actualización a través de los servicios web de OData.
Espero que encuentren este articulo útil.

30 ene 2014

MSCRM obtener información del usuario con JavaScript

Cuando se trabaja con formas de Dynamics CRM, podemos usar el modelo de objetos cliente XRM para consultar los campos y los controles de la página. Un campo común en todas sus formas es el ID de usuario actual. Sin embargo, esto sólo proporciona el id de sistema interno o GUID. Cuando se necesita más información sobre el usuario, podemos utilizar los servicios web oData para obtener información adicional.

Este script nos proporciona una función de ayuda que nos permita encontrar información adicional acerca de la actual usuario con sesión iniciada.

if (typeof (OGBIT) == "undefined") { OGBIT = {}; }
OGBIT.UserInfo = {   
    Get: function () {

        var userInfo = {};
        if (self.userName == '') {
        var serverUrl = window.location.protocol + "//" + window.location.host + "/" + Xrm.Page.context.getOrgUniqueName();
           
            var userId = Xrm.Page.context.getUserId();
            var req = serverUrl +"/xrmservices/2011/OrganizationData.svc/SystemUserSet(guid'{0}')?$select=EmployeeId,FullName,InternalEMailAddress,SystemUserId,DomainName".replace('{0}', userId);
            try {
                $.ajax({
                    type: "GET", contentType: "application/json; charset=utf-8", datatype:"json",async:false,
                    url: req,
                    beforeSend: function (XMLHttpRequest) {
                        XMLHttpRequest.setRequestHeader("Accept","application/json");
                    },
                    success: function (data, textStatus, XmlHttpRequest) {
                        userInfo = data.d;
                        userInfo.status = true//dynamic property
                    },
                    error: function (XmlHttpRequest, textStatus, errorObject) {
                        userInfo.status = false;
                        //add error handling

                    }
                });
            } catch (e) { }
        }
        return userInfo;
    }
}

El script primero llama al método GetUserID del contexto de la página. Esto devuelve el id de sistema que podemos usar para hacer una solicitud ODATA para obtener la información adicional del usuario. La consulta ODATA para obtener la información de usuario tiene este formato:

SystemUserSet(guid'{0}')?$select=EmployeeId,FullName,InternalEMailAddress,SystemUserId,DomainName

El SystemUserSet nos permite consultamos la entidad Usuario del sistema. Ponemos en duda para el usuario actual con el '{0}' parámetro guid. La opción de consulta de selección $ se utiliza para indicar qué campos adicionales deben ser devueltos. Esos campos son los siguientes:


Parameters:
Field Name
Description
EmployeeId
Identificación del empleado 
FullName
Nombre y apellido 
InternalEMailAddress
Email
SystemUserId
ID Interno o GUID 
DomainName
Nombre de usuario con el siguiente formato: 
Dominio \ nombre de usuario

El siguiente fragmento de código se puede utilizar para probar el script. Con esta función, simplemente llamamos al método Get y asignamos el retorno de información en variables locales.

function GetUserInfo() {
    if (typeof (OGBIT.UserInfo) != 'undefined') {
        var info = OGBIT.UserInfo.Get();
        if (info.status) {
            var empId = info.EmployeeId;
            var name = info.FullName;
            var email = info.InternalEMailAddress;
            var userName = info.DomainName;
            var id = info.SystemUserId;
        } else {
            alert('Unable to find user');
        }
    }
}

Espero que este script les ayude a obtener una mayor comprensión sobre cómo interactuar con MS CRM.

Gracias por siguir me blog!

4 ene 2014

Como Cargar SharePoint Página en un IFrame

La mayoría de sitios web no permiten que su contenido sea cargado en IFRAME. La razón principal es para evitar "framing web" en la que un sitio web remoto enmarca otro para obtener clics. Esto también es aplicable a las aplicaciones de SharePoint en el que las opciones de marco se establecen para permitir SAMEORIGIN sólo lo que significa que el marco sólo se permite a las páginas en el mismo dominio.

En SharePoint, hay una manera para que su aplicación para permitir que las páginas se pueden representar en un IFRAME. Esto se puede hacer mediante la adición de la parte siguiente Web al capitán o sola página.

<WebPartPages:AllowFraming runat="server"/>

Este webpart permite el contenido de SharePoint ser cargado en un IFrame de sitios web alojados en otros dominios.

También tengamos en cuenta que este meta-tag no funciona en SharePoint 2013:

            <meta name=”X-FRAME-OPTIONS” content=”ALLOW” />

14 dic 2013

MSCRM Adición de Notas Con JavaScript

En Dynamics CRM, los usuarios pueden añadir notas a formular observaciones acerca de ciertos cambios que se hicieron a un registro. En algunos casos, puede haber un requisito para automatizar la creación de notas basadas en ciertos cambios de información de campo.

La dificultad con las notas es que no es un campo en la entidad. En realidad, es un 1: N asociación que se muestra en la página con un IFRAME incrustado. Esto significa que no podemos llenar un campo, pero en su lugar, tenemos que llamar a los servicios web REST en CRM para solicitar la creación de la nota.

Para controlar esto, podemos crear un simple objeto JavaScript que se encarga de la llamada web del servicio (NoteManager) y otro script para prueba de la creación de las notas (TestNotes):

NoteManager JavaScript:

if (typeof (OGBIT) == "undefined") { OGBIT = {}; }
OGBIT.NoteManager = {
    AddNote: function (params, entitySet, onComplete, onError) {
        var self = OGBIT.NoteManager;
        var serverUrl = self.GetServerUrl();
        var ODataURL = serverUrl + entitySet;
        var json = JSON.stringify(params);      //MUST CONVERT TO JSON STRING

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: ODataURL,
            data: json,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("Accept""application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (onComplete != null)
                    onComplete(data.d.results);
            },
            error: function (XmlHttpRequest, textStatus, errorObject) {
                var msg = textStatus;
                try {
                    msg = JSON.parse(XMLHttpRequest.responseText).error.message.value;
                } catch (e) { }

                if (onError != null)
                    onError(msg);
            }
        });
    },
    GetServerUrl: function () {
        var serverUrl = '';
        if (typeof (Xrm) != 'undefined' && Xrm != null) {
            serverUrl = Xrm.Page.context.getServerUrl();
            //test that server name is not coming back instead of the domain name
            //otherwise we get a Cross-Origen (CORS) 400 error           
        }
        if (serverUrl.match(/\/$/)) {
            serverUrl = serverUrl.substring(0, serverUrl.length - 1);
        }

        return serverUrl + "/XRMServices/2011/OrganizationData.svc/";
    },

}

El script anterior implementa dos métodos principales:


Método 
Descripción 
AddNote
Este método se encarga de la interacción con el servicio web Dynamics CRM. Toma los siguientes parámetros: 

Nombre
Descripción 
Params
Estructura JSON que contiene la información de la nota
entitySet
Este es el nombre de la entidad donde se necesita el registro que se añade. Para las notas, el nombre es AnotationSet 
onComplete
Este es un controlador de devolución de llamada (callback handler)
onError
Controlador de devolución de llamada de los errores 

Tenga en cuenta los siguientes atributos de la petición: 

Los servicios web dinámico CRM son RESTFul. Para la creación de una nueva nota hay que usar el verbo POST. 

Dado que se pasa una estructura JSON establecemos los tipos de contenido y de datos a JSON (datatype)

El parámetro de datos contiene los datos JSON en formato de cadena (string) que se genera después de llamar a la función stringify 

GetServerUrl
Este método resuelve la dirección URL del servidor y el nombre de la organización actual.


TestNotes Script:

OGBIT.TestNotes = {
   AddNotes: function () {
      var self = OGBIT.TestNotes;
      var note = {};
      var ref = {};
      note.NoteText = "This is the content of the notes";
      note.Subject = "Note Unit test";
      ref.LogicalName = Xrm.Page.data.entity.getEntityName();//returns the entity name
      ref.Id = Xrm.Page.data.entity.getId();             //returns the primary id/guid
      note.ObjectId = ref;                              //associate the note to an entity
     OGBIT.NoteManager.AddNote(note, 'AnnotationSet', self.onComplete, self.onError); //AnnotationSet is the notes entity set 
    },
    onError: function (msg) {
        alert(msg)
    },
    onComplete: function (data) {
        alert(data);
    }
}

El Script anterior crea las siguientes estructuras JSON:


Nombre
Descripción 
Note
Este es el objeto nota. Se crea con los siguientes atributos: 

Nombre
Descripción 
NoteText
Este es el contenido de la nota 
Subject
Este es el tema 
ObjectId
Este es el objeto asociado a las notas. POR EJEMPLO Una nota puede estar asociado a una cuenta u otra entidad personalizada que apoyan notas. 


ref
Este es el objeto asociado. Necesita los siguientes atributos: 

Nombre
Descripción 
LogicalName
Este es el nombre de la entidad 
Id
Este es el identificador primario (GUID) 

Estos valores se pueden recuperar mediante el modelo de objetos de cliente XRM. Se utiliza el contexto actual para leer la información de la entidad.



Después de crear las referencias JSON, el script utiliza el método NoteManager para enviar la solicitud a los servicios web. Los manejadores de devolución de llamada se llaman después de la llamada al servicio web se ha completado. 


Espero que estos scripts pueden ayudarle a obtener una mayor comprensión de los servicios web de Dynamics CRM y cómo interactuar con ellos a través de JavaScript.