Эта статья отслеживает потенциальные проблемы обратной совместимости для Joomla 3.0 и платформы Joomla 12.1, которая включена в Joomla 3.0. Здесь перечислены вопросы, которые потенциально нарушают расширения.

Пожалуйста, помогите сделать этот документ полный.

Сравнение проводится с Joomla 2.5/Платформа 11.4.

Проблемы с обратной совместимостью для Joomla 2.5 смотрите в статье: Потенциальные проблемы обратной совместимости в Joomla 2.5 и платформы Joomla 11.4.

Платформа

В платформе удалено большое количество устаревших классов и методов. Для большинства расширений написанных для Joomla 2.5, необходимые изменения должны быть достаточно небольшими. Обратите внимание, что ещё существуют устаревшие классы в этой платформе, которые будут исключены в будущих версиях – разработчики должны прекратить их использование там, где это возможно.

Обновлённые системные требования

Системные требования изменились в следующих пунктах:

  • PHP 5.3.1
  • register_globals должен быть выключен
  • magic_quotes_gpc должен быть выключен

Общие изменения

  • Почти все функции, методы, члены и классы, помеченные как устаревшие в платформе 11.4, были удалены. Они не перечислены в этом документе.
  • Добавление ?no_html для URL, чтобы получить RAW представление, больше не поддерживается (это была старая функция Joomla 1.0).
  • Константа DS была удалена. Если вы действительно нуждаетесь в ней, вы можете использовать вместо – DIRECTORY_SEPARATOR.
  • Имена модулей теперь должны начинаться с "mod_".
  • Теперь расширения необходимо установить registeredurlparams, возврат обратно на URL-адрес был удален.
  • Некоторые cookies доступны только через HTTP (не через JavaScript). Например; файл cookie сессии.
  • Ввиду предстоящих изменений в реализации в платформе MVC – JModel, JView и JController используются повторно как имена новых интерфейсов. На данный момент, в место них используйте: JModelLegacy, JViewLegacy и JControllerLegacy.
  • JFolder и JFile теперь требуют вас сделать своё собственное заявление jimport (вы всегда должны были это делать, просто раньше было довольно вероятно, что что-то другое было загружено до них).
  • Joomla 3.0 обычно выдаёт исключения вместо возвращения JError или JException. Для получения дополнительной информации смотрите: Потенциальные проблемы обратной совместимости в Joomla 1.7 и платформы 11.1.

Изменения в инсталляторе расширений

  • Использование <install> базовый тег (от 1.5) больше не поддерживается; вместо него следует использовать <extension>.
  • Поддержка install_script и uninstall_script и методы com_install и com_uninstall в этих скриптах, были удалены; вместо них используйте scriptfile.
  • В расширений языка, поддержка client="both" была удалена; вместо этого готовьте каждого клиента как отдельное расширение и при необходимости связывайте их как пакет расширения.
  • Пути файлов для плагинов больше не поддерживают старый метод 1.5 (то есть: plugins/system/cache.php); каждый плагин теперь должны быть в своей собственной папке (то есть: plugins/system/cache/cache.php).

Изменения в компонентах

  • В административной части компонента admin.*.php и toolbar.*.php больше не включаются автоматически (эта функция была унаследована от Joomla 1.0).

Перемещенные файлы

Все классы, перечисленные здесь должны теперь быть автоматически загружаемые. Explicit requires и includes have должны быть изменены или удалены.

События плагина

  • Событие onContentBeforeSave теперь получает $article по значению не по ссылке.
    Пример определения: public function onContentBeforeSave($context, $article, $isNew).
  • Событие onContentAfterSave теперь получает $article по значению не по ссылке.
    Пример определения: public function onContentAfterSave($context, $article, $isNew).

Переименованные классы

  • JFTP теперь называется JClientFtp
  • JLDAP теперь называется JClientLdap
  • JWebClient теперь называется JApplicationWebClient

