Melhores Práticas: Qual é a melhor maneira para a construção de cabeçalhos e rodapés?
-
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.
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