Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dropdown com Dados Dinamicos

Montei um Dropdown (BootStrap 4) em uma navbar(header.php), acontece que está header é carregada em todas as paginas com dados do usuário(Nome,Tipo de Autorização e Session) e dados de classificados. Mas o código é executado em todas as controllers. Como posso fazer para que seja carregado apenas uma vez e passar sempre para as Controllers e respectivamente para views sem que haja repetição de codigo e que a estrutura de layout se mantenha.

Segue Código: View(header.php)

<div class="container-scroller">
    <!-- partial:partials/_navbar.html -->
    <nav class="navbar default-layout col-lg-12 col-12 p-0 fixed-top d-flex flex-row">
        <div class="text-center navbar-brand-wrapper d-flex align-items-top justify-content-center">
            <a class="navbar-brand brand-logo" href="<?= site_url('dashboard') ?>">
                <img src="<?php echo base_url('\assets\images\logo\1.png') ?>" alt="logo"/>
            </a>
            <a class="navbar-brand brand-logo-mini" href="<?= site_url('dashboard') ?>">
                <img src="<?php echo base_url('\assets\images\logo\1.png') ?>" alt="logo"/>
            </a>
        </div>
        <div class="navbar-menu-wrapper d-flex align-items-center">
            <ul class="navbar-nav navbar-nav-right">

                <li class="nav-item dropdown">
                    <a class="nav-link count-indicator dropdown-toggle" id="messageDropdown" href="#" data-toggle="dropdown" aria-expanded="false">
                        <i class="mdi mdi-file-document-box"></i>
                        <span class="count">!</span> </a>
                    <div class="dropdown-menu dropdown-menu-right navbar-dropdown preview-list" aria-labelledby="messageDropdown">
                        <div class="dropdown-item">
                            <p class="mb-0 font-weight-normal float-left">Novos Classificados</p>
                        </div>
                        <?php

                        $i = 0;
                        foreach ($ad as $item) {
                            if ($i >= 3) //Contador para Apenas Apresentar os três primeiros classificados
                                break;
                            ?>

                            <div class="dropdown-divider"> </div>
                            <a class="dropdown-item preview-item">
                                <div class="preview-thumbnail">
                                    <i class="mdi mdi-cube text-danger icon-lg"></i>
                                </div>
                                <div class="preview-item-content flex-grow">
                                    <h6 class="preview-subject ellipsis font-weight-medium text-dark"><?= $item['titulo']?>
                                        <!-- <span class="float-right font-weight-light small-text">1 Min ago</span>-->
                                    </h6>
                                    <!--                <p class="font-weight-light small-text"> Categoria </p>-->
                                </div>
                            </a>

                            <?php
                            $i++;}
                        ?>
                    </div>
                </li>

                <li class="nav-item dropdown d-none d-xl-inline-block">
                    <a class="nav-link dropdown-toggle" id="UserDropdown" href="#" data-toggle="dropdown"
                       aria-expanded="false">
                        <span class="profile-text">Olá, <?= $user['nome']; ?>!</span>
                        <img class="img-xs rounded-circle" src="<?php echo base_url('theme/images/faces/face1.png') ?>"
                             alt="Profile image">
                    </a>
                    <div class="dropdown-menu dropdown-menu-right navbar-dropdown" aria-labelledby="UserDropdown">
                        <a class="dropdown-item" href="<?= base_url('index') ?>"> Área externa </a>
                        <a class="dropdown-item" href="<?= base_url('logout/') ?>"> Sair </a>
                    </div>
                </li>
            </ul>
            <button class="navbar-toggler navbar-toggler-right d-lg-none align-self-center" type="button"
                    data-toggle="offcanvas">
                <span class="mdi mdi-menu"></span>
            </button>
        </div>
    </nav>
3 respostas

Parte 2 Function de uma Controller - Carregamentos que si repete em toda aplicação

public function dashboard()
    {
        Auth::isAuth();
    $data = $this->data('dashboard');
        $data['ad'] = $this->AdModel->adm();
        $this->load->view('internal/includes/header.php', $data);
    //aqui é carregada diversas views diferente dependendo da requisição
        $this->load->view('internal/includes/footer.php');
    }

Function Session

private function data($titulo)
    {
        return array(
            'title' => $titulo,
            'user' => $this->session->auth
        );
    }
solução

Oi Lucas, tudo bom?

Realmente, aqui a gente caiu em um dilema.

Isso porque a ideia de separar um header.php era justamente evitar a repetição desse código no front. Porém, isso gera a demanda de injetar esse código em todas as actions que consomem esse header o que te obriga a repetir código no back.

Uma possível solução (porém não uma boa prática) seria procurar uma forma de injetar variáveis globais nas suas views. Todo framework MVC costuma ter suporte pra isso acredito que o codeigniter também deva ter.

Porém, isso significaria que todas as views do seu sistema teriam esse valor injetado. Mas, e se daqui alguns meses o sistema exige a demanda de uma página pública? Ou seja, sem usuários logados. Nesse cenário estaríamos injetando esses dados atoa o que não é muito legal também. E, se extrapolarmos a injeção de dados globais nas views para muitos casos podemos ter problemas sérios de escalabilidade.

Por isso, acredito que a melhor ideia seja repetir isso no back-end mesmo. Pelo menos dessa forma você controla o que está sendo injetado na sua view.

Claro, podemos repetir esse código dando cltr + c e colando em vários lugares, o que seria horrível para a manutenção. Ou, podemos isolar a chamada da view com os dados em um método de outra Classe e reutilizar esse comportamento em todos os lugares, o que garantiria que qualquer alteração necessária nesse comportamento em específico seria feita em um lugar apenas =)

Espero ter ajudado.

Abraço!

Concordo com tudo, André. Realmente pensei nesse problema de escalabilidade nessa injeção de dados, e o que mais me preocupa é a questão da manutenção futura deste item. Concordo que desse jeito eu controlo o que está sendo injetado na view. O que me incomoda mesmo é o CTRL + C em metade da aplicação. Vou tentar aplicar a sua ideia de isolar a chamada da view Header.

Obrigado!