2013-06-21 4 views
2

У меня есть опыт работы с php, но я только недавно начал изучать Codeigniter. Раньше у меня был сайт с фиксированной навигационной панелью и боковой панелью, но основной раздел сайта загружался динамически на основе переменной Get. Это было в основномКак структурировать динамический сайт с помощью Codeigniter

include head.php 
include navbar.php 
include sidebar.php 
include the page requested from the get variable (home, about, contact, etc.) 
include footer.php 

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

Не могу понять, как это сделать с помощью Codeiginiter. Должен ли я использовать контроллер для каждой страницы или одного контроллера с функцией для каждой страницы? Кто-нибудь знает хороший учебник, который делает что-то подобное? Все обучающие программы, которые я видел, перезагружают весь сайт для каждой страницы.

Edit: По сути я хочу сделать this но с Codeigniter

ответ

4

Так это выглядит, как вы хотите относительно статического контента, но загружаются динамически вы может работать с одним контроллером и (возможно) одним способом в контроллере.

Чтобы сделать это с одним методом, сделать это в контроллере welcome:

public page($page_id){ 
    // views/header.php 
    $this->load->view("header"); 


    if($page_id = "about"){ 
     $this->load->view("about");  // views/about.php 
    } 

    else if($page_id = "contact"){ 
     $this->load->view("contact"); // views/contact.php 
    } 

    // views/footer.php 
    $this->load->view("footer"); 
} 

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

Таким образом www.yoursite.com/page/about загрузит о странице www.yoursite.com/page/contact загрузит contact страницу

Теперь, если вы хотите избавиться от /page части, что вам нужно сделать некоторые URL перенаправления в application/config/routes.php

В качестве альтернативы вы можете использовать несколько методов в одном контроллере:

public about(){ 
    // views/header.php 
    $this->load->view("header"); 

    $this->load->view("about"); 

    // views/footer.php 
    $this->load->view("footer"); 
} 


public contact(){ 
    // views/header.php 
    $this->load->view("header"); 

    $this->load->view("contact"); 

    // views/footer.php 
    $this->load->view("footer"); 
} 

Теперь ваши URL-адрес выглядят лучше без маршрутизации, но вы должны загрузить заголовок/стопу для каждой страницы.

1

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

, например, в вашей точки зрения NavBar у вас имеется Контакты кнопку в вашем меню будет выглядеть следующим образом:

<a href='contacts'>Contacts</a>

В контроллере:

public function contacts() 
{ 
    $this->load->view('header'); 
    $this->load->view('navbar'); 
    $this->load->view('sidebar'); 
    $this->load->view('contacts_view'); 
    $this->load->view('footer'); 
} 

Так мы предполагаем, что у вас уже есть следующие представления, которые готовы к загрузке ( header.php, navbar.php, sidebar.php, contacts_view.php, footer.php).

UPDATE: вам не нужно иметь $_GET[] запрос, просто предоставить имя метода из контроллера в <a> якорный тег

1

Вы действительно хотите скопировать/вставить много $ this-> load-> view() в любую функцию контроллера? Это код спагетти. Вы можете попробовать следующее: например, у нас есть контроллер main.php в качестве контроллера по умолчанию. Этот главный контроллер содержит основную функцию:

public function index() 
    { 
     ob_start(); 
     $this->load->model('mainmodel'); 
     $data = $this->mainmodel->_build_blocks(); //return array with needed blocks (header, menu, content, footer) in correct order 
     foreach ($data->result_array() as $row) { 
      $this->load->module($row['block_name']); 
      $this->name = new $row['block_name']; 
      $this->name->index(); 
     }    
     ob_end_flush(); 
    } 

Таким образом, друг с другом контроллер также иметь функцию (индекс), который может направить действия в зависимости от сегментов URL-адрес, и т.д. подготовки PARAMS

нижнего колонтитула контроллера в качестве примера (я использую Smarty в качестве шаблона двигателя):

public function index() 
    { 
       $this->mysmarty->assign('year', date("Y")); 
       $this->mysmarty->view('footer'); 
       return true; 
    } 

контроллер контента будет иметь:

public function index() 
    { 
     $name = $this->uri->segment(1, 'index'); 
     $act = $this->uri->segment(2, 'index'); 
     $this->load->module($name); 
     $this->name = new $name; 
     $pageData = $this->name->_show($act); 
     if ($pageData) 
     { 
      $this->mysmarty->assign($name, $pageData); 
     } 
     $this->mysmarty->view($name); 
    } 

То значит, что если вы хотите, чтобы показать http://site.name/page/contactus, мы делаем следующий:

1) main.php начать цикл, необходимых блоков

2) во-первых, мы показываем header.tpl контроллером заголовка

3), то мы покажем меню

4) Затем мы вызываем контроллер контента, который анализирует URL-адрес, обнаруживает, что он должен вызывать функцию _show() в контроллере страницы, и передать ему действие = 'contactus'. _show() функция может содержать некоторый ключ/конструкцию корпуса, которые показывают шаблоны зависит от названия действия (contactus.tpl в данном случае)

5) в конце концов, мы показываем шаблон колонтитула

В таком случае мы имеем гибкую структуру , Все контроллеры должны иметь функции index(), и все контроллеры, которые могут быть вызваны в контенте, должны иметь функцию _show ($ act). Это все.

0

в CodeIgniter я с помощью шаблона

первый файл шаблона делают в одной папке с header.php, navbar.php и т.д.

пример: template.php

<?php 
echo $this->load->view('header'); //load header 
echo $this->load->view('navbar');//load navbar 
echo $this->load->view('sidebar');//load sidebar 
echo $this->load->view($body); //load dynamic content 
echo $this->load->view('footer');//load footer 
?> 

второй контроллер

function index(){ 
$data['body'] = 'home'; // cal your content 
$this->load->view('template', $data); 
}