Обновление 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)
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 CodeIgniter: Всплывающая форма обратной связи на Ajax в Bootstrap Modal и проверкой Captcha (18.02.2014)
- Как правильно обновить ExpressionEngine до последней версии 2.5.5 (05.02.2013)
- Team Sense: Доступна отправка сообщения/письма на email сотрудника. (18.01.2013)
- TeamSense: username (логин) в регистрации пользователя. Внедрили библиотеку DHTMLX в TeamSense. (11.01.2013)
- Team Sense: В календарь добавлена возможность указывать место проведения уроков (в офисе, на выезде) (12.12.2012)
- Team Sense: Многопользовательский календарь, заменяем радиокнопки на чекбоксы в выборе преподавателей. Массивы в Javascript. (06.12.2012)
- Team Sense: В календарь-расписание уроков добавлено разделение по преподавателям, которым присвоены свои цвета. (04.12.2012)
- CodeIgniter не передаёт $this->uri->segment(3) в функцию контроллера (передача переменной PHP->JavaScript->PHP) (28.11.2012)
- Воюем с форматом даты в JavaScript. Приведение формата даты в поле input в календаре системы TeamSense к более красивому виду. (18.11.2012)
- Team Sense: Теперь Email-оповещения в TODO можно отправлять как для руководителя задачи, так и для помощников. (21.09.2012)
- CodeIgniter и TeamSense: Делаем свой вид для страницы с ошибкой 404, настраиваем правильную отдачу статусов в HTTP headers (12.09.2012)
- Установка другого сайта (на CodeIgniter или Yii) в подпапку и чтобы поддомен ссылался на подпапку (25.08.2015)
- CodeIgniter: Подключение JS и CSS файлов там, где это нужно. (26.06.2012)
- Использование DISTINCT в SQL-запросах для исключения повторяющихся данных применительно к фреймворку CodeIgniter. (18.06.2012)
- CodeIgniter выдаёт ошибку: Cannot modify header information - headers already sent by (13.04.2012)
- CodeIgniter: Передаются пустые значения полей формы через $_POST если вводить русские символы. Форма не проходит валидацию. (17.08.2016)
- Обновление CodeIgniter с версии 2.0 (2.0.0) до версии 2.0.1 (23.01.2012)
- CodeIgniter: Показываем сообщения пользователю на его действия (19.11.2011)
- Настройка локальной и рабочей сред для разработки на CodeIgniter (2-й вариант) (22.01.2012)
- Календарь c несколькими событиями в один день на CodeIgniter (Calendar Multiple Events Per Day) (23.10.2011)
- Настройка локальной среды для разработки на CodeIgniter в Mac OSX, используя MAMP (22.01.2012)
- Обновление CodeIgniter с версии 2.0.1 до 2.0.2 (23.10.2011)
- CodeIgniter: Аутентификация на сайте с помощью библиотеки DX Auth (24.08.2011)
- Сравнение Yii с CodeIgniter (23.10.2011)
- CodeIgniter: Рассылка email по выбранным группам зарегистрированных пользователей и списку незарегистрированных пользователей (02.03.2013)
4 комментариев
2 последних пункта могут у вас уже работать, и если так, то не парьтесь, но для меня было досадно, когда после переноса все страницы открывали главную. Очень рад, что так.
По крайней мере у меня такое впечатление сложилось, когда не смог получить кириллические символы из формы используя стандартное $this->input->post(‘name’wink;. excaim
В UTF-8 данной проблемы не наблюдаю
У кого есть версия CodeIgniter 2.0 очень надо .