2010-04-08 5 views
0

Предположим, что у меня есть веб-сайт, на котором есть 100 разных страниц. На каждой странице используется общий верхний и нижний колонтитулы. Внутри заголовка находится динамический контент, который поступает из базы данных.Общие шаблоны Codeigniter

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

function index() 
{ 
    // It sucks to have to include this on every controller action. 
    data['title'] = "This is the index page"; 
    data['currentUserName'] = "John Smith"; 

    $this->load->view("main_view", data); 
} 

function comments() 
{ 
    // It sucks to have to include this on every controller action. 
    data['title'] = "Comment list"; 
    data['currentUserName'] = "John Smith"; 

    $this->load->view("comment_view", data); 
} 

Я понимаю, что я мог бы реорганизовать код так, что общие части находятся в одной функции, а функция вызывается действием. Это уменьшит НЕКОТОРЫЕ боли, но это все еще не кажется правильным, так как я все равно должен каждый раз звонить в эту функцию.

Каков правильный способ справиться с этим?

ответ

0

У меня была аналогичная ситуация. Я создал папку «includes», и там помещен файл с повторяющимся кодом из моих контроллеров. Затем в контроллерах только include('/path/to/includeFile.php');

Не знаю, является ли это «правильным» способом, но он работает хорошо для меня.

+0

NO. Это плохо. Не следует за MVC и, как правило, является плохой практикой. –

1

Один из способов сделать это - расширить класс контроллера по умолчанию. Вы можете прочитать о расширении классов с помощью MY_Controller в user guide. Внутри этого расширенного класса вы можете включить то, что вы всегда хотели сделать, как вынести шаблон заголовка страницы до основного контента, или разрешить пользователям доступ и т.д.

class MY_Controller extends Controller { 

    function __construct() 
    { 
     parent::Controller(); 
     //code to always do goes here 
     echo 'Always print this comment'; 
     $this->load->view('partials/template_start'); 
    } 
} 

Тогда вы можете иметь ваш обычный класс контроллер продлить ЭТА класс с помощью

class MyControllerNameHere extends MY_Controller { 
    function __construct() 
    { 
     //setup here 
    } 
    function index() 
    { 
     echo 'Only print this bit when this method is called'; 
     $this->load->view('partials/MYPAGENAMEHERE'); 
    } 
} 

есть другие способы сделать это, я использую смесь выше и William's Concepts Codeigniter Template library. Сделайте немного поиска - для вас есть несколько решений.

1

Я также использовал библиотеку шаблонов, на который ссылается выше - http://www.williamsconcepts.com/ci/codeigniter/libraries/template/

Это еще одна библиотека шаблонов, которая вышла совсем недавно - http://philsturgeon.co.uk/code/codeigniter-template

Я не смотрел на различия между двумя очень, но я знаю, что люди, которые их создали, являются сильными вкладчиками в сообщество Codeigniter.

Смежные вопросы