Согласованная тема и контент в CodeIgniter - PullRequest
4 голосов
/ 23 января 2011

Я работаю над базовым веб-сайтом, использующим CodeIgniter, чтобы лучше понять структуру и улучшить мои ограниченные в настоящее время навыки веб-разработки. Я искал и читал довольно много документации, но не нашел именно то, что я ищу (или, по крайней мере, я так не думаю).

Мой сайт будет иметь последовательный заголовок, навигацию и нижний колонтитул. По сути, единственный контент, который изменится через subnav, - это некоторый текст и / или изображения между верхним и нижним колонтитулом. Это довольно типично для простого сайта, но я пытаюсь выяснить, как подходить к этому в контексте представлений / контроллеров.

Из моего понимания в этом сценарии вы хотите создать папку "theme" в представлениях, которая содержит "основное" представление, которое загружается с каждой страницей. У меня также сложилось впечатление, что с возможностью загрузки нескольких представлений в одном контроллере мне действительно нужен только один «домашний» контроллер, который загружает «основное» представление вместе с любым представлением, связанным с навигацией. Так, например, Nav: Home | О | контакт. Я нажимаю «О программе» и через соответствующий метод домашнего контроллера загружаю основной + о просмотрах.

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

Я не обязательно ищу пошаговое руководство, но, скорее, принятый или наиболее распространенный подход. Очень признателен, и я заранее прошу прощения, если это смотрело мне в лицо 2 сообщения вниз.

Спасибо -Джей

Ответы [ 4 ]

1 голос
/ 23 января 2011

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

Шаблон

0 голосов
/ 23 января 2011

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

  • show($tab, $body, $data) - отображение вида с использованием частей заголовка / тела / боковой панели / нижнего колонтитула. Боковая панель и тело извлекаются из текущей папки $tab.
  • _print($tab, $body, $data) - вариант show(); для печати (настраивает CSS, удаляет части, не нужные для печати). Это можно сделать только с помощью CSS, но у меня были клиенты, которым для печати требовался специальный серверный режим mojo.
  • widget($type, $id) - отправить чанк представления (обычно для js / Ajax)
  • api($type, $template) - отправлять данные API по типу (JSON, XML и т. Д.).

Этот подход хорошо работал для ряда крупных проектов, но есть и другие способы. Например, вилка CodeIgniter Kohana инвертирует шаблон и размещает логику компоновки страницы в templates . Эти шаблоны выполняют функцию базового контроллера более естественным образом, поэтому вместо нескольких функций контроллера для разных типов страниц вы используете разные шаблоны. Результатом является набор файлов вида, таких как:

  • app/main-template.php
  • app/login-template.php
  • app/print-template.php
  • app/reports/wide-template.php
  • widgets/control-template.php
  • api/soap-template.php
  • и т. Д.

Подход Кохана также может быть применен к CodeIgniter и более распространен в других средах (таких как Rails, Cake, Zend и т. Д.).

0 голосов
/ 23 января 2011

Итак, вы хотите убедиться, что вы понимаете маршруты, чтобы убедиться, что все отображается на первый сегмент вашего URL, поскольку вам действительно нужен только один контроллер.Это находится в папке application / config в файле с именем rout.php

. Вы можете настроить его следующим образом:

$route['(:any)'] = "home/$1";
$route['default_controller'] = "home";

, чтобы оно совпадало с любым (: любым) впервый сегмент и направляет его к home / $ 1 (контроллер / функция) ... и затем, если в первом сегменте ничего нет, он сопоставляет его с home / (подразумевается индексная функция).Посмотрите документацию для файла маршрутов, чтобы вы могли понять, что все, что вы можете с ним сделать (вы можете запускать регулярные выражения, расширенную маршрутизацию и т. Д.), Очень важно знать.

Таким образомв вашем контроллере home.php (controllers / home.php или как вы хотите его называть) вы можете просто иметь функции, которые соответствуют вашему URL-адресу

То, что упоминается в других постах о расширении базового контроллера,действительно не нужно в этом случае.Но хорошо иметь функцию, которая просматривает загрузку для вас, чтобы вам не приходилось повторять $this->load->view(header), $this->load->view(footer) и т. Д. Для каждой функции.

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

 function _viewloader($view, $data) {
         $this->load->view('includes/header', $data);
      $this->load->view($view, $data);
         $this->load->view('includes/footer', $data); 
 }

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

 function about()
 {
  /* put any application logic here */
  $this->viewloader('about', $data);
        /* or $this->_viewloader('about', $data); 
           if you went with CI's style visibility */
 }

 function contact()
 {
  /* put any application logic here */
  $this->viewloader('contact', $data);
        /* or $this->_viewloader('contact', $data); 
           if you went with CI's style visibility */
 }

Так что теперь, как вы можете видеть, эта функция viewloaderтеперь загружает представления заголовка, nav, независимо от того, что является $ view, а затем нижний колонтитул все сразу ... довольно приятно.

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

Вот как это может выглядеть в конце:

<?php 
if (! defined('BASEPATH')) exit('No direct script access');

class home extends CI_Controller {

 //php 5 constructor
 function __construct() {
  parent::__construct();
 }

 function index() {
  $data['title'] = "Welcome To Our Site"  
  $this->viewloader('home', $data);
 }

 function contact() {
  $data['title'] = "Contact Us"
  $this->viewloader('contact', $data);
 }
 function about() {
  $data['title'] = "About Us"
  $this->viewloader('about', $data);
 }

 private function viewloader($view, $data) {
  $this->load->view('includes/header', $data);
  $this->load->view('includes/nav', $data);
  $this->load->view($view, $data);
  $this->load->view('includes/footer', $data);
 }

}
0 голосов
/ 23 января 2011

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

class base_controller {

    function assemble_display() {
        $this->display_view('head');
        $this->display_main_content();
        $this->display_view('foot');
    }

    function display_main_content() {
        $this->display_view('home');
    }

}

Затем в последующих контроллерах, расширяющих этот базовый класс, я перезаписываю метод display_main_content ().

class search extends base_controller {

        function display_main_content() {
            $this->display_view('search');
        }

}

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

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