FAQ:Создание админки на CI

Материал из Wiki

Перейти к: навигация, поиск

Содержание

Создание админки на CI

Насколько я знаю, существует 3 метода создания админки с использованием CI. В этой статье я покажу примеры структур для каждого метода и расскажу о плюсах и минусах их использования.

Статья лишь в общих чертах описывает теорию создания админки и предлагает вам возможные стуктуры. Я не собираюсь писать очередную статью типа «Как создать систему авторизации и добавить в нее администраторов».

Итак, методы.

Два отдельных приложения

В CI вы легко можете запускать несколько приложений на одной установке CI просто используя копии файла index.php с другими именами.

/
|--applications/
|  |--frontend/
|  |  |--controllers/
|  |  |  |--home.php
|  |  |  |--blog.php
|  |  |  |--comments.php
|  |  |
|  |  |--models/
|  |  |  |--blog_model.php
|  |  |  |--comment_model.php
|  |  |
|  |  |--views/
|  |     |--blogs/
|  |     |  |--index.php
|  |     |  |--view.php
|  |     |--comment/
|  |     |  |--view.php
|  |     |--index.php
|  |
|  |--backend/
|     |--config/
|     |--controllers/
|     |  |--dashboard.php
|     |  |--blog.php
|     |  |--comments.php
|     | 
|     |--models/
|     |  |--blog_model.php
|     |  |--comment_model.php
|     |
|     |--views/
|        |--blogs/
|        |  |--index.php
|        |  |--form.php
|        |
|        |--comment/
|        |  |--index.php
|        |
|        |--dashboard.php
|        |--login.php
|
|--system/
|
|--index.php
|
|--admin/
   |--index.php

Как вы видите, я поместил index.php в каталог admin/. Каждый файл index.php будет указывать на свой каталог внутри /applications, указать который можно следующим образом:

// index.php

$application_folder = "applications/frontend";
// admin/index.php

$application_folder = "applications/backend";

Так же, что бы система правильно строила путь к папке system из каталога admin, в admin/index.php замените:

$system_folder = "system";

на:

$system_folder = $_SERVER['DOCUMENT_ROOT']."/system";

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

Вложенные каталоги

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

/
|--application/
|  |--config/
|     |--controllers/
|     |  |--admin/
|     |  |  |--blog.php
|     |  |  |--comments.php
|     |  |
|     |  |--blog.php
|     |  |--comments.php
|     |
|     |--models/
|     |  |--blog_model.php
|     |  |--comments_model.php
|     |
|     |--views/
|        |--admin/
|        |  |--blog/
|        |  |  |--index.php
|        |  |  |--form.php
|        |  |
|        |  |--comments/
|        |  |  |--index.php
|        |  |  |--form.php
|        |  |
|        |  |--dashboard.php
|        |  |--login.php
|        |
|        |--blog/
|        |  |--index.php
|        |  |--view.php
|        |
|        |--comments/
|           |--view.php
|--system/
|--index.php
 

При таком подходе сохраняется привычная структура MVC. Для контроллеров мы используем вложенные каталоги, что дает нам вот такую структуру URL — http://example.com/admin/blog. У этого метода есть преимущество перед предыдущим: мы можем использовать одни и те же модели, библиотеки и хэлперы как в фронтэнде, так и в бэкэнде. Если вам на самом деле требуется разделить модели для фронт- и бэкэнда, почему бы просто не создать каталог models/admin/ и не поместить их туда?

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

Модули

Чтобы весь наш код управления контентом находился в одном единственном каталоге, мы можем применить подход HMVC. Это означает иерархический MVC и дает нам модульный CI. Для достижения этих целей были созданы две системы: HMVC и Matchbox. Лично я предпочитаю последнюю, но учтите, что HMVC я ни разу не пробовал, так что выбор за вами.

Многие CI-разработчики делают странную вещь: создают модуль блога, модуль комментариев и модуль админки. Я в шоке от этого, потому что такое странное разделение на корню уничтожает всю идею использования модулей! Я использую единственный контроллер admin.php в основном каталоге контроллеров и с его помощью управляю главной страницей админки. Этот контроллер обрабатывает вход на сайт, выход и работает с панелью управления. Затем я в каждый модуль добавляю контроллер admin.php и настраиваю маршруты (URI Routing), чтобы добиться ссылок вроде http://example.com/admin/.

/
|--application/
|  |--config/
|  |--controllers/
|  |  |--admin.php
|  |
|  |--modules/
|  |  |--blog/
|  |     |--controllers/
|  |     |  |--admin.php
|  |     |  |--blog.php
|  |     |
|  |     |--models/
|  |     |  |--blog_model.php
|  |     |
|  |     |--views/
|  |     |--admin/
|  |     |  |--index.php
|  |     |  |--form.php
|  |     |
|  |     |--comments/
|  |        |--controllers/
|  |        |  |--admin.php
|  |        |  |--comments.php
|  |        |
|  |        |--models/
|  |        |  |--comment_model.php
|  |        |
|  |        |--views/
|  |           |--admin/
|  |              |--index.php
|  |              |--form.php
|  |		   
|  |--views/
|     |--admin/
|        |--dashboard.php
|        |--login.php
|
|--system/
|--index.php

При такой структуре чтобы попасть в админку, скажем, блога, вам нужно перейти по адресу http://example.com/blog/admin — симпатично, не правда ли? Нет? Тогда вы можете настроить маршруты в файле application/config/routes.php, чтобы поменять местами сегменты.

$route['admin/([a-zA-Z_-]+)/(:any)'] = '$1/admin/$2';
$route['admin/login'] = 'admin/login';
$route['admin/logout'] = 'admin/logout';
$route['admin/([a-zA-Z_-]+)'] = '$1/admin/index';
$route['admin'] = 'admin';

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

Резюме

Используйте 1-ый метод тогда, когда ваши фронт- и бэкэнд не содержат какого-либо общего кода и вы уверены, что никогда не будут. Используйте 2-ой метод, если у вас лишь несколько контроллеров, небольшой сайт и вам нет смысла возиться с HMVC. Используйте 3-ий метод в тех случаях, когда вы работаете с огромным модульным сайтом и вам необходимо использовать один и тот же код для фронтэнда и бэкэнда.

Оригинал статьи — http://philsturgeon.co.uk/news/2009/07/Create-an-Admin-panel-with-CodeIgniter

Личные инструменты