1. Christian Salazar
  2. cruge
  3. Issues

Issues

Issue #99 new

Mejora para menus dinamicos creados desde CRUGE

Hector Calvo
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 (2)

  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. Log in to comment