Cet article regroupe les différents cas que j'ai eu à résoudre pour effectuer la migration d’extensions vers J4.
Il est évolutif et se complètera au fus et à mesure.
Après la paragraphe recensant quelques liens vers des articles utiles, vous trouverez un petit récapitulatif de ce que j'ai rencontré comme correction pour passer une extension de Joomla3 à Joomla4.
Cette liste n'est pas exhaustive bien sûr, et se complétera au fur et à mesure
Documentation
Avant tout voici déjà quelques publications concernant le migration d’extension de J3 vers J4 :
- https://docs.joomla.org/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x/fr
- https://docs.joomla.org/Potential_backward_compatibility_issues_in_Joomla_4/fr
- https://docs.joomla.org/Potential_backward_compatibility_issues_in_Joomla_4
- https://developer.joomla.org/news/764-joomla-3-10-and-joomla-4-0.html
JApplication
isAdmin() deprecated 4.0 Use isClient('administrator') instead.
Remplacer JFactory::getApplication()->isAdmin() par JFactory::getApplication()->isClient('administrator')
JRequest
Remplacer JRequest::get par JFactory::getApplication()->input->get
JError
Remplacer
JError::raiseWarning('',
par
JFactory::getApplication()->enqueueMessage(
et ajouter 'WARNING' en dernier paramètre.
JDispatcher
- Deprecated class placeholder. You should use JEventDispatcher instead
- The CMS' Event classes will be replaced with the `joomla/event` package
Actuellement (exemple) :
$dispatcher = JDispatcher::getInstance();
$result = $dispatcher->trigger('onContentBeforeSave', array($this->_context, &$table, $isNew, $data));
Supprimer $dispatcher = JDispatcher::getInstance();
remplacer $result = $dispatcher->trigger('onContentBeforeSave', array($this->_context, &$table, $isNew, $data));
par $result = Factory::getApplication()->triggerEvent('onContentBeforeSave', array($this->_context, &$table, $isNew, $data));
JRegistry
JRegistry::getInstance : si l'objet et de passer l'information du model à la vue, recuperer l'information d'une autre manière (getItem et getState par exemple)
JViewLegacy
Remplacer $this->assign('P1',$P2) et $this->assignRef('P1',$P2)
par : $this->P1 = $P2;
JDataBase
Remplacer :
if (!$db->query()) {
Factory::getApplication()->enqueueMessage($db->getErrorMsg(),'ERROR');
return false;
}
par
try {
$db->execute();
} catch (Exception $e) {
Factory::getApplication()->enqueueMessage(JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()),'ERROR');
return false;
}
Idem il faut remplacer les $db->getErrorNum() et les $db->getErrorMsg() par une gestion des exceptions comme ci-dessus.
Par exemple, remplacer :
$db->setQuery($query);
$results = $db->loadObjectList();
if ($db->getErrorNum()) {
JFactory::getApplication()->enqueueMessage($db->getErrorMsg(),'WARNING');
return false;
}
par
$db->setQuery($query);
try {
$results = $db->loadObjectList();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage(JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()),'ERROR');
return false;
}
Query
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(...)->limit('10');
Il faut remplacer la methode limit par SetLimit()
JHtml
remplacer JHtml::_('behavior.formvalidation');
par JHtml::_('behavior.formvalidator');
remplacer JHtml::_('behavior.tooltip');
par JHtml::_('bootstrap.tooltip');
JForm
- Use renderField() instead of getControlGroup
- Use renderFieldset() instead of getControlGroups
Exemple :
Chercher : form->getControlGroup(
et remplacer par form->renderField(
Installer
Remplacer $parent->get('manifest')->version
par $parent->getManifest()->version