Удалённые классы

  • JParameter (используйте JForm вместо этого или, в большинстве случаев, JRegistry - например, для извлечения в компоненте параметров плагина)
  • JElement и его подклассы
  • JFormFieldEditors (вместо этого используйте JFormFieldPlugins)
  • JHtmlImage
  • JRules (вместо этого используйте JAccessRules)
  • JSimpleXML
  • JPane

Изменения в классах

Базовые классы

JFactory

  • JFactory::getXMLParser() был удалён. Для RSS и Atom случаев, используйте JFactory::getFeedParser(). Для чтения XML файлов или строк используйте JFactory::getXML().
  • JFactory::_createConfig() был удалён. Вместо этого используйте JFactory::createConfig().
  • JFactory::_createSession() был удалён. Вместо этого используйте JFactory::createSession().
  • JFactory::_createDbo() был удалён. Вместо этого используйте JFactory::createDbo().
  • JFactory::_createMailer() был удалён. Вместо этого используйте JFactory::createMailer().
  • JFactory::_createDocument() был удалён. Вместо этого используйте JFactory::createDocument().

Application

JApplicationHelper

  • JApplicationHelper::getPath() был удалён. Нет замены.
  • JApplicationHelper::_checkPath() был удалён. Нет замены.

Компонент

JComponentHelper

  • Поведение JComponentHelper::isEnabled() было изменено, чтобы соответствовать ожиданиям разработчиков.

MVC

JController

  • JController::$_acoSection был удалён.
  • JController::$_acoSectionValue был удалён.
  • JController::authorize() был удалён. Вместо этого используйте JController::authorise().
  • JController::setAccessControl() был удалён. Вместо этого используйте JAccess.
  • JController::getInstance() был удалён. Вместо этого используйте JControllerLegacy::getInstance().

JControllerLegacy

  • JControllerLegacy::display() требует дополнительного параметра ($cachable = false, $urlparams = false).

JModelAdmin

  • JModelAdmin::generateNewTitle() обратно совместим с Joomla 2.5 (первый параметр был удален).
  • JModelAdmin::prepareTable(): первый параметр больше не ссылка.

Archive

Adapters

  • JArchiveBzip2 больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JArchiveGzip больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JArchiveTar больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JArchiveZip больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.

Base

JObject

  • JObject::toString() был удалён. Вместо этого используйте JObject::__toString().

Client

JClientLdap (ранее JLDAP)

  • JClientLdap больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.

Database

JDatabase был переименован в JDatabaseDriver. JDatabase все еще действует (но является устаревшим) и является базой JDatabaseDriver. Таким образом, тип подсказки и экземпляр проверок продолжают работать.

В связи с ленивым-подключением, подключение открывается только при выполнении запроса или явным вызовом JDatabaseDriver::connected(). Остерегайтесь при проверке JDatabaseDriver::connected().

JDatabase

  • JDatabase::$hasQuoted был удалён.
  • JDatabase::$quoted был удалён.
  • JDatabase::addQuoted() был удалён.
  • JDatabase::hasUTF() был удалён.
  • JDatabase::debug() был удалён. Вместо этого используйте JDatabase::setDebug().
  • JDatabase::explain() был удалён.
  • JDatabase::getEscaped() был удалён. Вместо этого используйте JDatabase::escape().
  • JDatabase::getTableFields() был удалён. Вместо этого используйте JDatabase::getTableColumns().
  • JDatabase::getTicker() был удалён. Вместо этого используйте JDatabase::count().
  • JDatabase::isQuoted() был удалён.
  • JDatabase::loadResultArray() был удалён. Вместо этого используйте JDatabase::loadColumn().
  • JDatabase::nameQuote() был удалён. Вместо этого используйте JDatabase::quoteName().
  • JDatabase::queryBatch() был удалён.
  • JDatabase::query() является устаревшим. В качестве альтернативы должно использоваться JDatabase::execute().

Файл

JFile

  • JFile::read() является устаревшим. Вместо этого используйте file_get_contents().

Документ

JDocument

  • JDocument::setMetaData() аргумент $sync был удалён.

