Обновление CodeIgniter с версии 1.7.2 до версии 2.0 (2.0.0)

Нет картинки

После долгих эволюционных изысканий и доработок, продолжавшихся примерно один год, ребята из EllisLab выпустили долгожданное обновление фреймворка CodeIgniter. Многие этого ждали, и самое главное изменение - это то, что теперь фреймворк полностью перестал поддерживать PHP4, и PHP5 - теперь необходимое условие его работы.

После долгих эволюционных изысканий и доработок, продолжавшихся примерно один год, ребята из EllisLab выпустили долгожданное обновление фреймворка CodeIgniter. Многие этого ждали, и самое главное изменение - это то, что теперь фреймворк полностью перестал поддерживать PHP4, и PHP5 - теперь необходимое условие его работы.

Официальное руководство по переезду.

Итак, действия и комментарии:

1. Сначала создаем статичный файл (если у Вас его еще нет) для того, чтобы показывать его посетителям Вашего сайта, пока Вы колдуете над обновлением. Я свой назвал просто - index.htm и поместил в него кратенькое сообщение о том, что идут технические работы и т.п.

2. Следующим шагом я отметил для себя то, какие изменения я вносил внутри папки system. Оказалось - всего парочку. Одно - в библиотеке Validation и еще одно - добавлял в папку fonts свой шрифт для генерации капчи. У Вас, естественно, могут быть другие изменения, а может и не быть их вообще, что еще удобнее.

Смысл в том, чтобы потом Вы смогли восстановить внутри новой папки system то, что Вы изменяли специально под себя.

3. Далее я удалил все, что было внутри папки system (кроме папки application, в которой и находится наше приложение) и закачал в нее все то, что было внутри папки system в новой версии CodeIgniter. После этого внес те изменения, которые отметил в шаге 2.

3.1 В корне надо также заменить index.php новым из дистрибутива CodeIgniter 2.0.0!!

3.2 В конфиге config/routes.php тоже есть дополнения поэтому обновите (сравнивая ваш и новый файл, сохраняя свои настройки).

4. Потом в файл .htaccess, лежащий в корне сайта я добавил строку:

ErrrorDocument 404 /index.htm

Такой записью мы говорим серверу, что если он не найдет запрашиваемого документа (а он не найдет, так как мы все уже удалили:), то пользователю нужно "вручить" файл с именем index.htm, лежащий в корне сайта.

Там же, в .htaccess добавляем еще одно условие, а именно: мы не хотим, чтобы при обращении к файлу index.htm происходила переадресация на главный файл CodeIgniter - index.php. В итоге получаем что-то в этом роде:

RewriteEngine on
RewriteCond $1 !^(index\.php|robots\.txt|img|styles|demo|files|js|recommend|products|index\.htm)
RewriteRule ^(.*)$ /index.php?/$1 [L]
ErrorDocument 404 /index.htm

В конце второй строки как раз и указан файл index.htm, обращение к которому не должно приводить к переадресации запроса на index.php.

5. Превращаем плагины в хэлперы.

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

$this->load->plugin ('captcha');

на

$this->load->helper ('captcha');

5.1 Просмотрите хелперы и библиотеки получше (терерь helper url перенесён в core и его не надо прописывать в autoload).

6. Далее нужно обновить расширения классов. Теперь все классы ядра CodeIgniter имеют префикс CI_. Поэтому теперь все Ваши контроллеры и модели должны расширять CI_Model и CI_Controller соответственно.

К примеру, вместо

class Crud extends Model

нужно писать:

class Crud extends CI_Model

А вместо

class Sections extends Controller

соответственно

class Sections extends CI_Controller

7. Наконец, нужно обновить вызовы конструкторов родительских классов.

До версии 2.0 вызов происходил так:

parent::Controller();

либо

parent::Model();

Поскольку CodeIgniter теперь полностью перешел на PHP5, необходимо вызывать конструктор родительского класса следующим образом:

parent::__construct();

То есть теперь в контроллерах и моделях надо делать так:

//Конструктор
    public function __construct()
		{       
    		parent::__construct();         
		}

8. Восьмым пунктом меня ждала первая неожиданность.

Выполнив все, что я расписал ниже, я обратился к сайту, и увидел сообщение о том, что для нормальной работы сессий мне необходимо указать в файле config.php (system - application - config.php) ключ шифрации.

