CodeIgniter - повторение кода и передача переменных в функции - PullRequest
3 голосов
/ 11 апреля 2011

У меня есть следующий код в контроллере:

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

}
?>

Как видите, здесь много повторений.В основном все это.Я уже поместил свои переменные в модель, поэтому мне нужно каждый раз вызывать функцию модели вместо того, чтобы помещать весь массив $ 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 ()

Сообщение: неопределенная переменная: data

Сообщение: указан неверный аргумент для foreach ()

Я совершенно уверен, что получаю эти ошибки, потому что функция почему-то не получает массив $data.Я также читал в документации по CI, что третий сегмент в URL передается в качестве аргумента, и в этом случае третий сегмент не существует, поэтому ничего не передается.Тем не менее, документы CI не сказали мне, как я мог передать свой массив $data из функции index() в мою функцию planner().Мне также интересно , почему функция home работает нормально, без ошибок.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2011

Теперь, я не вижу причины для такого рефакторинга, если он сделает код действительно трудным для просмотра.Я не совсем уверен, что делает функция синтаксического анализа, поэтому я изменил ее так, чтобы фактически передать параметр в виде строки, но предпочтительно, чтобы я загружал содержимое в буфер и передавал его таким образом.Но вот несколько более чистых и, надеюсь, читаемых съемных дубликатов ... и, надеюсь, это работает:).



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 голосов
/ 11 апреля 2011

Как вы сказали, 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);
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...