JDocumentRenderer

  • JDocumentRenderer больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.

JDocumentFeed

  • JFeedItem больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JFeedEnclosure больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JFeedImage больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.

JDocumentOpenSearch

  • JOpenSearchUrl больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JOpenSearchImage больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.

JDocumentXml

  • JDocumentXml::$_name был переименован в JDocumentXml::$name.

Environment

JBrowser

  • JBrowser больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JBrowser::setQuirk() был удалён.
  • JBrowser::hasQuirk() был удалён.
  • JBrowser::getQuirk() был удалён.
  • JBrowser::setFeature() был удалён.
  • JBrowser::hasFeature() был удалён.
  • JBrowser::getFeature() был удалён.
  • JBrowser::$_majorVersion был переименован в JBrowser::$majorVersion.
  • JBrowser::$_minorVersion был переименован в JBrowser::$minorVersion.
  • JBrowser::$_browser был переименован в JBrowser::$browser.
  • JBrowser::$_agent был переименован в JBrowser::$agent.
  • JBrowser::$_lowerAgent был переименован в JBrowser::$lowerAgent.
  • JBrowser::$_accept был переименован в JBrowser::$accept.
  • JBrowser::$_accept_parsed был переименован в JBrowser::$acceptParsed.
  • JBrowser::$_platform был переименован в JBrowser::$platform.
  • JBrowser::$_robots был переименован в JBrowser::$robots.
  • JBrowser::$_mobile был переименован в JBrowser::$mobile.
  • JBrowser::$_images был переименован в JBrowser::$images.

JRequest

  • JRequest::clean() был удалён.
  • JRequest::_cleanVar() теперь защищён.
  • JRequest::getCmd() является устаревшим. Вместо этого используйте JFactory::getApplication()->input->get().
  • JRequest::getVar() является устаревшим. Вместо этого используйте JFactory::getApplication()->input->get().
  • JRequest::checkToken() является устаревшим. Вместо этого используйте JSession::checkToken(). Если вы используете JRequest::checkToken('default'), используйте JSession::checkToken('request').

JUri

  • JURI был переименован в JUri. Автозагрузчик еще в состоянии распознать старое имя.
  • JUri больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JUri::$_uri был переименован в JUri::$uri.
  • JUri::$_scheme был переименован в JUri::$scheme.
  • JUri::$_host был переименован в JUri::$host.
  • JUri::$_port был переименован в JUri::$port.
  • JUri::$_user был переименован в JUri::$user.
  • JUri::$_pass был переименован в JUri::$pass.
  • JUri::$_path был переименован в JUri::$path.
  • JUri::$_query был переименован в JUri::$query.
  • JUri::$_fragment был переименован в JUri::$fragment.
  • JUri::$_vars был переименован в JUri::$vars.

Error

JError

  • JError является устаревшим. Вместо этого используйте Exceptions.
  • Внимание: Многие функции, которые ранее возвращали JError или false в настоящее время генерируют исключения.

Пожалуйста, смотрите: Потенциальные проблемы обратной совместимости в Joomla 1.7 и платформы 11.1 для получения дополнительной информации.

JProfiler

  • JProfiler больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JProfiler::$_start был переименован в JProfiler::$start.
  • JProfiler::$_prefix был переименован в JProfiler::$prefix.
  • JProfiler::$_buffer был переименован в JProfiler::$buffer.
  • JProfiler::$_previous_time был переименован в JProfiler::$previousTime.
  • JProfiler::$_previous_mem был переименован в JProfiler::$previousMem.
  • JProfiler::$_iswin был переименован в JProfiler::$isWin.

Filesystem

JStream

  • JStream::$_fh был переименован в JStream::$fh.
  • JStream::$_filesize был переименован в JStream::$filesize.
  • JStream::$_context был переименован в JStream::$context.
  • JStream::$_contextOptions был переименован в JStream::$contextOptions.
  • JStream::$_openmode был переименован в JStream::$openmode.

