На правах рекламы

Шукалка

Оседлать Maxsite

Среда, 29 декабря 2010 г.
Рубрика: Бизнес в сети
Метки: |
Просмотров: 6043
Подписаться на комментарии по RSS

Давно хотел попытаться наладить разорванную автором интеграцию CMS с фреймворком, ковырялся-ковырялся набегами, но вот недавно пришел к выводу, что задача эта мне более не интересна... Слишком уж все сделано не по-моему в этой CMS, слишком уж разорвана связь с прародителем ее - CodeIgniter (CI).

Да, и в обещем-то и сам фреймворк далек от моего "идеального" движка. Так, что мои поиски в этом направлении, вяло, но продолжаются... Вообще, если честно, я теряю уже интерес к программированию - у меня всегда к нему был любительский подход. Пока делаешь что-нибудь для души, нравится, а когда приходится делать что-то на заказ и в жесткие сроки, т. е. "из-под палки", то интерес уходит моментально grin

Но, все-таки решил эту неоконченную статью опубликовать... Все-таки кое-каких результатов добился в плане интеграции.

Итак, по порядку. Устанавливаем чистый Maxsite в отдельный виртуальный хост. Первое, что мне не нравится в этой CMS - это то, что сам движок находится в корне сайта. Выносим его за пределы корня на 1 уровень вниз согласно инструкции CodeIgniter. Для этого, переносим каталоги application и system на 1 уровень вниз, за пределы корня сайта, а в index.php правим переменные:

$system_folder = "../system";
и
$application_folder = "../application";

И тут вылазит первая "грабля" - шаблоны сайта и админки вместе с браузерными ресурсами в данной CMS лежат внутри основного каталога CMS (application/maxsite) и неразрывно связаны с ней. Для того, чтобы сделать доступными браузерные ресурсы нам прийдется вынести выше указанный каталог обратно в корень сайта и слегка хакнуть ядро Maxsite. Это очень некузяво, поскольку при каждом обновлении Maxsite прийдется повторять этот хак, но лучшего решения я не нашел.

Итак, находим файл application/libraries/maxsite_lib.php и вносим в него следующие правки:

1. Заменяем везде, где встречается, константу APPPATH на переменную $APPPATH.

2. В самом начале конструктора определяем эту переменную $APPATH = '';

В итоге, теперь CMS ищет все свои файлы, не в каталоге application, а в корне сайта.

Едем дальше. Я в своей работе с CI предпочитаю использовать модульную библиотеку Matchbox - заливаем файлы этой библиотеки в каталог application/libraries. Проверяем работоспособность CMS - работа ее никак не нарушилась. Замечательно.

Теперь создаем некий контроллер в каталоге application/controllers, скажем, welcome.php - просто копируем его из стандартной поставки CI, а также копируем соответствующий файл отображения application/views/welcome_message.php.

Создаем маршрут для него перед всеми маршрутами Maxsite:

$route['wellcome'] = "welcome/index";
$route['wellcome/(:any)'] = "welcome/$1";

Проверяем - работает. Замечательно, об этом Макс (автор Maxsite) писал еще в своей статье "Maxsite и CodeIgniter". Действительно, для человека, имеющего определенный опыт работы с фреймворком, нет ничего сложного.

Движемся далее - повторяем то же самое для модуля. Создаем следующую структуру каталогов для нашего модуля:

application
- modules
-- mod
--- config
--- controllers
--- views

В каталоге config создаем стандартный для Matchbox файл routes.php:

<?php
$route['default_controller'] = "mod";
?>

В каталог controllers мы копируем все тот же welcome.php, но переименуем его в mod.php, выполнив и соответствующее переименование класса:

class Mod extends Controller {
    function Mod()
    {
        parent::Controller();    
    }
    
    function index()
    {
        $this->load->view('welcome_message');
    }
}

Как вы уже, наверное, догадались в соответствующий каталог views мы копируем welcome_message.php, но чтобы он отличался от того вида, который вызывается в основном контроллере, в модуле мы его слегка поправим. Например, в ставим абзац с надписью: "Here is a module!" или как-то так.

Не забываем добавить маршруты:

$route['mod'] = "mod/mod/index";
$route['mod/(:any)'] = "mod/mod/$1";

