#php #codeigniter #codeigniter-2
#php #codeigniter #codeigniter-2
Вопрос:
У меня есть следующий код в контроллере:
<?php
class Student extends CI_Controller
{
function index()
{
$data = $this->init->set();
$this->parser->parse('include/header', $data);
$this->parser->parse('student/student_index', $data);
$this->parser->parse('include/footer', $data);
}
function planner()
{
$data = $this->init->set();
$this->parser->parse('include/header', $data);
$this->parser->parse('student/student_cal', $data);
$this->parser->parse('include/footer', $data);
}
}
?>
Как вы можете видеть, здесь много повторений. В основном все это. Я уже поместил свои переменные в модель, поэтому мне нужно только каждый раз вызывать функцию model вместо того, чтобы помещать весь массив $ data в начало каждой функции. В любом случае, я попытался уменьшить повторяемость здесь, выполнив следующее:
<?php
class Student extends CI_Controller
{
function index()
{
$data = $this->init->set();
$this->parser->parse('include/header', $data);
switch($this->uri->segment(2))
{
case '': $this->home($data); break;
case 'planner': $this->planner($data); break;
}
$this->parser->parse('include/footer', $data);
}
function home($data)
{
$this->parser->parse('student/student_index', $data);
}
function planner($data)
{
$this->parser->parse('student/student_cal', $data);
}
}
?>
Это, так или иначе, отлично работает для моей домашней страницы. Он анализирует переменные, и никаких проблем вообще нет. Однако на странице «планировщик» я получаю ошибки:
Сообщение: Отсутствует аргумент 1 для Student::planner()
Сообщение: Неопределенная переменная: данные
Сообщение: Неверный аргумент, предоставленный для foreach()
Я совершенно уверен, что получаю эти ошибки, потому что функция каким-то образом не получает $data
массив. Я также прочитал в документах CI, что третий сегмент в URL передается в качестве аргумента, и в этом случае третий сегмент не существует, поэтому ничего не передается. Однако в документах CI не указано, как я могу передать свой $data
массив из index()
функции в свою planner()
функцию. Мне также интересно, почему функция home работает нормально, без ошибок.
Ответ №1:
Я не вижу смысла в таком рефакторинге, если из-за него на код будет действительно трудно смотреть. Я не совсем уверен, что делает функция parse, поэтому я изменил ее так, чтобы фактически передавать параметр в виде строки, но предпочтительно я бы загрузил содержимое в буфер и передал его таким образом. Но вот несколько более чистых и, надеюсь, удобочитаемых способов устранения дублирования… и, надеюсь, это сработает :).
class Student extends CI_Controller
{
private function load_student_page($content){
$data = $this->init->set();
$this->parser->parse('include/header', $data);
$this->parser->parse($content, $data);
$this->parser->parse('include/footer', $data);
}
function index()
{
$this->load_student_page('student/student_index');
}
function planner()
{
$this->load_student_page('student/student_cal');
}
}
Ответ №2:
Как вы сказали, CodeIgniter пытается передать третий сегмент в качестве параметра, но он не существует.
Возможно, вам потребуется использовать функцию «_remap«.
class Student extends CI_Controller {
public function _remap($method, $parameters)
{
$data = $this->init->set();
$this->parser->parse('include/header', $data);
switch($this->uri->segment(2))
{
case '': $this->home($data); break;
case 'planner': $this->planner($data); break;
}
$this->parser->parse('include/footer', $data);
}
}
Комментарии:
1. Хм, я пробовал это, но у меня не получилось заставить это работать. Думаю, я разберусь с этим позже; вроде как потерял некоторое время, пытаясь найти это другое «решение» здесь. Ранее я изучал функцию _remap, но на самом деле она не делала того, что я хотел. Возможно, я использовал это неправильно! 🙂 Я взгляну на это еще раз и, возможно, поищу некоторые шаблоны.. Думаю, я действительно не понимаю этот фреймворк : (