JStreamString

  • JStream::$_currentstring был переименован в JStream::$currentString.
  • JStream::$_path был переименован в JStream::$path.
  • JStream::$_mode был переименован в JStream::$mode.
  • JStream::$_options был переименован в JStream::$options.
  • JStream::$_opened_path был переименован в JStream::$openedPath.
  • JStream::$_pos был переименован в JStream::$pos.
  • JStream::$_len был переименован в JStream::$len.
  • JStream::$_stat был переименован в JStream::$stat.

Filter

JFilterInput

  • JFilterInput больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.

HTML

JHtml

  • JHTML был переименован в JHtml. Автозагрузчик еще в состоянии распознать старое имя.
  • JHtml::_includeRelativeFiles() был удалён. Вместо этого используйте JHtml::includeRelativeFiles().
  • JHtml::core() был удалён. Вместо этого используйте JHtmlBehavior::framework().
  • JHtml::script() больше не поддерживает строку в качестве второго параметра. Это путь к файлу в Joomla 1.5 и было удалено сейчас.
  • JHtml::stylesheet() больше не поддерживает строку в качестве второго параметра. Это путь к файлу в Joomla 1.5 и было удалено сейчас.

JHtmlAccess

  • JHtmlAccess::assetgroups() – аргумент $config был удален. Он ранее не использовался.

JHtmlBehavior

  • JHtmlBehavior::mootools() был удален. Вместо этого используйте JHtmlBehavior::framework().
  • JHtmlBehavior::noframes() – аргумент $location был удалён. Он ранее не использовался.

JHtmlList

  • JHtmlList::ordering() – аргумент $chop был удалён. Он ранее не использовался.
  • JHtmlList::users() – аргумент $reg был удалён.

JHtmlSelect

  • JHtmlSelect::$_optionDefaults был переименован в JHtmlSelect::$optionDefaults.

JToolBar

  • JToolBar больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.
  • JToolBar больше не поддерживает функции 'X' (например, addNewX, editListX) что скрыть главное меню перед выполнением функции.

JButton

  • JButton больше не распространяется на JObject. Вы не должны использовать любой из методов JObject's.

JPagination

  • JPagination::$_viewall был переименован в JPagination::$viewall.
  • JPagination::$_additionalUrlParams был переименован в JPagination::$additionalUrlParams.

Installer

JInstaller

  • JInstaller::getOverwrite() был удалён. Вместо этого используйте JInstaller::isOverwrite().
  • JInstaller::getUpgrade() был удалён. Вместо этого используйте JInstaller::isUpgrade().
  • JInstaller::$_paths был переименован в JInstaller::$paths.
  • JInstaller::$_upgrade был переименован в JInstaller::$upgrade.
  • JInstaller::$_overwrite был переименован в JInstaller::$overwrite.
  • JInstaller::$_stepStack был переименован в JInstaller::$stepStack.

JInstallerLanguage

  • JInstallerLanguage::$_core был переименован в JInstallerLanguage::$core.

Language

JLanguage

  • JLanguage::getPluralSufficesCallback() был удалён. Вместо этого используйте JLanguage::getPluralSuffixesCallback().
  • JLanguage::_parseLanguageFiles() был удалён. Вместо этого используйте JLanguage::parseLanguageFiles().
  • JLanguage::_parseXMLLanguageFiles() был удалён. Вместо этого используйте JLanguage::parseXMLLanguageFiles().
  • JLanguage::_parseXMLLanguageFile() был удалён. Вместо этого используйте JLanguage::parseXMLLanguageFile().
  • JLanguage::loadLanguage() – аргумент $overwrite был удалён. Он ранее не использовался.

Registry

