• Главная
  • Карта сайта
Не найдено

Підтримка тим в CodeIgniter

Практично всі сучасні CMS мають підтримку тем. Тобто ви можете створити кілька варіантів оформлення ресурсу і перемикатися між ними. У цій статті мова піде про те, як додати підтримку тим до фреймворку CodeIgniter .

Примітка. Якщо ви не знайомі з цим фреймворком, то спочатку вам варто почитати статтю « Як створити свій сайт на PHP? Або навіщо потрібні фреймворки? ».

Перш за все, сформулюємо завдання:

1) контролер повинен залишатися незмінним при використанні будь-якої з тим;

2) файли тим повинні знаходиться в окремих папках;

3) мінімальне навантаження на систему (тобто шаблонизатор і додаткові бібліотеки не використовуємо).

В принципі, підтримка тим споконвічно закладена в CodeIgniter. Якщо дотримуватися архітектури MVC, то весь код, пов'язаний з відображенням сторінок, буде знаходитися в уявленнях, а робота з даними та опрацювання запитів користувача - в моделях і контролері.

Звідси випливає найпростіший варіант вирішення завдання. Якщо в папці view створити кілька вкладених папок (theme1, theme2, ...) і розмістити в них уявлення, то нам залишиться тільки управляти їх завантаженням з контролера.

Розглянемо конкретний приклад.

Припустимо, у нас є 4 подання: header.php, content.php, sidebar.php і footer.php. Крім того, кожна тема повинна мати свою таблицю стилів styles.css.

Папка view містить дві теми (default і classic) і має таку структуру:

view / default / header.php content.php sidebar.php footer.php styles.css classic / header.php content.php sidebar.php footer.php styles.css

Тепер ми повинні вказати фреймворку, яку тему використовувати. Ці настройки можна зберігати або в конфігураційних файлах, або в базі даних. Припустимо, ми вирішили використовувати перший варіант.

Створюємо файл application / config / themes.php, і зберігаємо в ньому назву обраної теми.

<? Php if (! Defined ( 'BASEPATH')) exit ( 'No direct script access allowed'); $ Config [ 'current_theme'] = 'classic'; ?>

Тепер розглянемо контролер:

class Main extends Controller {private $ curTheme = 'default'; function Main () {parent :: Controller (); $ This-> load-> helper ( 'html'); $ This-> config-> load ( 'themes'); $ This-> curTheme = $ this-> config-> item ( 'current_theme'); } Function index () {$ pageData [ 'title'] = "Використання тим в CodeIgniter"; $ PageData [ 'theme'] = $ this-> curTheme; $ PageData [ 'contentTitle'] = "Це заголовок"; $ PageData [ 'contentData'] = "Тут повинен знаходиться текст статті з". "Картинками, коментарями тощо Загалом, все, що хочете ...."; $ PageData [ 'sidebarTitle'] = "Рубрики"; $ PageData [ 'sidebarData'] = array ( 'PHP', 'CSS', 'HTML', 'JavaScript'); $ This-> load-> view ($ this-> curTheme. '/ Header', $ pageData); $ This-> load-> view ($ this-> curTheme. '/ Content'); $ This-> load-> view ($ this-> curTheme. '/ Sidebar'); $ This-> load-> view ($ this-> curTheme. '/ Footer'); }}

У конструкторі контролера ми завантажуємо конфігураційний файл (рядок 8) та читаємо параметр current_theme (рядок 9).

У методі index ми додаємо до назви уявлення ім'я папки з активною темою (рядки 20-23). І, крім того, зберігаємо назву теми в масиві $ pageData (рядок 14). Справа в тому, що файл header.php містить заголовок сторінки, в якому підключається таблиця стилів. Оскільки кожна тема має свій css файл нам потрібно правильно сформувати шлях до нього.