Проверяем - работает! Так мы получили возможность лепить рядом с CMS Maxsite свое приложение на CI, использующее модули на основе Matchbox, но это еще не есть полноценная интеграция. Нам, естественно, может захотеться, чтобы наше приложение имело такой же вид, как и сам сайт под управлением CMS. Для этого нам надо "оседлать" хитрозамороченные и пререгруженные программной логикой шаблоны Maxsite. И честно признаюсь, сделать это до конца правильно мне так и не удалось, а поэтому смысл данных действий теряется. Возможно проще сделать свой layout, внешне повторяющий шаблон сайта и на этом остановиться. Но все же, раз уж я этим заморочился, то попробую описать, что у меня получилось, а что нет.

Для вывода из нашего CI-приложения мы создадим специальный type-файл в каталоге type используемого шаблона. Назовем его codeigniter.php и поместим в него минимум кода, а именно обвязку сайта (подключение шапки и подвала) и вывод контента через echo $content. Вероятно, если очень досконально изучить устройство Maxsite (чего мне делать не хочется), то здесь можно добавить еще некоторые строчки кода, которые помогут решить проблему с виджетами, но об этом позже. Пока мы создаем минимальный type-файл:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
# начальная часть шаблона
require(getinfo('template_dir') . 'main-start.php');
echo NR.'<div class="type type_page">'.NR;
    echo NR.'<div class="page_only">'.NR;
        echo NR.'<div class="page_content type_page">'.NR;
            echo $content;
            echo '<div class="break"></div>';
        echo NR.'</div>'.NR;
    echo NR.'</div>'.NR;
echo NR.'</div>'.NR;
# конечная часть шаблона
require(getinfo('template_dir') . 'main-end.php');
?>

Далее, cоздаем в контроллере welcome еще один метод, скажем, maxsite() и смотрим, как происходит инициализация CMS в стандартном ее контроллере maxsite.php. Передираем все самое необходимое в наш метод и получаем следующий код:

    function maxsite()
    {
        global $MSO;
        # подключаем свою библиотеку
        $this->load->library('maxsite_lib');
        # инициализация + проверка залогиненности
        mso_initalizing();
        # хук инициализации
        mso_hook('init');
        # задаем данные для нашего типа 'codeigniter'
        $MSO->data['is_feed'] = 0;
        $MSO->data['type'] = 'codeigniter';
        $MSO->data['uri_segment'] = mso_segment_array(); 
        $MSO->data['uri_get'] = mso_url_get();
        $MSO->data['session'] = $this->session->userdata;
        # вызываем нужный нам вид из нашего CI приложения
        $MSO->data['content'] = $this->load->view('welcome_message_only', array(), TRUE);
        # выводим это через шаблон Maxsite
        $this->load->view('index', $MSO->data);
    }

Обратим внимание, что вместо обычного вызова $this->load-view(), мы указываем в конце последний 3-ий параметр TRUE, чтобы вместо вывода в браузер, сохранить его в переменную, которая позже будет доступна в нашем type-файле с именем $content. В конце подключаем шаблон Maxsite приблизительно так же, как это делает ихний метод $this->_view_i().

Что получаем? Получаем вывод нашего "welcome_message_only" в обвязке от CMS-ного шаблона. Кстати, почему "only"? В исходном файле welcome_message.php содержится полный код HTML-страницы, начиная с тэга <html>, тогда как наша обвязка тоже имеет свой раздел <head> и все прочее - нам нужно вывести только чистое сообщение. Поэтому мне пришлось создать копию вида, из которого я убрал все тэги, кроме содержимого <body>.

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

Что же не получилось? Не вышло самое важное, ради чего я попытался оседлать шаблоны Maxsite - сохранить вывод виджетов. Как я не бился, все виджеты до единого напрочь исчезли со страниц, относящихся к нашему типу 'codeigniter'. В конце-концов меня это обломало, и я решил на этом поставить точку.

Комментариев: 4

  1. Слух! я попробую отпишу!snake

    у меня тож есть мысли по ентому поводу!!

    я до кучи пхп-фьюжен-> с -> КИraspberry

  2. 2011-08-31 в 19:11:02 | Сергей

    Спасибо, помогло.

    Чтобы использовать MaxSite шаблон при выводе "своих данных", надо инициализировать CMS в своем контроллере, а дальше уже дело техники. Как там в анекдоте про приворотное зелье - "..а потом кирпичом ее по голове и делай с ней, что хочешь." А виджеты ака сайдбар, нужны на практике, только на страницах с публикациями.

  3. 2011-09-02 в 17:14:52 | Сергей

    Да, чтобы виджеты выводились, надо добавить в function maxsite() mso_autoload_plugins();

  4. Да, чтобы виджеты выводились, надо добавить в function maxsite() mso_autoload_plugins();

    Гм... Спасибо. Надо будет попробовать.

Оставьте комментарий!

Используйте нормальные имена.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)