[Joomla 3] Passage de composant joomla 2.5 vers 3

mercredi 7 janvier 2015

Le passage d’une version de joomla 2.5 vers 3 est en soit assez simple concernant le core de Joomla.
Il suffit de mettre à jour depuis la section Joomla Update de l’administrator.

Il est aussi conseillé de faire un fix de la base de donnée après le passage du core de joomla.
Pour se faire, allez dans System > Global check-in et faites un check-in de toutes les tables.

J’ai aussi eu pour certaines mises à jour du core de joomla des erreurs dans certaines sections de l’admin, généralement pour les résoudre, je devais recopié manuellement des dossiers d’un joomla vierge vers le joomla bugé.

Si vous avez l’erreur suivante dans l’administrator: Error loading library: joomla, Library not found

-- EXECUTER LA QUERY SUIVANTE
INSERT INTO rec_extensions (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES (NULL, 'Joomla! Platform', 'library', 'joomla', '', '0', '1', '1', '0', '{"name":"Joomla! Platform","type":"library","creationDate":"2008","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"http:\\/\\/www.joomla.org","version":"13.1","description":"LIB_JOOMLA_XML_DESCRIPTION","group":""}', '{"mediaversion":"10cce6f7e69d5cb1beb959ceb74acb46"}', '', '', '0', '0000-00-00 00:00:00', '0', '0');

Par contre concernant la mise à jour des composants c’est une autre paire de manche.
Voici la liste des changements que j’ai du opérer sur mes différents composants développés:

Erreur: Call to undefined method Error getValue()
//JOOMLA 2.5
$langId = JFactory::getConfig()->getValue('config.language');

//JOOMLA 3
$langId = JFactory::getConfig()->get('config.language');
Notice: Use of undefined constant DS – assumed ‘DS’ i

Ajouter le code suivant

//JOOMLA 3
if(!defined('DS')){
   define('DS',DIRECTORY_SEPARATOR);
}

Si jamais vous avez plusieurs modules qui ont cette erreur, il est aussi possible d’installer un plugin qui se charge de définir cette constante dans tous les modules/components. Ce plugin est DS Constant for Joomla! 3.0 téléchargeable ici
Il suffit d’aller dans l’extension manager et d’installer le plugin, ensuite aller dans plugin manager, il faut juste l’activer.

Erreur: Composant introuvable dans le backend
//JOOMLA 3
Renommer le fichier admin.component.php par component.php
Call to undefined method JApplicationHelper::getPath()
//JOOMLA 3
//Cette méthode a été retirée du framework faire un include comme ceci:
include( JPATH_SITE . DS . 'administrator' . DS . 'components' . DS . 'com_dfcontact' . DS . 'admin.dfcontact.html.php' );
Erreur: xxx cannot extend from interface JController

il faut changer dans toutes les vues/controllers/model

/Changes to model-
//from
class JboloModelSendFile extends JModel
//to
class JboloModelSendFile extends JModelLegacy
<br>//Changes to controller-
//from
class JboloController extends JController
//to
class JboloController extends JControllerLegacy
<br>//Changes to view-
//from
class JboloViewHistory extends JView
//to
class JboloViewHistory extends JViewLegacy
Call to undefined method JModel addIncludePath()
//JOOMLA 2.5
JModel::addIncludePath(JPATH_SITE.DS.'components'.DS.'com_xxxx'.DS.'models');
//JOOMLA 3.0
JModelLegacy::addIncludePath(JPATH_SITE.DS.'components'.DS.'com_xxxx'.DS.'models');
Call to undefined method JDate::toMySQL()
//JOOMLA 2.5
$now = $date->toMySQL(); 
//JOOMLA 3.0
$now = $date->toSQL(); 
Call to undefined method Joomla\Registry\Registry::loadJSON()
//JOOMLA 2.5
$params->loadJSON($items[$i]->params);
//JOOMLA 3.0
$params->loadString($items[$i]->params, 'JSON');
Call to undefined method JController::getInstance()
//JOOMLA 2.5
$controller = JController::getInstance('HelloWorld');
//JOOMLA 3.0
$controller  = JControllerLegacy::getInstance('HelloWorld');

Si jamais vous avez des erreurs 500 avec des queries dans le backend qui n’ont pas de valeur par défaut pour les order, il faut modifier la fonction getListQuery de JmodelList

//JOOMLA 2.5
$orderCol	= $this->state->get('list.ordering');
$orderDirn	= $this->state->get('list.direction');
$query->order($db->getEscaped($orderCol.' '.$orderDirn));

//JOOMLA 3.0
$query->order($db->escape($this->getState('list.ordering', 'default_sort_column')).' '.
                		$db->escape($this->getState('list.direction', 'ASC')));

Call to a member function getKeyName() on a non-object in /libraries/legacy/controller/form.php on line 373

Dans ce cas-ci, il manque la création du fichier helloworld.php dans un folder tables, ce fichier doit contenir au moins le constructeur HelloworldTable.

Call to undefined method JUtility::getHash()
//JOOMLA 2.5
jimport('joomla.utilities.utility');
JUtility::getHash();
//JOOMLA 3.0
jimport( 'joomla.application.application');
JApplication::getHash();

Pour plus d’aide voici deux liens:

Expérience d’un développeur
Documentation officielle.

Tags: joomla 3