Лучшие практики: как лучше всего создать верхние и нижние колонтитулы? - PullRequest
18 голосов
/ 07 октября 2008

Каков наилучший способ построения верхних и нижних колонтитулов? Стоит ли все это вызывать из контроллера или включать из файла просмотра? Я использую CodeIgniter и хочу знать, что лучше для этого делать. Загрузка всех включенных файлов представления из контроллера, как это?

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');
   }

}

или вызов файла с одним представлением и вызов оттуда представлений верхнего и нижнего колонтитула:

//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'); ?>

Я видел, как это было сделано в обоих направлениях, но сейчас хочу выбрать, прежде чем идти слишком далеко по пути.

Ответы [ 4 ]

13 голосов
/ 24 января 2009

На самом деле, после тщательного изучения этого вопроса, я пришел к выводу, что наилучшей практикой для включения верхних и нижних колонтитулов в MVC является третий вариант, а именно расширение базового контроллера. Это даст вам немного больше гибкости по сравнению с предложением htxt, особенно если вы создаете очень модульный макет (не только верхний и нижний колонтитулы, а также боковые панели, нестатические меню и т. Д.).

Сначала определите класс Base_controller, в котором вы создаете методы, которые добавляют элементы вашей страницы (верхний и нижний колонтитулы и т. Д.) К выходной строке:

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;
    }
}

Затем в контроллерах вашей страницы просто расширьте базовый класс и вызовите свои функции для построения страницы.

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);
    }
}

Используя базовый контроллер, вы можете добиться очень чистого кода в ваших отдельных контроллерах страницы и иметь отдельные представления для элементов на странице (что позволяет повторно использовать код как в представлениях, так и в контроллерах). Все, что вам нужно сделать, это определить общие разделы страницы (то, что вы могли бы назвать «фрагментами») как функции вашего базового контроллера.

И если базовый контроллер должен начать бесконтрольно расти (что может происходить на больших сайтах), вы можете изменить некоторые из его менее общих функций, поместив их в подклассы, и позволить соответствующим контроллерам страниц расширять их вместо оригинальных базовый контроллер.

Наслаждайтесь!

/ Дженс Роланд

10 голосов
/ 07 октября 2008

Вы также можете попробовать это следующим образом - определить шаблон представления по умолчанию, который затем извлекает контент на основе переменной (в моем примере - «контент»), передаваемой контроллером.

В вашем контроллере:

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

// more code...

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

Затем определите макет по умолчанию для всех страниц, например. просмотров / макеты / default.php

// doctype, header html etc.

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

// footer html etc.

Тогда ваши представления могут содержать только чистый контент, например Представления / ваш_контроллер / index.php могут содержать только переменные, переданные из массива контроллера / данных

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

Подробнее о вики / FAQ по CI - (В. Как мне встроить представления в представления? Вложенные шаблоны? ...)

4 голосов
/ 07 октября 2008

Я думаю, что первый способ сделать это чище. Просто с точки зрения знания того, что будет оказано. Вместо того, чтобы вводить файл представления, чтобы найти остальное.

3 голосов
/ 07 октября 2008

Это плохая практика - называть представления внутри других представлений. Это может быть формой микширования представления контроллера. Функция представления в CI позволяет вам передавать третий параметр, который заставляет его возвращать вывод представлений в виде строки. Вы можете использовать это для создания составного представления.

Например:

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; ?>

Возможно, вы захотите объединить ваш верхний и нижний колонтитулы, чтобы создать такой шаблон.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...