Mejora para menus dinamicos creados desde CRUGE

Issue #99 new
IMAGINE INTEGRATORS created an issue

Con el proposito de crear los menus dinamicos desde CRUGE, y el metodo getMenu retorne solo aquellas opciones sobre las cuales el rol tiene permisos (no todo el menu y sus opciones, solo el menu donde este una o varias opciones autorizadas), haciendo mas dinamicos y funcionales los menu.

Se asigna a los roles permisos sobre los item de los submenu (sobre la operacion que realmente se debe ejecutar al seleccionar un item de menu) y al llamar el metodo getMenu actualizado solo obtenemos los menu y las opciones autorizadas de los mismos, esto nor pemite crear los menu de la aplicacion desde CRUGE y solo autorizar los items especificos según el rol.

Porpongo modificar el codigo del metodo getMenu en el archivo cruge/components/CrugeAuthManager.php por el siguiente:

    if ($userid == -1) {
        $userid = Yii::app()->user->id;
    }

    $r = array();

    // todas las TAREAS a las que puede acceder este usuario
    // esten autorizadas o no

    $tasklist = $this->tasks;

    // por tanto a lo anterior: listo todas las tareas de tipo menuitem
    $itemArray = array();
    foreach ($tasklist as $task)
        if ($this->isTaskMenuItem($task) && !$this->isTaskSubMenuItem($task))
            $itemArray[] = $task;

    // todas las tareas consideradas subitems, no importa
    // si estan asignadas al usuario
    //
    $allsubitems = array();
    foreach ($tasklist as $task)
        if ($this->isTaskSubMenuItem($task) && $this->checkAccess($task->getName(), $userid))
            $allsubitems[] = $task;

    // busca las tareas que son hijas de las primeras
    // halladas. (son hijas dada la sintaxis de descripcion del CAuthItem)
    //
    foreach ($itemArray as $menuitem) {
        // child menu items
        $items = array();
        // agrega al menuitem de 1er nivel todas los subitems (tasks)
        // sin importar si fueron otorgadas al usuario con checkAccess
        //
        foreach ($allsubitems as $task) {
            if ($this->isTaskMenuItemChild($task, $menuitem)) {
                $items[] = array(
                    'label' => $this->getTaskText($task),
                    'url' => $this->getTaskUrl($task, array()),
                );
            }
        }
        // top level menu
        if (!sizeof($items)) {
            $items = null;
        } else
            $r[] = array(
                'label' => $this->getTaskText($menuitem),
                'url' => '',
                'items' => $items,
            );
    }
    return $r;

Lo hice y me funciona perfecto.

Comments (3)

  1. mauriciogocampo5

    Complementando la anterior solución:

    En el TreeView que administra las tareas que son MENU y SUBMENU al seleccionar una o varias tareas del submenu quedan seleccionadas y se ven reflejado en el menú después de aplicar el ajuste que propone juliam. Pero al salir y luego volver al administrador y ver cuales tareas del submenú tengo seleccionadas aparece como si ninguna estuviese seleccionada.

    arbol.png

    Para dar solución a este inconveniente se debe modificar el siguiente script:

    protected/modules/cruge/views/ui/rbacauthitemchilditems.php

    $children[] = array(
                            'id'=>$child->name,
                            'text'=>"<span class='itemchildtext authitemsub {
                                $asignado} {$loop}'>"
                                    .$rbac->getTaskText($child)."</span>".$imgPin,
                            'htmlOptions'=>array('class'=>'authitemchild'
                                ,'alt'=>$child->name
                                , 'title'=>$child->name),
                        );
    

    En el siguiente código quitar el salto de línea que quede asi:

    'text'=>"<span class='itemchildtext authitemsub {$asignado} {$loop}'>"
    

    arbol2.png

  2. William ordoñez

    Hola como están todos, se que el tema es viejo, sin embargo, quisiera preguntarles como creo una tarea tipo menú ya que los enlaces de la documentacion de tareas de cruge esta fuera de servicio.

    Gracias

  3. Log in to comment