Это хороший способ использовать контроллеры и представления в CodeIgniter?

Как лучше всего использовать контроллеры/представления в CodeIgniter?

Является ли следующий плохой способ создания моих страниц?

function index()
{
    $this->load->library('carabiner');      
    $this->load->view('include/head');
    $this->load->view('include/home');
    $this->load->view('top');
    $this->load->view('featured');
    $this->load->view('eventslist');
    $this->load->view('footer');    
}

function create()
{
    $this->load->view('include/head');
    $this->load->view('top');
    $this->load->view('page');
    $this->load->view('dynamicstuff');
    $this->load->view('footer');
}

Я использую квази-шаблоны таким образом, и он отлично работает для получения схемы сайта, но лучший ли это способ создать приложение? Я работаю в CodeIgniter уже около недели, и я новичок в PHP.


person Kevin Brown    schedule 23.07.2009    source источник


Ответы (4)


Существует загрузка под названием CodeIgniter Library, которая делает все это очень простым. Как только вы научитесь его реализовывать, кодирование станет очень простым. Это также позволяет вам изменять каждую страницу или контроллер, чтобы иметь разные шаблоны (макеты).

Используя систему, о которой я упоминал выше, вы можете сделать следующее:

<?php

    function index() {

        $data['some_variable'] = 'some data';

        $this->template->write_view('content', 'page/home', $data);
        $this->template->render();

    }

?>

В любом месте вы также можете изменить шаблон, который хотите использовать:

<?php

    $this->template->set_template('login');

?>

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

Сам файл шаблона будет выглядеть примерно так:

<html>
.... etc. all other html elements
    <body>
        header html goes here

        <?=$content?>

        footer html goes here
    </body>
</html>

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

<?php

    function index() {

        $data['header'] = 'header info';
        $data['content'] = 'content info';
        $data['sidebar'] = 'sidebar info';
        $data['footer'] = 'footer info';

        $this->template->write_view('content', 'page/home', $data);
        $this->template->write_view('header', 'modules/header');
        $this->template->write_view('sidebar', 'modules/sidebar');
        $this->template->write_view('footer', 'modules/footer');

        $this->template->render();

    }

?>

Код HTML-шаблона:

<html>
.... etc. all other html elements
    <body>
        <div id="header">
            <?=$header?>
        </div>

        <div id="content">
            <div id="left">
                <?=$content?>
            </div>

            <div id="sidebar">
                <?=$sidebar?>
            </div>
        </div>

        <div id="footer">
            <?=$footer?>
        </div>
    </body>
</html>

Таким образом, вам нужно беспокоиться только о включении одного файла во все ваши функции контроллера. Если вы не используете PHP 5 (вы должны переключиться), то вместо использования <?=$content?> вы захотите использовать <?php echo $content; ?>.

person cointilt    schedule 23.07.2009

Я бы загрузил только одно представление для каждой функции:

function index()
{
        $this->load->library('carabiner');              
        $this->load->view('index');
}

function create()
{
        $this->load->view('create');
}

Затем включите другие файлы шаблонов, например. для index.php:

<?php 
    include 'include/head';
    include 'include/home';
    include 'top';
    include 'featured';
    include 'eventslist';
    include 'footer';
?>

Конечно, вы можете сгруппировать сами эти представления, а затем включить одно представление, которое само включает заголовок, навигацию и т. д.

person Residuum    schedule 23.07.2009
comment
Производительность сайта? Я так не думаю. Производительность программирования? Определенно, так как у вас будет разделение контроллеров и представлений и - при правильном выполнении - между макетом и контентом. - person Residuum; 24.07.2009
comment
Да, это хорошая модель. Ваш контроллер не должен знать все о верхних и нижних колонтитулах, а также о том, что рекомендуемая вещь идет впереди списка событий в разметке. Это вся работа представления. - person GloryFish; 24.07.2009
comment
Ах, это полезно. Я учусь менять то, как я думаю об этих вещах - я полностью самоучка... так что шаблоны мышления HTML совсем не следуют этому материалу. :) - person Kevin Brown; 24.07.2009

Во всех моих контроллерах я храню массив, который я называю $page_data. Здесь содержится все, что мне нужно передать моему представлению: заголовок страницы, ресурсы (js/css) для загрузки, метаописание и контент.

Это выглядит примерно так:

 function index(){
   $page_data['title'        ] = 'My Page Title';
   $page_data['description'  ] = 'All about my great page.';
   $page_data['content_file' ] = 'pages/index';
   $page_data['content_data']['books'] = $this->Books_model->get_books();
   $this->load->view('page-template', $page_data);
 }

Затем в представлениях у меня есть «page-template.php», «header.php», «nav.php», «footer.php» и «pages/index.php». Все будет базовым HTML/PHP, а page-template.php будет выглядеть примерно так:

...
<title><?php echo $title ; ?></title>
....
<body>
  <?php $this->load->view('header'); ?>
  <?php $this->load->view('nav'); ?>
  <?php $this->load->view( $content_file, $content_data ); ?>
  <?php $this->load->view( 'footer'); ?>
</body>

Следуя тому же шаблону, вам может быть удобно иметь файл «partial-template.php» или, возможно, «json-template.php» для страниц канала ajax/data.

Эта модель оказывается очень гибкой по мере роста ваших сайтов.

person rooskie    schedule 24.07.2009

Мое решение.

function index() 
{
   $data['main'] = 'content_view';

   $this->load->vars($data);
   $this->load->view('template');
}

Затем... template.php

<html>
<body>
<div class="header">.... blah...</div>
<div class="main"><?php $this->load->view($main); ?></div>
<div class="footer">.... (c)2009, etc.</div>

Я никогда не видел причин для того, чтобы не учитывать представление верхнего и нижнего колонтитула.

person Zack    schedule 26.07.2009
comment
Я убираю их, потому что области выше и ниже основного контента иногда будут меняться за пределами индекса. - person Kevin Brown; 27.07.2009
comment
Верно... Вот почему вы загружаете главное представление... Я просто спрашиваю, сколько раз "заголовок" отличается на разных страницах? Тогда это уже не заголовок, а часть содержимого этой страницы. - person Zack; 27.07.2009