Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Вы могли также попробовать его, этот путь - определяет шаблон представления по умолчанию, который затем вытягивает в на основе содержимого на переменную ('содержание' в моем примере) переданный контроллером.
В Вашем контроллере:
$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. Как я встраиваю представления в рамках представлений? Вложенные шаблоны?...)
На самом деле, после исследования этого вполне немного самостоятельно, я пришел к выводу, что лучшая практика для включения заголовков и нижних колонтитулов в 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
Я думаю первый способ, которым Вы делаете, это более чисто. Просто с точки зрения знания, которое будет представленным. Вместо того, чтобы иметь необходимость ввести файл представления для нахождения остальных.
Это - плохая практика для вызова представлений в других представлениях. Это могло быть формой смешивания представления контроллера. Функция представления в 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