CodeIgniter
Подписаться на эту рубрику по RSS
Недавно вышел CodeIgniter 1.7.1 и я решил перевести MaxSite CMS на неё. Как известно система работала на 1.6.1. Была попытка перехода на CodeIgniter 1.6.2, но разработчики что-то там не доглядели и в итоге пришлось вернуться на стабильную 1.6.1.
Вчера проверял и тестировал 1.7.1 и в целом проблем не нашел. Из-за не до конца проработанного механизма экранирования в SQL-запросах в некоторых функциях пришлось отключить в них экранирование. Так же были мелкие нововведения, больше связанные с синтаксисом запросов (where-условия нужно указывать через пробел).
Остался «фирменный» баг с неверным определением сегментов. Я уже писал об этом раньше.
Сразу же обновил и версию jQuery: на последнюю 1.3.1. Проблем не заметил.
Если за время тестирования не обнаружатся какие-то смертельные глюки, то MaxSite CMS 0.30 будет работать уже на CodeIgniter 1.7.1. Если после обновления у вас возникли проблемы, то напишите об этом на форуме.
Что-то совсем меня достали ошибки новой версии CodeIgniter 1.6.2. Явно что-то там не в порядке. Я уже дважды писал о проблемах: вначале отказался работать XmlRpc, потом начала отваливаться база. А сейчас опять выяснилось, что если указать db->where(array('page_title'=>'')), то CodeIgniter падает с ошибкой о неверном SQL. В общем, нафиг такое счастье, пусть разработчики сами разбираются. Я же откатываю свою систему на 1.6.1, где всё замечательно работает.
Что-то явно не так в CodeIgniter. Столкнулся с серьезной проблемой, которую так и не могу побороть. Дело в XmlRPC, хотя я думаю, что в каких-то ситуациях дело не только в этой библиотеке. Скорее всего существует ошибка при подключении разных классов в основном контролере. То есть когда я в основном контролере передаю управление во вьювер, то в этом вьювере, при условии, что должен подключиться еще один класс (через new), начинают твориться странные вещи.
Я уже писал, что не смог перейти на 1.6.2 из-за того, что XmlRPC вдруг перестала видеть базу данных. Все попытки вручную её прописать, все равно не срабатывают - в основном контролере она есть и дальше, хоть тресни, не видно.
Сегодня столкнулся с аналогичной проблемой, только на другом хостинге. XmlRPC опять напрочь отказывается работать. И опять проблема с подключением классов. На сей раз вылезает ошибка:
- Fatal error: Cannot redeclare class ci_session in /.../system/libraries/Session.php on line 0
При этом если прописать библиотеку в автозагрузку, никакого эффекта. Поэтому пришлось отключить автозагрузку и прописать подключение библиотек вручную. При этом, что интересно, хотя в основном контролере все прописано, а в XmlRPC стоит и «parent::Controller();» и «$CI = & get_instance();» (и каких только вариантов я не перепробовал), все равно происходит какая-то ошибка и база опять отваливается.
Впрочем есть у меня предположение, что дело здесь вовсе не в CodeIgniter и моих кривых ручках, а самом хостинге. Проблема возникает на хостинге с PHP 4.4.8. На локальной машине и на другом хостинге, где стоит PHP 5.2 подобных проблем не наблюдается.
Похоже, перемудрили разработчики. В новой версии что-то неладное творится с подключением библиотек. :-(
После перехода вдруг перестал работать Xmlrpc. Я долго бился, пока не выяснил, что в новой версии подключается лишь часть библиотек, хотя в autoload'е все стоит как положено. Собственно там всего две библиотеки: база данных и сессия. И вот в моем классе Xmlrpc_server база данных напрочь отсутствует. Как будто бы её просто нет.
Я пробовал вручную её прописывать (может проблема в автозагрузке), но библиотека не подключается, то есть на каком-то уровне CodeIgniter считает, что она уже загружена, хотя реально это не так. Впрочем может это еще какая-то ошибка, но мне её так и не удалось победить. Пробовал самые разные варианты, никаких результатов.
И главное - теперь совершенно непонятно в какую сторону копать. :(
Вышел CodeIgniter 1.6.2. Изменений довольно много, прежде всего хочется отметить два:
- во всех php-файлов убран закрывающий ?>
- в конфигурации добавлен файл constants.php
Версию пока тестирую локально, после этого обновлю уже на сервере.
Вот здесь я уже писал, об особенностях работы PHP в режиме FastCGI. Недавно обнаружил еще один глюк, который поначалу принял на счет этой «связки». Как оказалось проблема крылась именно в CodeIgniter.
Суть проблемы. У меня на сайте пагинация страниц. Поскольку главная страница имеет тип «home», то ссылки на страницы формируются в виде «сайт/home/next/2». И вот эта штука напрочь отказывалась работать - постоянно выходило сообщение, что страница не найдена (404).
Обнаружилось, что неверно работает $this->uri->segment_array() - он упорно исключал из первого сегмента URI «home». Перепробовав всевозможные варианты, полез в URI.php и выяснилась интересная деталь.
В режиме, когда $config['uri_protocol'] = "REQUEST_URI" происходит парсинг $_SERVER['REQUEST_URI'], что вполне логично. Но вот в конце этого парсинга (функция _parse_request_uri) получает реальный путь на сервере и сравнивает с полученным REQUEST_URI и берет только ту часть, которая несовпадает. Так вот, на сервере путь начинается с «home» и первый сегмент тоже начинается с «home». Вот функция и удаляет её. ![]()
Я не стал сильно разбираться в смысле этих манипуляций, просто закоментировал строки:
- # $parsed_uri = implode("/", array_slice($parsed_uri, $i));
- $parsed_uri = implode("/", $parsed_uri);
После этого все заработало.