Inferno: подключаем сторонние библиотеки к CodeIgniter

20 августа, 2008
codeigniter inferno

Использовать библиотеки сторонних разработчиков вместе с фреймворком CodeIgniter в большинстве случаев не сложно. Достаточно, чтобы библиотека соответствовала небольшому перечню требований.

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

Избавиться от этой проблемы можно с помощью библиотеки Inferno. Ее предназначение – подключение сторонних библиотек к фреймворку.

Кстати, в дистрибутив уже включены три библиотеки: TarzanAws - Amazon Web Services, Akismet API и Simplepie RSS Parsing.

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

В качестве «подопытного кролика» я использовал PclZip.

Примечание
. CodeIgniter имеет собственную библиотеку для работы с архивами. Но возможности PclZip шире, да и интересовал меня больше сам процесс подключения.

Предварительная подготовка.

Качаем PclZip и распаковываем архив в папку с Inferno.

У меня получилась такая структура папок:

application/
	libraries/
		inferno/
			third_party/
				pclzip-2-6/
					pclzip.lib.php

Создаем файл inferno_pclzip.php и сохраняем его в application/libraries/inferno/.

Название файла может быть любым, но обязательно должно содержать приставку «inferno_».

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

Рассмотрим его подробнее.

  1. <?php
  2. /**
  3.  * Inferno_PclZip
  4.  * PclZip Inferno Wrapper
  5.  *
  6.  * @category Inferno
  7.  * @package Inferno_PclZip
  8.  * @version 2008.08.19
  9.  * @copyright 2008 Statsenko Vladimir.
  10.  * @license http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 License
  11.  * @link http://www.haughin.com/code/inferno/ Inferno
  12.  * @link http://www.simplecoding.org/ SimpleCoding
  13.  */
  14.  
  15. class Inferno_PclZip extends Inferno {
  16.  
  17.     function Inferno_PclZip($archive)
  18.     {
  19.         include (INFERNO_PATH.'third_party/pclzip-2-6/pclzip.lib.php');
  20.        
  21.         $this->pclzip = new PclZip($archive);
  22.     }
  23.    
  24.     function __call($method, $arguments)
  25.     {          
  26.         return call_user_func_array(array($this->pclzip, $method), $arguments);
  27.     }
  28. }
  29. ?>

Имя класса должно совпадать с именем файла и начинаться с заглавной буквы. Кроме того, этот класс должен быть потомком класса Inferno.

В конструкторе мы подключаем библиотеку (с помощью функции include). Тут удобно использовать константу INFERNO_PATH, которая указывает на папку с библиотекой.

После этого создаем объект PclZip. Имя архива мы передаем в первом параметре конструктора (это требование библиотеки PclZip).

Полученный объект присваиваем переменной $this->pclzip.

Примечание. Действия, которые нужно выполнить в конструкторе, зависят от конкретной библиотеки. Возможно, вам придется определить константы, подключить дополнительные файлы и т.п.

Метод __call позволяет вызывать методы объекта PclZip, т.е. дает возможность работать с библиотекой.

Использование библиотеки.

Подключение библиотеки выполняется в два этапа. Сначала нужно подключить Inferno, а затем, саму библиотеку.

Например:

  1. $this->load->library('inferno');
  2. $this->inferno->load('pclzip', 'e:\\myarch.zip');

Как видите, для подключения сторонней библиотеки используется функция load. В первом ее параметре передаем название библиотеки (pclzip), во втором – параметр конструктора (имя файла с архивом).

После этого, можно обращаться к любым функциям библиотеки.

Например, добавим файл в архив.

  1. $res = $this->inferno->pclzip->add('E:\\rssevets.sql', PCLZIP_OPT_REMOVE_ALL_PATH);
  2. if ($res == 0) {
  3.     echo $this->inferno->pclzip->errorCode().'<br />';
  4.     echo $this->inferno->pclzip->errorName().'<br />';
  5.     echo $this->inferno->pclzip->errorInfo().'<br />';
  6. }