Это настройка $config['encryption_key'] = "";

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

9. Но не тут-то было. Кликнув по первой попавшейся ссылке, я остался на той же самой главной странице, на которой и был. При этом url-адрес в адресной строке благополучно изменился. Я покликал по ссылкам, ведущим в разделы, материалы, попытался войти в админку - результат тот же. Адреса меняются, а страница остается прежней.

Поскольку самому копаться в этом очень не хотелось, я направился на официальный форум codeigniter и там довольно быстро нашел решение данного вопроса.

Оказалось, что для того, чтобы все заработало, нужно поменять еще одну настройку в config.php. Я изменил

$config['uri_protocol']	= "AUTO";

на

$config['uri_protocol']	= "QUERY_STRING";

10. После этого все заработало. Отчасти. На некоторых страницах показывался "белый экран смерти", и никакой stackoverflow.com не помог. Методом "комментирования всего и вся, с постепенным раскомментированием кода к прежнему виду" (к слову очень действенный метод, которым мы активно пользуемся на loco.ru при кодинге приложений) была выявлена функция, сидящая в модели и немогущая обработаться CodeIgniter'ом. Почему-то когда CI чего-то не может, он не выдаёт error'ы, даже если в config/config.php включен их показ. Это значит, что скорее всего, где-то неверно срабатывает php.

Вот эта функция, которая стала камнем преткновения:

function getCategoriesNav($pid){
     $data = array();
     $this->db->select('id,parentid,name,path');
     $this->db->where('status', '1');
     $this->db->where('nav', '1');
     $this->db->where('parentid', $pid);
     $this->db->orderby('parentid','asc');
     $this->db->orderby('sort','asc');
     $this->db->groupby(array('parentid','id'));
...

Надо посмотреть в user_guide - Active Record Class и увидеть там, что нет таких методов как orderby и groupby: Note: order_by() was formerly known as orderby(), which has been removed. (то есть теперь orderby переименована в order_by, то же самое и с groupby)

Правильно:
function getCategoriesNav($pid){
     $data = array();
     $this->db->select('id,parentid,name,path');
     $this->db->where('status', '1');
     $this->db->where('nav', '1');
     $this->db->where('parentid', $pid);
     $this->db->order_by("parentid","asc");
     $this->db->order_by("sort","asc");
     $this->db->group_by(array("parentid","id"));
...

Это очень важно, потому что у вас могут выплыть свои ошибочки, вы увидите White screen и это отобъёт всю охоту дальше работать с CodeIgniter (а между тем всего-то лишь моя же некомпетентность в классах и привела к ошибке).

11. Будьте готовы к ошибке при создании и удалении сессии (если вы используете для этого базу данных) - при использовании схемы в сохранении данных сессии в БД, система делает ошибку "user_data does not have a default value" при удалении, а затем создании сессии. С этим ничего не поделаешь до обновления до версии 2.1.0. Побочный баг движка )) Много нового хорошего перекрывает этот баг.

Надеемся, данная заметка будет полезна тем, кто столкнулся с похожей задачей обновления CodeIgniter.

(При подготовке этого материала многое было взято и дополнено у Дмитрия Науменко - codeinharmony.ru)

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (4)     Подпишитесь на RSS комментариев к этой статье.

4 комментариев

#40
Макс говорит:
March 17, 2011 at 07:52 am
Чувак ты супер!!!! Огромное спасибо, я уже сутки бьюсь головой в стену!!!! Еще раз спасибо, со всем я разобрался кроме двух последних пунктов, а решение было оказывается простейшим. Ура
#41
Саша говорит:
March 17, 2011 at 09:38 am
Благодарности слова к Дмитрию Науменко! (см. источник)

2 последних пункта могут у вас уже работать, и если так, то не парьтесь, но для меня было досадно, когда после переноса все страницы открывали главную. Очень рад, что так.
#42
Андрей говорит:
March 27, 2011 at 11:18 pm
Я так понял, что эта версия CI не очень дружит с POST-данными, которые отосланы в win-1251.
По крайней мере у меня такое впечатление сложилось, когда не смог получить кириллические символы из формы используя стандартное $this->input->post(‘name’wink;. excaim
В UTF-8 данной проблемы не наблюдаю
#925
Роман говорит:
July 31, 2013 at 10:03 pm
Всем привет!
 У кого есть версия CodeIgniter 2.0 очень надо .