JRegistry

  • JRegistry::loadXML() был удалён. Вместо этого используйте JRegistry::loadString().
  • JRegistry::loadINI() был удалён. Вместо этого используйте JRegistry::loadString().
  • JRegistry::loadJSON() был удалён. Вместо этого используйте JRegistry::loadString().
  • JRegistry::makeNameSpace() был удалён. Нет замены.
  • JRegistry::getNameSpaces() был удалён. Нет замены.
  • JRegistry::getValue() был удалён. Вместо этого используйте JRegistry::get().
  • JRegistry::setValue() был удалён. Вместо этого используйте JRegistry::set().
  • JRegistry::loadSetupFile() был удалён. Нет замены.

JRegistryFormatINI

  • JRegistryFormatINI::stringToObject() – второй аргумент ($option) не может иметь булев значение больше.

JRegistryFormatJSON

  • JRegistryFormatJSON::stringToObject() – второй аргумент ($option) не может иметь булев значение больше.

Session

JSessionStorageDatabase

  • JSessionStorageDatabase::$_data был переименован в JSessionStorageDatabase::$data.

Table

JTable

  • JTable::getInstance() параметры теперь являются чувствительными к регистру, например 'MenuType'.
  • JTable::canDelete() был удалён.
  • JTable::toXML() был удалён.

Updater

JUpdate

  • JUpdate::$_xml_parser был переименован в JUpdate::$xmlParser.
  • JUpdate::$_stack был переименован в JUpdate::$stack.
  • JUpdate::$_state_store был переименован в JUpdate::$stateStore.
  • JUpdate::$_current_update был переименован в JUpdate::$currentUpdate.

JUpdater

  • JUpdater::arrayUnique() был удалён. Вместо этого используйте JArrayHelper::arrayUnique().

User

JAuthentication

  • Константа JAUTHENTICATE_STATUS_SUCCESS была удалена. Вместо этого используйте JAuthentication::STATUS_SUCCESS.
  • Константа JAUTHENTICATE_STATUS_CANCEL была удалена. Нет замены.
  • Константа JAUTHENTICATE_STATUS_FAILURE была удалена. Вместо этого используйте JAuthentication::STATUS_FAILURE.
  • JAuthentication::$_observers был переименован в JAuthentication::$observers.
  • JAuthentication::$_state был переименован в JAuthentication::$state.
  • JAuthentication::$_methods был переименован в JAuthentication::$methods.

JUser

  • JUser::getParameters() был удалён.
  • Juser::authorisedLevels() был удалён. Вместо этого используйте JUser::getAuthorisedViewLevels().
  • Juser::authorize() был удалён. Вместо этого используйте JUser::authorise().
  • JUser::$usertype был удалён.

Utility

JBuffer

  • JBuffer::$_buffers был переименован в JBuffer::$buffers.

JDate

  • JDate::toMysql() был удален. Вместо этого используйте JDate::toSql().
  • JDate::toFormat() был удалён. Вместо этого используйте JDate::format().
  • JDate::setOffset() был удалён. Вместо этого используйте JDate::setTimezone().
  • JDate::$offsets был удалён.
  • JDate::__construct() больше не принимает числовое значение для $tz.
  • JDate::$_tz был переименован в JDate::$tz.

JUtility

  • JUtility::sendMail() был удалён. Вместо этого используйте JMail::sendMail().
  • JUtility::sendAdminMail() был удалён. Вместо этого используйте JMail::sendAdminMail().
  • JUtility::getHash() был удалён. Вместо этого используйте JApplication::getHash().
  • JUtility::getToken() был удалён. Вместо этого используйте JSession::getFormToken().
  • JUtility::isWinOS() был удалён. Вместо этого используйте JApplication::isWinOS().
  • JUtility::dump() был удалён. Нет замены.
  • JUtility::array_unshift_ref() был удалён. Нет замены.
  • JUtility::array_unshift_ref() был удалён. Нет замены.

JXMLElement

  • JXMLElement::data() был удалён.
  • JXMLElement::getAttribute() был удалён. Вместо этого используйте SimpleXMLElement::attributes().

