Martes, 22 Julio 2014 13:45

Widget de menús - filtrado por permisos y dropdown (Framework MVC Básico)

Escrito por  Jaisiel Delance
Valora este artículo
(1 Votar)

Hola estimados usuarios, desde hace un tiempo varios usuarios han preguntado o publicado en el foro la forma en la que se puede hacer un dropdown y filtro de los enlaces de los menús, he aquí un tutorial que muestra como hacerlo con el código actual del tutorial 26 del framework MVC básico.

EL arreglo de menús ubicado en el modelo del widget de menús en el método "getMenu()" los menús se componen de un arreglo indexado con arreglos clave valor, para agregar filtrado por permiso vamos agregar una nueva clave a los arreglos de los items del menú que deseemos filtrar llamada "permiso" y como valor la clave del permiso, para agregar un dropdown vamos agregar una clave llamada "sub_menu" que será un arrglo con arreglos de los items del submenú de igual forma que el arreglo de los items del menú, el arreglo de un menú sería de esta forma:


$menus['top'] = array(
    /* Este arreglo de item no tiene la clave permiso, por lo tanto pasa el filtro y no se verifica,
       esto aplica también para los subitems que no contengan la clave permiso */
    array(
        'id' => 'inicio',
        'titulo' => 'Inicio',
        'enlace' => BASE_URL,
        'imagen' => 'icon-home'
        ),
    // este contiene la clave permiso y será verificado por el filtro
    array(
        'id' => 'item',
        'titulo' => 'Item',
        'enlace' => BASE_URL,
        'imagen' => 'icon-flag',
        'permiso' => 'clave_permiso', // clave del permiso
        'sub_menu' => array(
            array(
                'id' => 'sub_item1',
                'titulo' => 'Sub-item 1',
                'enlace' => BASE_URL,
                'imagen' => 'icon-chevron-right',
                'permiso' => 'clave_permiso' // clave del permiso
                ),

            array(
                'id' => 'sub_item2',
                'titulo' => 'Sub-item 2',
                'enlace' => BASE_URL,
                'imagen' => 'icon-chevron-right',
                'permiso' => 'clave_permiso' // clave del permiso
                )
            )
        )
);

Ahora  vamos a crear un método llamado filtro en el modelo del widget de menú ubicado en "./widgets/models/menu.php":


private function filter($menu)
{
    // obtenemos la instancia del registro
    $reg = Registry::getInstancia();

    // arreglo que almacena los items filtrados
    $filtro = array();
    
    foreach ($menu as $item) {
        // verificamos si está presente la clave "permiso" en el arreglo del item del menú
        if(isset($item['permiso'])){
            // si el usuario no tiene el permiso habilitado se salta en el bucle
            if( ! $reg->_acl->permiso($item['permiso'])){
                continue;
            }
        }
        
        // verificamos si está presente la clave "sub_menu" en el arreglo del item del menú
        if(isset($item['sub_menu']) && sizeof($item['sub_menu']) > 0){
            // pasamos el filtro a los sub-enlaces del item
            $sub_links = array_map(function($item) use ($reg){
                if(isset($item['permiso'])){
                    if( ! $reg->_acl->permiso($item['permiso'])){
                        return false;
                    }
                }

                return $item;
            }, $item['sub_menu']);

            $item['sub_menu'] = array_filter($sub_links);
        }

        // asignamos el item
        $filtro[] = $item;
    }

    return $filtro;
}

Ahora cambiamos la ultima línea del metodo getMenu() por esta:

return $this->filter($menus[$menu]);

 

Este es ahora el código de la vista top ("./widgets/views/top.phtml")

