jueves, 18 de abril de 2013

Como hacer un menu usando el GAM


Se parte de que se tiene activado el GAM en su propiedad Enable Integrated Security = True
Y la propiedad Default Integrated Security = Authorization
Al tener esta ultima propiedad en autorización el gam se encarga de agregar los objetos utilizados en Genexus a los permisos de la aplicación
La forma en que los agrega es poniéndoles _NombreDel Evento
Ejemplo.- si tengo una transacción Menu  agregara los siguientes permisos
menu_Execute (significa que puede ejecutar el objeto)
menu_Insert (permite insertar)
menu_Update (permite modificar)
menu_Delete (permite eliminar)
menu_FullControl  (Permite agregar todos los permisos anteriores)


Se cuenta con tres pasos para tener los permisos en usuario
a) Primero debe existir el permiso en la aplicación
                en este punto en el caso de los menus principales que no llaman a un objeto deben de darse de alta en los permisos de la aplicación usando las opciones de agregar permisos a la aplicación.
b) Se debe agregar los permiso a los roles
c) Por último se debe agregar los roles al usuario

ahora procederemos a crear una transacción Menu con los campos necesarios para guardar los datos de las opciones que componen al menú como se muestra en la figura siguiente


MenuIsHeader.- se utiliza para indicar que es un menú principal pero que no va a llamar a ningún objeto para ejecutarse.
trim(MenuObject)+'_Execute' IF not MenuObject.isempty();
trim(MenuName)+'_Execute' IF  MenuObject.isempty();
MenuObjectNull.- se utiliza para indicar va llamar a un objeto o no
MenuObject IF MenuIsHeader=False
Se debe crear un subtipo con los siguientes atributos
MenuParentId
MenuParentName




De esta forma tenemos un menú recursivo
Hasta aquí ya tenemos la transacción menú para dar de alta nuestras opciones de menú
Ahora en la master page se debe agregar el user control de su preferencia para mostrar el menú
En este ejemplo usaremos  SmoothNavMenu


Agregamos el user control SmoothNavMenu a nuestra master page como se muestra en la figura

 en la pestaña de eventos de nuestra master page se debe agregar el código que muestra la imagen, se esta llamando en el evento start el data provider que devuelve la SDT con los datos del menú que se debe mostrar.

Ahora en el data provider se debe llenar de la siguiente forma:
order MenuOrder
where MenuParentId = &MenuParentId or (&MenuParentId=0 and MenuParentId.IsNull() )
Where GAMRepository.CheckPermission(MenuGAMObject)
{
      Id = str(MenuId)
      Title = MenuName
      Description = MenuDescription

      //Link = iif(MenuObjectNull.IsEmpty(),!"#",MenuObject+'.aspx') //generador C#
      Link = iif(MenuObjectNull.IsEmpty(),!"#",MenuObject) //generar java
     
      Items = SmoothNavMenuDP.udp(MenuId)
}



La siguiente instrucción GAMRepository.CheckPermission(MenuGAMObject)
Nos devuelve si tiene permisos el usuario autentificado al objeto enviado como parámetro a la funcion



Asi es como debe aparecer el menú del ejemplo

si usas otro user control solo debes hacer algunos cambios para llenar la SDT del menu, el principio de este ejemplo es el mismo para cualquier User Control de Menu

si quieres el ejemplo completo en xpz comenta esta entrada y dale en ++Google
Espero les sea de utilidad