<Link href = "&lt;? Php echo $ this-> config-> system_url ();?> Application / views / &lt;? Php echo $ theme;?> / Styles.css" rel = "stylesheet" type = "text / css "media =" all "/>

Вміст файлів уявлень я наводити не буду, тому що розмітка сторінки звичайна, а назви елементів масиву $ pageData говорять самі за себе. І в будь-якому випадку ви можете скачати архів з прикладом (посилання внизу сторінки).

Тут я приведу тільки два скріншота для обох тем.

Тема classic

Тема default

Як бачите, вони відрізняються тільки розміщенням колонок. Вміст сторінок однаково (якщо не брати до уваги тексту з назвою теми).

Спробуємо трохи вдосконалити код.

Приберемо з контролера код, який виконує завантаження уявлень. Для цього напишемо невеликий хелпер (helper).

Створюємо файл application / helpers / theme_helper.php наступного змісту:

&lt;? Php function createPage ($ pageData) {$ CI = & get_instance (); $ CurTheme = $ CI-> config-> item ( 'current_theme'); $ PageData [ 'theme'] = $ curTheme; $ CI-> load-> view ($ curTheme. '/ Header', $ pageData); $ CI-> load-> view ($ curTheme. '/ Content'); $ CI-> load-> view ($ curTheme. '/ Sidebar'); $ CI-> load-> view ($ curTheme. '/ Footer'); }?>

Як бачите, ми написали всього одну функцію, яка просто читає параметр current_theme і завантажує уявлення.

Зверніть увагу на використання функції get_instance () вона дозволяє отримати доступ до об'єкта CodeIgniter (в контролерах і моделях замість неї використовується $ this).

Тепер код контролера можна переписати таким чином:

class Main extends Controller {function Main () {parent :: Controller (); $ This-> load-> helper ( 'html'); $ This-> load-> helper ( 'themes'); $ This-> config-> load ( 'themes'); } Function index () {$ pageData [ 'title'] = "Використання тим в CodeIgniter"; $ PageData [ 'contentTitle'] = "Це заголовок"; $ PageData [ 'contentData'] = "Тут повинен знаходиться текст статті з". "Картинками, коментарями тощо Загалом, все, що хочете ...."; $ PageData [ 'sidebarTitle'] = "Рубрики"; $ PageData [ 'sidebarData'] = array ( 'PHP', 'CSS', 'HTML', 'JavaScript'); createPage ($ pageData); }}

Як бачите, працювати стало зручніше.

Тепер уявімо, що наш сайт має різну структуру сторінок. Наприклад, на головній сторінці сайдбар відображається, а на інших сторінках - немає. Крім того, розробник теми може захотіти додати додаткові подання або змінити їх назви.

Очевидно, що функція createPage повинна якимось чином визначити, які уявлення показувати в кожному конкретному випадку.

В цьому випадку потрібно, перш за все, визначитися з типами сторінок. У нашому випадку вони будуть називатися: main (головна) і page (просто сторінка).

Тепер додамо кілька параметрів в конфігураційний файл.

$ Config [ 'themes'] [ 'default'] [ 'main'] = array ( 'header', 'content', 'sidebar', 'footer'); $ Config [ 'themes'] [ 'default'] [ 'page'] = array ( 'header', 'content', 'footer');

Як бачите, ми створили багатовимірний масив з настройками. Другий індекс масиву вказує назви теми, третій - тип сторінки.

У цьому масиві ми зберігаємо переліки уявлень, які потрібно завантажувати для кожної обраної сторінки.

Примітка. Аналогічні настройки потрібно задати для всіх тем.

Тепер потрібно змінити хелпер.

function createPage ($ pageData, $ pageType) {$ CI = & get_instance (); $ CurTheme = $ CI-> config-> item ( 'current_theme'); $ PageData [ 'theme'] = $ curTheme; $ ThemeData = $ CI-> config-> item ( 'themes'); foreach ($ themeData [$ curTheme] [$ pageType] as $ curView) {$ CI-> load-> view ($ curTheme. '/'. $ curView, $ pageData); }}

