суббота, 2 февраля 2013 г.

Адаптация расширений под Joomla 3.0 или loadColumn() вместо LoadResultArray()
(Backward compatibility issues in Joomla 3.0 loadColumn() instead of LoadResultArray())


Недавно мне пришлось адаптировать одно свое не очень старое расширение, написанное под Joomla 2.5 на Joomla 3.0. И поскольку работу необходимо было сделать быстро, на полный рефакторинг кода времени, как всегда, не нашлось.

Закатав рукава приступаю к адаптации.
Поскольку опыта написания расширений под новую (на данный момент 3.0) Joomla не было. Пытаюсь на авось...


Устанавливаем саму CMS.
Напоминаем, на всякий случай, что системные требования для новой Джумлы несколько изменились:
  • PHP 5.3.1
  • параметр register_globals должен быть off
  • параметер magic_quotes_gpc должен быть off
Установить расширение через стандартный инсталлятор Joomla не удалось. При попытке установки получаем:
JInstaller: :Install: Не найден установочный XML-файл Joomla.
Ладно не беда... К этому мы вернемся позже...
Копируем все файлы на локальный веб сервер и создаем необходимые таблицы в базе данных вручную. Набираем в браузерной строке адрес необходимый для доступа к компоненту — в результате видим:
 Fatal error: Call to undefined method Jcontroller::getInstance()
Удивляемся и огорчаемся, но не долго. Смотрим точку входа дефолтных компонентов Joomla 3.0 и видим, что:

JController::getInstance()
больше не используется, а вместо него...
JControllerLegacy::getInstance().

Делаем соответствующие правки в нашем компоненте.
Следующим неприятным моментом для меня оказалось то что метод Jdatabase::loadResultArray() почему-то выдавал null. Вместо необходимого массива данных. Из за чего перестали работать некоторые элементы управления во фронтенде моего компонента. Причем остальные часто используемые методы (::loadResult, ::loadRow, ::loadAssoc, ::loadAssocList) работали исправно. Погуглив немного, нашел на англоязычных форумах кучу «благодарных» отзывов в сторону разработчиков по поводу замены данного метода на ::loadColumn().

Сделав необходимые правки в компоненте, все заработало должным образом.

Заинтересовавшись темой совместимости расширений, нашел еще один интересный документ, который может помочь разработчикам в процессе адаптации компонентов под новую Joomla. Кому интересно смотрим здесь

P.S. По поводу невозможности установки «старого» компонента стандартными средствами Джумла можно также почитать из вышеприведенного документа. По крайней мере не используйте <install> в установочном xml файле. У нас вместо него теперь есть <extension>

4 комментария:

  1. Спасибо за просвещение!! Реальн долго "Думал" пока не решил по гуглить loadResultArray()

    ОтветитьУдалить
  2. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  3. Красава)
    Спасибо.

    ОтветитьУдалить