<div class="navbar navbar-fixed-top <?php echo isset($inverse) ? "navbar-inverse" : "" ?>">
    <div class="navbar-inner">
        <div class="container">
            <a class="brand" href="<?php echo BASE_URL ?>"><?php echo APP_NAME ?></a>

            <?php if(isset($menu) && sizeof($menu) > 0): ?>
                <div class="nav-collapse">
                    <ul class="nav">
                        <?php foreach($menu as $item): ?>
                            <?php 
                            $_item_style = "";
                            
                            if(View::getViewId() && $item["id"] == View::getViewId())
                            {
                                $_item_style = "active";
                            }
                            
                            $dropdown = (isset($item["sub_menu"]) && sizeof($item["sub_menu"]) > 0);
                            ?>

                            <li class="<?php echo $_item_style; echo $dropdown ? " dropdown" : "" ?>">
                                <a  href="<?php echo $item["enlace"]?>" <?php echo $dropdown ? 'class="dropdown-toggle" data-toggle="dropdown"' : ""; ?>>
                                    <i class="<?php echo $item["imagen"]; echo isset($inverse) ? "icon-white" : ""?>"> </i>                                    
                                    <?php echo $item["titulo"]; echo $dropdown ? ' <b class="caret"></b>' : ""?>
                                </a>
                                
                                <?php if($dropdown): ?>
                                    <ul class="dropdown-menu">
                                        <?php foreach($item["sub_menu"] as $item): ?>
                                            <li>
                                                <a href="<?php echo $item["enlace"]?>">
                                                    <i class="<?php echo $item["imagen"]; echo isset($inverse) ? "icon-white" : ""?>"> </i>
                                                    <?php echo $item["titulo"]; ?>
                                                </a>
                                            </li>
                                        <?php endforeach; ?>
                                    </ul>
                                <?php endif; ?>
                            </li>
                        <?php endforeach; ?>
                    </ul><?php if(Session::get("autenticado")): ?>
                        <div class="navbar-form pull-right">
                            <a href="<?php echo BASE_URL ?>usuarios/login/cerrar" class="btn"><i class="icon-fire"> </i> Salir</a>
                        </div>
                    <?php else: ?>
                        <form class="navbar-form pull-right" method="post" action="<?php echo BASE_URL ?>usuarios/login">
                            <input type="hidden" value="1" name="enviar">
                            <input class="span2" name="usuario" type="text" placeholder="Usuario">
                            <input class="span2" name="pass" type="password" placeholder="Password">
                            <button type="submit" class="btn">Entrar</button>
                        </form>
                    <?php endif; ?>
                </div>
            <?php endif; ?>
        </div>
    </div>
</div>

Leer 31257 veces Modificado por última vez en Martes, 22 Julio 2014 15:26

4 comentarios

  • Enlace al Comentario Djesus Viernes, 11 Septiembre 2015 14:19 publicado por Djesus

    Muchas Gracias por los tutoriales me han sido de gran ayuda, me gustaria saber como interactuar el widget con la BD, muchas gracias de antemano.

  • Enlace al Comentario Aingerus Sábado, 08 Agosto 2015 22:52 publicado por Aingerus

    como se puede adaptar para un servicio web JSON

  • Enlace al Comentario J jeins Jueves, 26 Febrero 2015 19:50 publicado por J jeins

    Hola MR Dlancedu, solo quería decirte que gracias a tus video tutoriales he aprendido muchísimo y cada día siento mas amor hacia este lenguaje de programación.

    Eres el mejor, me gustaría aprender al máximo de usted........

    salu2

  • Enlace al Comentario Alex Viernes, 19 Diciembre 2014 03:42 publicado por Alex

    GRacias muy buenos tutoriales, para aprende el mvc a modo framework, y buscando e indagando mas, me da curiosidad si se puede emplear el patron repository en e esquema, y que este de manera globar para hacer la aplicacion mas flexible.
    No encuentro la forma de crearlos e inyectar las dependencias, para ello; mucho agradecere sus aportaciones...

Deja un comentario

Asegúrate de llenar la información requerida marcada con (*). No está permitido el Código HTML.

Categorías

hosting joomla