JavaScript

  • Совместимость с MooTools 1.2 не поддерживается.
  • Формы, которые имеют name="adminForm" в настоящее время также требуют id="adminForm".
  • checkAll() был удалён. Вместо этого используйте Joomla.checkAll().
  • isChecked() был удалён. Вместо этого используйте Joomla.isChecked().
  • popupWindow() был удалён. Вместо этого используйте Joomla.popupWindow().
  • tableOrdering() был удалён. Вместо этого используйте Joomla.tableOrdering().

CMS

Общие изменения

  • JUtility не всегда загружается. Если вам это нужно, вы должны добавитьв код – jimport('joomla.utilities.utility').

Изменения в классах

Классы компонентов

  • MenusModelItem::getItem() больше не возвращает JObject но использует stdClass.

Help

JHelp

  • JHelp::createSiteList() – аргумент $selected был удалён. Он ранее не использовался.

Примеры

Изменения для доступа к параметрам модуля вне модуля

// Для доступа к параметрам модуля внутри плагина
// изменённый код от:
$module = JModuleHelper::getModule('jbolo');
$moduleParams = new JParameter($module->params);
$chatmode=intval($moduleParams->get('modorbar', 1));
// к:
$module = JModuleHelper::getModule('jbolo');
$moduleParams = json_decode($module->params)
$chatmode = $moduleParams->modorbar;

Изменён прототип функции во всех контроллерах

// из:
function display()
// к:
public function display($cachable = false, $urlparams = false)

Изменения в форматирование даты - (используйте как родной php стиль)

// Для достижения формата даты: 6:27PM October 12:
// было:
SENT_AT_FORMAT="%l:%M%p %B %e";
// теперь:
SENT_AT_FORMAT="g:iA F y";

// Для достижения формата даты: Среда, 03 Октябрь 2012: 
// было:
HIST_DATE_FORM="%A %e %B %Y";
// теперь:
HIST_DATE_FORM="l, d F Y";

JFactory::getXMLParser() был удалён, используйте JFactory::getXML()

// было:
$parser = JFactory::getXMLParser('Simple');
$xml = JPATH_COMPONENT.DS.'jbolo.xml';
$parser->loadFile($xml);
$doc = $parser->document;
$element = $doc->getElementByPath('version');
$version = $element->data();
// теперь:
$xml = JFactory::getXML(JPATH_COMPONENT.'/jbolo.xml');
$version = (string)$xml->version;

JDate::toMysql()был удалён. Вместо этого используйте JDate::toSql()

 // было:
$get_date=JFactory::getDate();
$date=$get_date->toMysql();

// теперь:
$get_date=JFactory::getDate();
$date=$get_date->toSql();

JFile::read является устаревшим. Используйте синтаксис file_get_contents()

 // было:

$smileysfile  = JFile::read(JPATH_COMPONENT . DS . 'smileys.txt');

// теперь:

$smileysfile = file_get_contents(JPATH_COMPONENT . '/smileys.txt');

JRequest является устаревшим. Используйте JFactory::getApplication()->input

// было: 
$post = JRequest::get('post'); JRequest::getVar('badwords');

// теперь:
$input = JFactory::getApplication()->input;
$post  = $input->post; $input->post->get('badwords')

// из:
$task = JRequest::getVar('task');
// к:
$task = $input->get('task');
// из:
$groupid = JRequest::getVar('id');

// к:
$groupid = $input->get('id');

// из:
$limitstart = JRequest::getVar('limitstart', 0, '', 'int');

// к:
$limitstart = $input->get('limitstart','0','INT');
// из:
$controller = JRequest::getWord('controller');
// к:
$controller = $input->get('controller');
// из:
$controller->execute(JRequest::getCmd('action'));
// к:
$controller->execute($input->get('action'));
// из:

$id = JRequest::getInt('id');
// к:
$id = $input->getInt('id');

JViewLegacy::assignRef является устаревшим. Используйте родной синтаксис PHP

 // было:
$this->assignRef('userlist', $userlist );
// теперь:
$this->userlist = &$userlist

Все эти проблемы в полный рост проявилиись при переходе на Joomla 4 . Там как раз и отменили все устаревшие в Joomla 3 классы.