Intégration Ajax sans charger le Framework Typo3 avec eID
Cet article traite d’un problème souvent rencontré avec Typo3.
Voici la problématique:
Vous avez besoin de faire de l’Ajax sans charger la totalité du Framework Typo3 tout en ayant besoin quand même des méthodes d’abstraction de la base de données.
Le mécanisme eID va vous aider, pour cela voici une implémentation simple pour utiliser l’object
$GLOBALS['TYPO3_DB']
ainsi que la langue:
$GLOBALS['LANG']
1) Configuration d’un plugin Typo3 avec eID:
Tout d’abord il va falloir ajouter dans le fichier ext_localconf.php (de votre « plugin ») le chemin vers votre classe qui va faire de l’Ajax (tx_pluginname_ajax.php est un nom arbitraire):
$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include'][$_EXTKEY] = 'EXT:'.$_EXTKEY.'/res/ajax/class.tx_pluginname_ajax.php';
2) Implémentation de la classe avec eID
Voici un exemple simple de classe avec eID:
// ... class tx_pluginname_ajax { private $extKey = 'extname'; private $localLangFile; private $localLangLabel; public function main() { $this -> initDBObject(); $this -> initLangObject(); $this -> includeLocalLang(); } private function initDBObject() { tslib_eidtools::connectDB(); } private function initLangObject() { tslib_eidtools::initLanguage(); } private function includeLocalLang() { $this -> localLangFile = t3lib_extMgm::extPath($this -> extKey).'pi1/locallang.xml'; $this -> localLangLabel = t3lib_div::readLLXMLfile($this -> localLangFile, $GLOBALS['LANG'] -> lang); return $this -> localLangLabel; } // Votre code ... if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/extname/res/ajax/class.tx_pluginname_ajax.php']) { include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/extname/res/ajax/class.tx_pluginname_ajax.php']); } // Attention, instancier la classe $SOBE = t3lib_div::makeInstance('tx_pluginname_ajax'); $SOBE -> main(); // ...
Par la suite vous pourrez utiliser les objects suivants:
$GLOBALS['TYPO3_DB'] -> exec_SELECTquery($select, $from, $where);
$GLOBALS['LANG'] -> getLLL($this -> extKey.'.my_label_name', $this -> localLangLabel);
Voilà pour la classe eID, maintenant nous allons voir comment appeler cette classe depuis notre « plugin ».
3) Comment appeler la classe eID depuis un plugin Typo3
// ... require_once(PATH_tslib.'class.tslib_pibase.php'); class tx_pluginname_pi1 extends tslib_pibase { public $extKey = 'extname'; private $ajaxFile; // ... function main($content, $conf) { $this -> conf = $conf; $this -> pi_setPiVarDefaults(); $this -> pi_loadLL(); $this -> pi_USER_INT_obj = 1; $this -> ajaxFile = $this -> pi_getPageLink($GLOBALS['TSFE'] -> id).'?eID='.$this -> extKey; // Votre code ... return $this->pi_wrapInBaseClass($this -> content); } // ... ?>
Vous pourrez évidemment ajouter des paramètres à l’attribut $ajaxFile.
4) Ajouter le mécanisme JavaScript (avec JQuery par exemple)
Ne pas oublier dans votre « plugin » de faire un « event » pour appeler la page avec la classe eID puis de faire un « Call » JavaScript qui va récupérer les données en JSON par exemple, voici une base de code:
jQuery.ajax({ url: '?eID=extname', data: 'callType=' + callType + '&arg1=' + arg1 + '&pid=' + pid, dataType: 'json', type: 'post', success: function (j) { id.html(j.result); } });
Voilà, évidemment, ce code est une base, il vous faudra l’adapter en fonction de votre environnement.