conf.php
Transcription
conf.php
BACKEND MODULE Auteur : Philippe Leblond Compagnie : Sys-Tech (http://www.sys-tech.net) Référence obligatoire pour les backend module : http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/ conf.php Accès : $MCONF['access']='user,group,admin'; Valeur possible : user : utilisateur (On pourra mettre des permissions sur les utilisateur qui auront accès à ce module) group : groupe (On pourra mettre des permissions sur les groupes utilisateur qui auront accès à ce module) admin : administrateur (Les administrateurs auront accès à ce module) Script à utiliser : $MCONF['script']='_DISPATCH'; //appelera par défaut index.php La valeur par défaut est _DISPATCH mais on peut utilise un autre script exemple : $MCONF['script']='allo.php'; //non recommandé Icone du module backend : $MCONF['default']['tabs_images']['tab']='moduleicon.gif'; Module de traduction pour les termes généraux relié au backend : $MCONF['default']['11_ref']='LLL:EXT:st_kitchen/mod1/locallang_mod.php'; Workspace permission : $MCONF['workspaces'] = “online,offline,custom”; Valeur possible : online : Permet en mode live offline : Permit en mode draft custom : Permit dans les workspace personnonalisé Localisation global $LANG $LANG->getLL('function1') Menu fonction Pour ajouter des menus : function menuConfig() { global $LANG; $this->MOD_MENU = Array ( 'function' => Array ( '1' => $LANG->getLL('function1'), '2' => $LANG->getLL('function2'), '3' => $LANG->getLL('function3'), ) ); parent::menuConfig(); } Pour récupérer le numéro du menu contextuel : $this->MOD_SETTINGS['function'] TYPO3 Core Engine (TCE) Le TYPO3 core engine permet d'exécuter des commandes et faire des requêtes SQL sans avoir à écrire des longues lignes de code php et des requêtes SQL. De plus il prend en compte tous les paramètres et permission par défaut de TYPO3. Il y a donc moins de chance de se tromper en utilisant le TCE que faire nous même nos requêtes SQL. Documentation : http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/ 3/3/ Data : (création ou modification) Syntaxe pour une modification : $data[ tablename ][ uid ][ fieldname ] = value Exemple pour une création : $data['pages']['NEW9823be87'] = array( "title" => "The page title", "subtitle" => "Other title stuff", "pid" => "45" ); Soumission d'une data $tce = t3lib_div::makeInstance('t3lib_TCEmain'); $tce->stripslashes_values = 0; $tce->start($data,array()); $tce->process_datamap(); Pour récuper le id d'un nouvel enregistrement : $tce->substNEWwithIDs[$id]; Cmd : (delete,move,copy) Syntaxe pour une supression : $cmd[table][uid][commande] = valeur; Exemple pour une suppression : $cmd['pages'][66]['delete'] = 1; Soumission d'une commande : $tce = t3lib_div::makeInstance('t3lib_TCEmain'); $tce->stripslashes_values=0; $tce->start(array(),$cmd); $tce->process_cmdmap(); Création de lien et le TCE Méthode editOnClick Création d'un lien pour éditer une table du TCA : //Éditer la page ayant comme uid 66 $params='&edit[pages][66]=edit'; $link = '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params)).'">Edit</a>'; //Éditer le titre de la page ayant comme uid 66 $params='&edit[pages][66]=edit&columnsOnly=title'; $link = '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params)).'">Edit</a>'; Création d'un lien pour créer un nouvel enregistrement dans une table : //Créer une page sous la page ayant comme uid 33 $params = '&edit[pages][33]=new&defVals[pages][title]=NewElement&defVals[pages][subtitle]=NewElement2'; $content.= '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$GLOBALS['BACK_PATH'])).'">'. 'Create new page inside page 33</a><br/>'; Méthode tce_db.php et alt_doc.php tce_db.php : SC_tce_db Class Reference Ce fichier TYPO3 permet d'exécuter des cmd et datamap. Document : http://typo3.org/documentation/document-library/core-documentation/doc_core_api/ 4.2.0/view/3/3/ Syntaxe : // id : page du backend // $this->MCONF['name'] : nom du module // $this->MOD_SETTINGS['function'] : menu $returnUrl="redirect=".$baseUrl.urlencode("mod.php?id={$this->id}&M={$this>MCONF['name']}&SET[function]={$this->MOD_SETTINGS['function']}{$param}"); $urlComplete = "{$baseUrl}tce_db.php?&cmd[{$table}][{$uidRecord}][delete]=1&{$returnUrl}"; alt_doc.php : SC_alt_doc Class Reference Permet de faire un rendu du TCA Syntaxe : // id : page du backend // $this->MCONF['name'] : nom du module // $this->MOD_SETTINGS['function'] : menu $returnUrl="returnUrl=".urlencode("mod.php?id={$this->id}&M={$this>MCONF['name']}&SET[function]={$this->MOD_SETTINGS['function']}{$param}"); $editRecord = "edit[{$table}][{$uidRecord}]=edit"; $urlComplete = "{$baseUrl}alt_doc.php?{$returnUrl}&{$editRecord}"; Voici 2 fonctions pratiques pour les backend modules : /* * cmd : EDIT,NEW,DELETE */ function getUrlCmdRecord($table,$uidRecord,$cmd='EDIT',$param=array()) { if (count($param)>0) { $param = '&'.implode('&',$param); } $baseUrl = t3lib_div::getIndpEnv(TYPO3_REQUEST_DIR); $returnUrl="returnUrl=".urlencode("mod.php?id={$this->id}&M={$this>MCONF['name']}&SET[function]={$this->MOD_SETTINGS['function']}{$param}"); if (strcasecmp('EDIT',$cmd)==0) { $editRecord = "edit[{$table}][{$uidRecord}]=edit"; $urlComplete = "{$baseUrl}alt_doc.php?{$returnUrl}&{$editRecord}"; } elseif (strcasecmp('DELETE',$cmd)==0) { $returnUrl="redirect=".$baseUrl.urlencode("mod.php?id={$this->id}&M={$this>MCONF['name']}&SET[function]={$this->MOD_SETTINGS['function']}{$param}"); $urlComplete = "{$baseUrl}tce_db.php?&cmd[{$table}][{$uidRecord}][delete]=1&{$returnUrl}"; } else { $editRecord = "edit[{$table}][{$this->id}]=new"; $urlComplete = "{$baseUrl}alt_doc.php?{$returnUrl}&{$editRecord}"; } return $urlComplete; } /* * cmd : EDIT,NEW,DELETE */ function getIconCmd($table,$uidRecord,$cmd='EDIT',$param=array(),$width=16,$height=16,$addAttribute='') { $baseUrl = t3lib_div::getIndpEnv(TYPO3_REQUEST_DIR); if (strcasecmp('DELETE',$cmd)==0) { $icon = '<a '.$addAttribute.' href="'.$this>getUrlCmdRecord($table,$uidRecord,$cmd,$param).'"><img '.t3lib_iconWorks::skinImg($baseUrl,'sysext/t3skin/icons/gfx/garbage.gif').' width="'.$width.'" height="'.$height.'" alt="" /></a>'; } if (strcasecmp('EDIT',$cmd)==0) { $icon = '<a '.$addAttribute.' href="'.$this>getUrlCmdRecord($table,$uidRecord,$cmd,$param).'"><img '.t3lib_iconWorks::skinImg($baseUrl,'sysext/t3skin/icons/gfx/edit2.gif').' width="'.$width.'" height="'.$height.'" alt="" /></a>'; } if (strcasecmp('NEW',$cmd)==0) { $icon = '<a '.$addAttribute.' href="'.$this>getUrlCmdRecord($table,$uidRecord,$cmd,$param).'"><img '.t3lib_iconWorks::skinImg($baseUrl,'sysext/t3skin/icons/gfx/new_el.gif').' width="'.$width.'" height="'.$height.'" alt="" /></a>'; } return $icon; } Simulation du frontend en backend Il arrive parfois d'avoir besoin des méthodes du TSFE pour avoir accès aux méthode de la librairie tslib_cObj. Avec la méthode suivante on peut avoir accès aux méthodes de template ainsi qu'à l'objet typolink pour faire des liens en backend. Cette méthode peut causer certain problème car on est pas dans un contexte de frontend. function get_tsfe($pid = 1) { require_once(PATH_site.'typo3/sysext/cms/tslib/class.tslib_fe.php'); require_once(PATH_site.'t3lib/class.t3lib_userauth.php'); require_once(PATH_site.'typo3/sysext/cms/tslib/class.tslib_feuserauth.php'); require_once(PATH_site.'t3lib/class.t3lib_cs.php'); require_once(PATH_site.'typo3/sysext/cms/tslib/class.tslib_content.php') ; require_once(PATH_site.'t3lib/class.t3lib_tstemplate.php'); require_once(PATH_site.'t3lib/class.t3lib_page.php'); require_once(PATH_site.'t3lib/class.t3lib_timetrack.php'); $TSFEclassName = t3lib_div::makeInstanceClassName('tslib_fe'); $GLOBALS['TSFE'] = new $TSFEclassName($GLOBALS['TYPO3_CONF_VARS'], $pid, '0', 0, '','','',''); $temp_TTclassName = t3lib_div::makeInstanceClassName('t3lib_timeTrack'); $GLOBALS['TT'] = new $temp_TTclassName(); $GLOBALS['TT']->start(); $GLOBALS['TSFE']->config['config']['language']=$_GET['L']; $GLOBALS['TSFE']->id = $pid; $GLOBALS['TSFE']->connectToMySQL(); $sqlDebug = $GLOBALS['TYPO3_DB']->debugOutput; $GLOBALS['TYPO3_DB']->debugOutput = false; $GLOBALS['TSFE']->initLLVars(); $GLOBALS['TSFE']->initFEuser(); $GLOBALS['TSFE']->sys_page = t3lib_div::makeInstance('t3lib_pageSelect'); $GLOBALS['TSFE']->sys_page->init($GLOBALS['TSFE']->showHiddenPage); $page = $GLOBALS['TSFE']->sys_page->getPage($pid); if (count($page) == 0) { $GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug; return false; } if ($page['doktype']==4 && count($GLOBALS['TSFE']>getPageShortcut($page['shortcut'],$page['shortcut_mode'],$page['uid'])) == 0) { $GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug; return false; } if ($page['doktype'] == 199 || $page['doktype'] == 254) { $GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug; return false; } $GLOBALS['TSFE']->getPageAndRootline(); $GLOBALS['TSFE']->initTemplate(); $GLOBALS['TSFE']->forceTemplateParsing = 1; $GLOBALS['TSFE']->tmpl->start($GLOBALS['TSFE']->rootLine); $GLOBALS['TSFE']->sPre = $GLOBALS['TSFE']->tmpl>setup['types.'][$GLOBALS['TSFE']->type]; // toplevel - objArrayName $GLOBALS['TSFE']->pSetup = $GLOBALS['TSFE']->tmpl>setup[$GLOBALS['TSFE']->sPre.'.']; if (!$GLOBALS['TSFE']->tmpl->loaded || ($GLOBALS['TSFE']->tmpl->loaded && !$GLOBALS['TSFE']->pSetup)) { $GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug; return false; } $GLOBALS['TSFE']->getConfigArray(); //$GLOBALS['TSFE']->getCompressedTCarray(); $GLOBALS['TSFE']->inituserGroups(); $GLOBALS['TSFE']->connectToDB(); $GLOBALS['TSFE']->determineId(); return $GLOBALS['TSFE']->newCObj(); } Avec cette fonction nous pouvons obtenir plusieurs fonctions relié exclusivement au frontend telque la fonction typolink, typolink_url et les fonctions de template. Pour initialiser le TSFE : $this->get_tsfe(); Pour l'utilisation des fonction frontend : url : $GLOBALS['TSFE']->cObj->typolink_url($link); $GLOBALS['TSFE']->cObj->typolink($link); Template : $html = "###TEST###<div>###REPLACE###</div>###TEST###"; $templateComplete = $GLOBALS['TSFE']->cObj->getSubpart($html,"###TEST###"); $markerArray=array(); $subpartArray=array(); $wrappedSubpartArray=array(); $markerArray['###REPLACE###'] = 'ceci est un test'; $content = $GLOBALS['TSFE']->cObj->substituteMarkerArrayCached($templateComplete, $markerArray,$subpartArray,$wrappedSubpartArray); Hook TCEMain Hook pour les datas (lorsqu'on veux modifier ou créer un enregistrement): Dans le fichier ext_localconf.php : $GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/ class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:keyextension/file.php:tx_class'; Dans le fichier file.php : // $status : update ou new // $table : table sur laquelle on fait l'opération // $id : reprsente le id de l'enregistrement (lors de la création d'un objet on doit utiliser la fonction $tce->substNEWwithIDs[$id];) // $fieldArray : représente les champs qu'on crée ou modifie. Action à faire après l'enregistrement des données. function processDatamap_afterDatabaseOperations($status, $table, $id, $fieldArray, $tce) { // mettre son code ici } Pour récuper le id d'un nouvel enregistrement : $tce->substNEWwithIDs[$id]; Action à faire avant l'enregistrement des données. function processDatamap_preProcessFieldArray(&$incomingFieldArray, $table, $id, $tce) { // mettre son code ici } Hook pour les cmd (lorsqu'on veux déplacé, copié ou supprimé un enregistrement) $GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/ class.t3lib_tcemain.php']['processCmdmapClass'][] = 'EXT:profweb_pratiques/ class.tx_profwebpratiques_tcemain.php:tx_profwebpratiques_tcemain'; // $command: delete, moce, copy, undelete // $table : table sur laquelle on fait l'opération // $id // $value : représente les champs qu'on crée ou modifie. function processCmdmap_preProcess($command, $table, $id, $value, $tce) { // mettre son code ici } Fonction backend et astuce Cache : Pour supprimer la cache d'une page on peut utiliser la fonction : $tce->clear_cacheCmd exemple : require_once (PATH_t3lib."class.t3lib_tcemain.php"); $tce = t3lib_div::makeInstance("t3lib_TCEmain"); $tce->clear_cacheCmd($uidPage); t3lib_BEfunc : Pour obtenir les champs startime, endtime, hidden : t3lib_BEfunc::BEenableFields('table'); Pour obtenir le champ deleted : t3lib_BEfunc::deleteClause('table'); t3lib_userAuthGroup : Savoir si un utilisateur est administrateur ou pas : $GLOBALS['BE_USER']->isAdmin Permet d'obtenir les condition SQL pourr les permission d'une page sélectionner dans le backend $GLOBALS['BE_USER']->getPagePermsClause Pour savoir si un utilisateur appartient à un groupe : $GLOBALS['BE_USER']->isMemberOfGroup($idGroup) Autre : Connaitre le ID de la page où l'on se trouve dans le backend : $this->id Création d'arbre dans le backend Technique 1 : require_once(PATH_t3lib.'../typo3/class.webpagetree.php'); $tree = t3lib_div::makeInstance('webPageTree'); $content .= $tree->getBrowsableTree(); Utiliser la fonction JumpTo en javascript pour identifier la bonne page. Technique 2 : require_once(PATH_t3lib.'class.t3lib_treeview.php'); $tree = t3lib_div::makeInstance('t3lib_treeView'); //initialise treeview $tree->init(); $tree->expandFirst =1; $tree->expandAll = 1; $tree->MOUNTS = array(1); $tree->table = 'pages'; $tree->clause = ''; //additionnal clause where (begin whith ' AND') $tree->orderByFields = 'sorting'; debug($tree->tree); $content.=$tree->getBrowsableTree(); Utiliser la fonction JumpTo en javascript pour identifier la bonne page. Technique 3 (arbre statique) : require_once(PATH_t3lib.'class.t3lib_pagetree.php'); // Initialize starting point of page tree: $treeStartingPoint = 1; $treeStartingRecord = t3lib_BEfunc::getRecord('pages', $treeStartingPoint); $depth = 2; // Initialize tree object: $tree = t3lib_div::makeInstance('t3lib_pageTree'); $tree->init('AND '.$GLOBALS['BE_USER']->getPagePermsClause(1)); // Creating top icon; the current page $HTML = t3lib_iconWorks::getIconImage('pages', $treeStartingRecord, $GLOBALS['BACK_PATH'],'align="top"'); $tree->tree[] = array( 'row' => $treeStartingRecord, 'HTML'=>$HTML ); // Create the tree from starting point: $tree->getTree($treeStartingPoint, $depth, ''); #debug($tree->tree); // Put together the tree HTML: $output = ' <tr bgcolor="#999999"> <td><b>Icon / Title:</b></td> <td><b>Page UID:</b></td> </tr> '; foreach($tree->tree as $data) { $output.=' <tr bgcolor="#cccccc"> <td nowrap="nowrap">'.$data['HTML'].htmlspecialchars($data['row']['title']).'</td> <td>'.htmlspecialchars($data['row']['uid']).'</td> </tr> '; } $content .= '<table border="0" cellspacing="1" cellpadding="0">'.$output.'</table>'; CRON Pour n'importe quelle commande provenant du CLI, il faut faire passer la requête par le fichier typo3/cli_dispatch.phpsh. Celui-ci s'occupe d'initialiser l'environnement TYPO3 et de loader l'utilisateur backend requis. À noter qu'il est très important de créer un utilisateur backend et dont le nom d'utilisateur devra obligatoirement commencer par _CLI_. Dans l'exemple ci-dessous le nom de notre utilisateur backend est _CLI_st_extension ext_localconf.php : $TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys']['st_extension'] = array('EXT:st_extension/cli/class.tx_st_extension_cli.php','_CLI_st_extension'); st_extension : représente le nom de notre cli st_extension : représente la clé unique de notre extension _CLI_st_extension : nom de l'utilisateur backend Code : <?php // Ce fichier est inclu à partir de typo3/cli_dispatch.phpsh if (!defined('TYPO3_cliMode')) die('You cannot run this script directly!'); require_once(PATH_t3lib . 'class.t3lib_cli.php'); class tx_st_extension_cli extends t3lib_cli { function tx_st_extension_cli() { // Make sure the this always calls the parent's constructor parent::t3lib_cli(); } function main() { // Check arguments by looping through $this->cli_args ! foreach($this->cli_args as $arg => $value) { // Do something } } function doSomething() { // Do something here return true; } } // XCLASS Management if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ st_extension/cli/tx_st_extension_cli.php']) include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/st_extension/cli/ tx_st_extension_cli.php']); // Call the functionality $myObj = t3lib_div::makeInstance('tx_st_extension_cli'); $myObj->main(); $myObj->doSomething(); ?> Tous les arguments passés au script se retrouvent dans la variable membre $cli_args après que le constructeur de t3lib_cli ait été appelé. Plusieurs fonctions sont aussi disponibles pour gérer les arguments. Utiliser $SERVER["argv"] lorsque le paramètre $argv doit être spécifié. Il ne reste plus qu'à appeller le script de cette façon. Le premier argument est obligatoire. Ça doit être le keyname utilisé pour l'array $TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys']. On peut ensuite passer tous les arguments qu'on veut. Note: Le binaire de php doit obligatoirement être /usr/bin/php. Utilisez un symlink si ce n'est pas le cas. /srv/www/vhosts/csrsdev.clients.sys-tech.net/typo3/cli_dispatch.phpsh st_extension Interface de configuration d'une extension dans l'Extension manager Créer dans le dossier de base de l'extension le fichier ext_conf_template.txt exemple de ext_conf_template.txt : # cat=basic; type=boolean; label= Titre de page titlepage = 1 # cat=basic; type=string; label= Code code = cat : cat correspond à la catégorie de la variable, les choix possibles sont : basic,menu,content,page,advanced. La plus utilisé est basic. On peut utiliser des sous-catégories pour ajouter des titres : • enable • dims • file • typo • color • links • language Exemple de sous-catégorie : # cat=basic/enable; Les type possible : - boolean (case à cocher à la restitution) - int (entier) - int[0-3] (entier entre 0 à 3) - int+ (entier entre 0 et 10000) - color (choix de couleurr) - wrap (permet de mettre deux partie de code -> on récupère dans le code la "partie gauche|partie droite") - options[Option1,Option2,Option3,...] (Affiche une select box avec les valeurs définies entre []) - file (pas testé) - string : champ text quelques exemple : # cat=basic; type=options[label9,test2]; label=test variableName9=test2 # cat=basic/file; type=file[html,jpg]; label=label11 variableName11= # cat=basic; type=int[0-3]; label = 0 a 3 debug = 0 # cat=basic; type=string; label=label2 variableName2 = 123 # cat=basic; type=boolean; label=label1:mettre ici la description description variableName1 = 1 Label : représenter un libellé à afficher. Exploitation des variables Maintenant il suffit de récupérer les variables dans le plugin pour pouvoir les utiliser, on procède de cette manière : global $TYPO3_CONF_VARS; $variable=$TYPO3_CONF_VARS["EXT"]["extConf"]["NOM_EXTENSION"]; Ceci nous renvoi dans $variable le tableau sérialisé des variables de configuration. Il suffit de désérialiser ce tableau comme ceci : $variable=unserialize($variable); Ensuite on peut accéder au valeur des variable puisque l'index de $variable est le nom mis dans le fichier ext_conf_template.txt exemple : echo $variable["titlepage"]; TCA exemple de la fonction itemsProcFunc : Permet de modifier la valeur d'un select 'category' => array ( 'exclude' => 0, 'label' => 'test', 'config' => array ( 'type' => 'select', 'foreign_table' => 'tx_stkitchen_category', 'foreign_table_where' => 'ORDER BY tx_stkitchen_category.uid', "itemsProcFunc" => "user_GetGenreItems", 'size' => 5, 'minitems' => 0, 'maxitems' => 5, ) ), function user_GetGenreItems(&$config, &$item) { $config['items'][2] = array('label0',201); return $config; } Exemple de la fonction userFunc : Permet de créer un champ sur mesure "category" => Array ( "label" => "test", 'config' => Array ( 'type' => 'user', 'userFunc' => 'user_GetGenreItems', ), ), function user_GetGenreItems($PA, $fobj) { //reponse dans $PA['row']['category'] $content = '<select name="data[tx_stkitchen_recipe][3][category]"><option value="1">1</option><option value="2">2</option></select>'; return $content; } IRRE 'test' => Array( 'exclude' => 1, 'label' => 'test', 'config' => Array( 'type' => 'inline', 'foreign_table' => 'fe_groups', 'maxitems' => 10, 'appearance' => Array( 'collapseAll' => 1, 'expandSingle' => 1, ), ), ), Fichier : 'file' => array ( 'exclude' => 0, 'label' => 'LLL:EXT:bbb/locallang_db.xml:tx_bbb_bbb.file', 'config' => array ( 'type' => 'group', 'internal_type' => 'file', 'allowed' => 'gif,png,jpeg,jpg', 'max_size' => $GLOBALS['TYPO3_CONF_VARS']['BE']['maxFileSize'], 'uploadfolder' => 'uploads/tx_bbb', 'size' => 1, 'minitems' => 0, 'maxitems' => 1, ) ), Lien : 'link' => array ( 'exclude' => 0, 'label' => 'LLL:EXT:bbb/locallang_db.xml:tx_bbb_bbb.link', 'config' => array ( 'type' => 'input', 'size' => '15', 'max' => '255', 'checkbox' => '', 'eval' => 'trim', 'wizards' => array( '_PADDING' => 2, 'link' => array( 'type' => 'popup', 'title' => 'Link', 'icon' => 'link_popup.gif', 'script' => 'browse_links.php?mode=wizard', 'JSopenParams' => 'height=300,width=500,status=0,menubar=0,scrollbars=1' ) ) ) ), Méthode utilisé pour récuper notre lien de la BD : $url = htmlspecialchars($link); $name = explode(' ', $url); $content = $this->cObj->getTypoLink('titre du url', $url); AJAX Coté serveur : Dans le fichier ext_localconf.php $TYPO3_CONF_VARS['BE']['AJAX']['tx_myext::ajaxID'] = 'filename:object->method'; exemple : $TYPO3_CONF_VARS['BE']['AJAX']['SC_alt_db_navframe::expandCollapse'] = 'typo3/ alt_db_navframe.php:SC_alt_db_navframe->ajaxExpandCollapse'; alt_db_navframe.php : public function ajaxExpandCollapse($params, &$ajaxObj) { $this->init(); // do the logic... if (empty($this->tree)) { $ajaxObj->setError('An error occurred'); } else { // the content is an array that can be set through $key / $value pairs as parameter $ajaxObj->addContent('tree', 'The tree works...'); } } Coté client : $this->doc->loadJavascriptLib('contrib/prototype/prototype.js'); $this->doc->loadJavascriptLib('js/common.js'); new Ajax.Request('ajax.php', { method: 'get', parameters: 'ajaxID=SC_alt_db_navframe::expandCollapse', onComplete: function(xhr, json) { // display results, should be "The tree works" }.bind(this), onT3Error: function(xhr, json) { // display error message, will be "An error occurred" if an error occurred }.bind(this) }); Versioning et workspace Documentation : http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/ 3/2/ http://typo3.org/documentation/document-library/core-documentation/doc_core_inside/4.1.0/ view/3/7/ http://typo3.org/documentation/document-library/extension-manuals/doc_v4_workspace/1.0.5/ view/ (En allemand) Stage de la version : Editing : Le contenu peut être éditer librement. Reviewer : Le contenu doit être approuver avant d'être publier. Le contenu ne peut être modifier à moins d'avoir les droits de reviewer. Publish : Le contenu peut être publier. Le contenu ne peut être modifer tant et aussi longtemp que le contenu n'a pas été publié officiellement. Seul les membre ayant les droits d'éditer en mode live peuvent changer le contenu. Pour cela il faut avoir les droits sur le "Live workspace" Reject : Le contenu a été rejeter et peut être éditer à nouveau. Toute personne ayant les droit sur le workspace a le droit d'éditer un contenu et passer au mode reviewer. Type de versionning : Element : Versionning sur les enregistrements Page : Versionning sur les pages Branch : Versionning sur copy, deplacé des branches complète de page (page et sous page) Workspace avec templavoila • Lorsqu'on crée un nouvel élément dans le workspace nous créons un élément vide qui aura comme label "INITIAL PLACEHOLDER" et un nouvel élément sera créé et aura dans le champ t3ver_oid le uid du premier élément créé. • Lorsqu'on modifie un élément de contenu dans le workspace il y aura un nouvel élément de créer avec t3ver_label="Auto-created for WS 1" aura dans le champ t3ver_oid le uid de l'élément en ligne. • Lorsqu'on supprime un élément de contenu en fait c'est comme si on avait une nouvelle révision de la page car l'élément de contenu était entrer dans la table pages. Champ dans la base de donnée : t3ver_oid : uid de la version originale t3ver_id : le nieme nombre associer a la page original (incrementiel) pid : -1 pour les versions hots ligne. t3ver_wsid : id du workspace t3ver_label : Description sur la version t3ver_stage : id du stage t3ver_state : 2 version supprimé, 1 nouvel élément, 3 élément déplacé, 4 are move-to pointer elements t3ver_count : Nombre de fois qu'un element a été en ligne t3ver_tstamp : date de publication de la version t3ver_move_id : Contient la source id de l'enregistrement qui doit être déplacé Stage statut : • • • • stage reject = -1 stage editing = 0 stage review = 1 stage publish = 10 Différence entre swap et publish : Dans les 2 cas nous allons publié la version en ligne. La différence fondamentale est que lorsqu'on utilise swap, la version hors ligne ira en ligne alors que la version live revient en mode hors-ligne alors que si l'on utilise publish alors la version hors ligne ira en ligne et la version en ligne ira dans les archives. Swap sera souvent utilisé pour un événement pontuel et que l'on veut plus tard revenir avec notre ancienne version. On refera un swap à nouveau. versionOL Lorsqu'on selectionne un enregistrement basé sur le uid alors pour qu'on obtienne le bon resultat en mode preview il est important d'utiliser la fonction $GLOBALS['TSFE']->sys_page>versionOL('table',$row); versionOL transformera le uid avec le bon uid en mode preview. Frontend : $GLOBALS['TSFE']->sys_page->versionOL($table,&$row, $unsetMovePointers=FALSE) Backend : t3lib_BEfunc::workspaceOL ($table, &$row) exemple : $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*','tt_content', "uid='80'",'','',''); $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); $GLOBALS['TSFE']->sys_page->versionOL('tt_content',$row,false); if (is_array($row)) { $content = "<br/>content header = {$row['header']}"; } uid en mode live : 80 uid en mode preview : 82 80 est le uid en mode live mais en mode preview le uid devrait etre 82 pour notre exemple. versionOL va transformer notre $row avec les bons paramètres. Notre tableau devra contenir les valeur suivant pour être fonctionnel : "uid", "pid" and "t3ver_state" fixVersioningPid Lorsque nous sommes en mode preview et que l'on choisit un uid qui a comme pid -1 alors on utilise la fonction fixVersioningPid pour obtenir le pid de la page correspondante. Frontend : $GLOBALS['TSFE']->sys_page->fixVersioningPid(table,$row); Backend : t3lib_BEfunc::fixVersioningPid(table,$row);