Лучшие практики: каков лучший способ для построения заголовков и нижних колонтитулов?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

18
задан tereško 9 February 2013 в 01:17
поделиться

4 ответа

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

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

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

// more code...

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

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

// doctype, header html etc.

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

// footer html etc.

Затем, Ваши представления могут просто содержать чистое содержание, например, views/your_controller/index.php мог бы содержать просто переменные, переданные от контроллера / массив данных

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

[еще 113] детали о wiki/FAQ CI - (Q. Как я встраиваю представления в рамках представлений? Вложенные шаблоны?...)

10
ответ дан 30 November 2019 в 08:04
поделиться

На самом деле, после исследования этого вполне немного самостоятельно, я пришел к выводу, что лучшая практика для включения заголовков и нижних колонтитулов в 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);
    }
}

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

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

Приятного отдыха!

/Jens Roland

13
ответ дан 30 November 2019 в 08:04
поделиться

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

4
ответ дан 30 November 2019 в 08:04
поделиться

Это - плохая практика для вызова представлений в других представлениях. Это могло быть формой смешивания представления контроллера. Функция представления в 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
3
ответ дан 30 November 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: