Melhores Práticas: Qual é a melhor maneira para a construção de cabeçalhos e rodapés?

StackOverflow https://stackoverflow.com/questions/176856

  •  05-07-2019
  •  | 
  •  

Pergunta

Qual é a melhor forma para construir cabeçalhos e rodapés? Se você chamá-lo de tudo a partir do controlador, ou incluir a partir do arquivo de visão? Estou usando CodeIgniter, e eu estou querendo saber qual é a melhor prática para isso. Carregar todos os arquivos de visão incluídos a partir do controlador, como este?

class Page extends Controller {

   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('header');
      $this->load->view('menu');
      $this->load->view('content', $data);
      $this->load->view('footer');
   }

}

ou chamando o único arquivo de vista, e chamando os pontos de vista de cabeçalho e rodapé de lá:

//controller file    
class Page extends Controller {

   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('content', $data);

   }

}

//view file

<?php $this->load->view('header'); ?>

<p>The data from the controller</p>

<?php $this->load->view('footer'); ?>

Eu já vi isso feito em ambos os sentidos, mas quer escolher agora antes de eu ir longe demais por um caminho.

Foi útil?

Solução

Você também pode tentar desta forma - definir um modelo de exibição padrão, que, em seguida, puxa o conteúdo com base em uma variável ( 'conteúdo' no meu exemplo) passaram pelo controlador.

Em seu controlador:

$data['content'] = 'your_controller/index';

// more code...

$this->load->vars($data);
$this->load->view('layouts/default');

Em seguida, defina um layout padrão para todas as páginas, por exemplo views / layouts / default.php

// doctype, header html etc.

<div id="content">
    <?= $this->load->view($content) ?>
</div>

// footer html etc.

Em seguida, seus pontos de vista pode apenas conter o conteúdo puro por exemplo views / your_controller / index.php pode conter apenas as variáveis ??passadas a partir da matriz controller / dados

<?= $archives_table ?>
<?= $pagination ?>
// etc.

Mais detalhes sobre o CI wiki / FAQ - (P. Como faço para incorporar pontos de vista dentro vista ? Os modelos aninhados? ...)

Outras dicas

Na verdade, depois de pesquisar isso um pouco eu mesmo, cheguei à conclusão de que a melhor prática para a inclusão de cabeçalhos e rodapés em MVC é uma terceira opção - ou seja, estendendo um controlador de base. Isso lhe dará um pouco mais de flexibilidade do que a sugestão de htxt, especialmente se você está construindo um layout muito modular (não apenas cabeçalho e rodapé, também painéis da barra lateral, menus não-estáticos, etc.).

Em primeiro lugar, definir uma classe Base_controller, no qual você cria métodos que anexar os elementos da página (cabeçalho, rodapé, etc.) a uma cadeia de saída:

class Base_controller extends Controller
{
    var $_output = '';

    function _standard_header($data=null)
    {
        if (empty($data))
            $data = ...; // set default data for standard header here

        $this->_output .= $this->load->view('header', $data, true);
    }

    function _admin_header($data=null)
    {
        if (empty($data))
            $data = ...; // set default data for expanded header here

        $this->_output .= $this->load->view('admin_header', $data, true);
    }

    function _standard_page($data)
    {
        $this->_standard_header();
        $this->_output .=
            $this->load->view('standard_content', $data, true);
        echo $this->_output; // note: place the echo statement in a
                             // separate function for added flexibility
    }

    function _page_with_admin_header($data)
    {
        $this->_admin_header($data);
        $this->_output .=
            $this->load->view('standard_content', $data, true);
        echo $this->_output;
    }
}

Então, em seus controladores de página, simplesmente estender a classe base e chamar as funções para criar a página.

class Page_controller extends Base_controller
{
    function index()
    {
        $data = ...; // Set content data here
        $this->_standard_page($data);
    }

    function admin()
    {
        $data = ...; // Set content and header data here
        $this->_page_with_admin_header($data);
    }
}

Usando um controlador de base, você pode conseguir código muito limpo em seus controladores de página individuais e têm vistas separadas para elementos na página (permitindo a reutilização de código em ambos os pontos de vista e os controladores). Tudo que você precisa fazer é definir os seus 'seções' página comum (o que você pode ser tentado a chamar 'fragmentos') como funções no seu controlador de base.

E se o controlador de base deve começar a crescer de forma incontrolável (que pode acontecer em grandes sites), você pode reorganizar algumas de suas funções menos gerais, colocando-os em subclasses, e deixar que os controladores de página correspondente estender aqueles em vez do original controlador de base.

Aproveite!

/ Jens Roland

Eu acho que a primeira maneira que você está fazendo é mais limpo. Simplesmente de um ponto de vista de saber que vai ser processado. Ao invés de ter de introduzir o arquivo de exibição para encontrar o resto.

É má prática para vistas de chamadas dentro de outros pontos de vista. Esta poderia ser uma forma de visualização controlador de mistura. A função de visualização em CI permite que você passe um terceiro parâmetro que faz com que ele retorne que a saída vista como uma string. Você pode usar isso para criar uma visão composto.

Por exemplo:

class Page extends Controller {
   function index() {
      $data['page_title'] = 'Your title';

      $this->load->view('default_layout', array(
         'header'  => $this->load->view('header' , array(), true), 
         'menu'    => $this->load->view('menu'   , array(), true), 
         'content' => $this->load->view('content', $data  , true), 
         'footer'  => $this->load->view('footer' , array(), true), 
      ));
   }
}

default_layout.php

<? echo $header, $menu, $content, $footer; ?>

Você pode querer combinar seu cabeçalho e rodapé para fazer um modelo como este.

class Page extends Controller {
   function index() {
      $data['page_title'] = 'Your title';

      $this->load->view('default_template', array(
         'menu'    => $this->load->view('menu'   , array(), true), 
         'content' => $this->load->view('content', $data  , true), 
      ));
   }
}

default_template.php

<html><head></head><body><span>Some Header HTML</span> // this is your header html
<? echo $menu, $content; ?>
<span>some footer HTML</span></body></html>  // this is your footer html
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top