Как видите, доступ к библиотеке мы получаем через объект $this->inferno.

В общем, библиотека интересная и полезная. Недостатков, на мой взгляд, только два.

1) Удлиняется цепочка вызовов из-за использования дополнительного объекта (inferno).

2) Возможно небольшое снижение быстродействия из-за использования метода __call.

Но оба этих недостатка перекрываются главным достоинством – отсутствием необходимости изменять стороннюю библиотеку.

А что вы думаете об этой библиотеке?

Понравилась статья? Подпишитесь на продолжение rss link !

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в CodeIgniter, PHP, Web разработка

]]>

Комментарии (14)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

  1. mr.Hide 20.08.2008 в 14:03 (Ответить)

    Автор, рассмотри пожалуйста вопрос о том, как создать на пхп прогу, удаленно постящую на вордпресс при выключенном XML-RPC. или при включенном даж. очень жду такой заметки. и вообще статей которые посвящены программингу для сеошнегов….))

    1. Владимир 20.08.2008 в 15:30 (Ответить)

      Интересно предложение.
      Вообще-то раньше была идея написать о работе с XML-RPC. Да и библиотек готовых много.

      Без XML-RPC работать с WP намного сложнее. Т.е. придется имитировать работу пользователя с помощью cURL.

  2. MAX 20.08.2008 в 16:46 (Ответить)

    Да, намутили с этими библиотеками в CodeIgniter. Почему бы просто не использовать require_once перед работой с библиотекой?

    1. Владимир 20.08.2008 в 19:21 (Ответить)

      В принципе, я их понимаю. Получилась общая система загрузки расширений.
      И доступ к ним всегда одинаковый
      ($this->library->method(…))
      независимо от того, как была загружена библиотека - с помощью $this->load->…. или с помощью autoload.php.

      А в общем-то ничто не мешает использовать include и require.

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

      1. MAX 20.08.2008 в 20:03 (Ответить)

        Ну да, получется, что при $this-load новый объект подсоединяется к глобальному $this. Получается вроде как единый объект.

        Я, кстати, от 1.6.2 отказался именно из-за того, что при таком подключении в XMLRPC исчезала bd. Так и не поборол. В 1.6.3 не проверял.

        1. MAX 20.08.2008 в 20:04 (Ответить)

          Точнее глобальному $CI. :-)

          1. Владимир 21.08.2008 в 14:13 (Ответить) (Comments won't nest below this level)

            Честно говоря, 1.6.2 я даже не качал :-)

  3. Delchyve 20.08.2008 в 20:11 (Ответить)

    Хм, интересно. Получается — подключение сторонних библиотек с помощью в принципе такой же сторонней (не входящей в дистрибутив CI) библиотеки.

    1. Владимир 21.08.2008 в 14:19 (Ответить)

      Ну да. По большому счету Inferno просто позволяет обойти соглашения об именах.

  4. mr.Hide 20.08.2008 в 21:55 (Ответить)

    Интересно предложение.
    Вообще-то раньше была идея написать о работе с XML-RPC. Да и библиотек готовых много.

    Владимир, ждем-с) Если что, у меня смежных вопросов тож много)))

  5. Олег 21.08.2008 в 15:43 (Ответить)

    Хотел в свое время реализовать подобное - усидчивости не хватило :)

  6. Voron 23.08.2008 в 13:10 (Ответить)

    Не я от всего этого очень далёк,я привык старыми методами работать!

    1. Владимир 23.08.2008 в 19:26 (Ответить)

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

      1. Delchyve 24.08.2008 в 13:18 (Ответить)

        Угу, а в моем случае это изучение помогает. Приходится изучать не только фреймворк, но и php :)

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

Введите ваш комментарий

* - обязательные для заполнения поля

Quicktags:

]]>