Тепер, ми отримуємо масив з назвами уявлень і завантажуємо тільки їх. Крім того, додався ще один параметр $ pageType (тип сторінки).

У контролері ми тільки додаємо метод page ()

function page () {$ pageData [ 'title'] = "Використання тим в CodeIgniter"; $ PageData [ 'contentTitle'] = "Це заголовок"; $ PageData [ 'contentData'] = "Тут повинен знаходиться текст статті з". "Картинками, коментарями тощо Загалом, все, що хочете ...."; $ PageData [ 'sidebarTitle'] = "Рубрики"; $ PageData [ 'sidebarData'] = array ( 'PHP', 'CSS', 'HTML', 'JavaScript'); createPage ($ pageData, 'page'); }

Обмеження і область використання такого рішення

Якщо ви уважно подивитеся на останній блок коду (метод page), то помітите один істотний недолік (рядки 6 і 7).

Справа в тому, що в одній темі може використовуватися сайдбар, а в іншій - ні. Але в контролері ми в будь-якому випадку повинні підготувати дані для нього. Інакше частина тим просто не буде працювати.

Звичайно, в даному прикладі, це всього лише короткі рядки тексту, але в реальному додатку ці дані потрібно буде отримувати з бази. А це означає, що для якихось тим будуть виконуватися зайві запити.

Звідси випливає простий висновок: «Такий спосіб створення тим можна застосовувати тільки для сайтів з постійною структурою сторінок».

Якщо вам потрібно більш гнучке рішення - використовуйте підхід, який застосовується в більшості CMS (наприклад, в двигуні WordPress).

Принцип наступний. Отримання даних переноситься в уявлення. Тобто розробник теми отримує доступ до якогось набору функцій (API). І з його допомогою отримує потрібні йому дані.

Наприклад, в тому ж WordPress функція get_posts повертає вибрані записи.

Але, незважаючи на гнучкість такого підходу у нього є свої недоліки:

1) Система ускладнюється (виправдано для CMS, але для звичайного сайту може бути зайвим).

2) Ускладнюється код уявлень, тому що потрібно викликати функції (знову ж таки, це виправдано, якщо потрібно забезпечити різну структуру для сторінок одного типу).

3) Розробник теми може написати далеко не оптимальний код. Наприклад, викликати кілька разів одну й ту ж саму функцію.

4) Практично завжди універсальне рішення працює повільніше і споживає більше ресурсів, ніж вузькоспеціалізоване. В результаті може вийти великоваговий движок.

5) Порушується архітектура MVC (отримання даних виконується всередині уявлення). В принципі, це не проблема, тому що CodeIgniter не накладаються тут жорстких обмежень.

Завантажити архіви з прикладами

1) Найпростіший варіант (без хелпера).
2) Теж саме + хелпер.
3) Варіант з підтримкою індивідуального оформлення різних типів сторінок.

У всіх архівах знаходиться папка application, яку потрібно скопіювати в папку system дистрибутива CodeIgniter.

Висновок.

Як бачите, вибір способу створення підтримки тим залежить від конкретної ситуації. Але мене цікавить ваша думка. Наскільки виправдано взагалі використання тим в невеликому проекті нібито сайту-візитки? Може простіше його переробляти кожен раз і не морочити собі голову з темами?

Цікаво почитати:

Кумедний трюк з отримання трафіку з соціалок

Або навіщо потрібні фреймворки?
Lt;?
Php if (! Defined ( 'BASEPATH')) exit ( 'No direct script access allowed'); $ Config [ 'current_theme'] = 'classic'; ?
Php echo $ this-> config-> system_url ();?
Php echo $ theme;?
Наскільки виправдано взагалі використання тим в невеликому проекті нібито сайту-візитки?
Може простіше його переробляти кожен раз і не морочити собі голову з темами?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью