Quantcast
Channel: Le blogue d'Infoglobe » Développement
Viewing all articles
Browse latest Browse all 10

Flexform et itemsProcFunc

$
0
0

Ces derniers temps, l’équipe Infoglobe a été assez active sur le blogue. C’est le T3CON à San Francisco qui nous a inspiré tous. Nos articles, bien qu’intéressants, n’étaient pas très techniques. Cependant, notre blogue s’adresse aussi aux programmeurs et aux utilisateurs invétérés de notre SGC favori TYPO3.

C’est la raison pour laquelle j’ai décidé aujourd’hui, de vous parler d’une astuce que j’ai appris il y a de cela quelques mois. Les logiciels libres c’est avant tout un partage de connaissances!

Flexform et itemsProcFunc

Récemment, j’ai dû développer une extension qui liste des enregistrements provenant du DAM (Digital Assets Management). Très simple me diriez-vous? C’est vrai lorsque nous sommes seul à gérer un site. La plupart du temps, les sites web et les intranets que nous développons pour nos clients sont beaucoup plus complexes que ça. Ils impliquent un grand nombre d’intervenants (utilisateurs back-end BE) et un grand nombre de rôles et de permissions (groupes back-end BE). Le choix des enregistrements dans le formulaire back-end créé grâce à un « flexform » dépend donc des permissions accordées à l’utilisateur BE courant et aux groupes auxquels ce dernier appartient.

Supposons par exemple que notre utilisateur BE appartienne à un groupe BE qui a pour « filemount » un dossier bien précis. Il ne faudrait pas dans ce cas, lui afficher des enregistrements du DAM qui ne sont pas inclus dans ce dossier.

Exemple :

Un champ de type select dans un flexform

Un champ de type select dans un flexform

 

<config>
  <type>select</type>
  <foreign_table>table</foreign_table>
  <foreign_table_where>
      AND table.champ_1 = x  AND table.champ_2 = y
      AND table.deleted = 0 AND table.hidden = 0
      ORDER BY table.champ_3 ASC
  </foreign_table_where>
</config>

Dans un flexform, nous pouvons utiliser un « select » avec un « foreign_table » et faire des requêtes simples avec « foreign_table_where » comme dans l’exemple ci-haut. Par contre, la tâche devient plus ardue lorsqu’on arrive au point où il faut jouer dans plusieurs tables de la base de données et chercher dans des relations stockées dans un champ grâce à des indentifiants séparés par des virgules.  Heureusement que TYPO3 est assez flexible pour nous permettre de tout configurer selon nos besoins. Dans le « flexform » nous pouvons utiliser « itemsProcFunc », qui nous permet d’aller chercher les items de notre « select » dans une userfunc.

Dans la classe user_maclass, il suffit d’avoir une fonction addElements qui nous permettra de faire les requêtes les plus complexes possibles. Cette fonction peut recevoir deux variables par référence : &$config et &$ref. La première contient toute la configuration du champ du flexform en question. On pourra alors accéder à la valeur du paramètre « exemple » dans $config['config']['exemple']. Nous pouvons aussi modifier les valeurs dynamiquement, seulement en les attribuant à la variable : $config['items'] = array_merge($config['items'],$optionList);.

Flexform :

 <config>
  <type>select</type>
  <itemsProcFunc>user_maclass->addElement</itemsProcFunc>
  <exemple>valeur</exemple>
</config>

class PHP :

 class user_maclass {        
   function addElement(&$config) {
      $optionList = $this->getList($config);
      if(is_array($optionList)){	    
         $config['items'] = array_merge($config['items'],$optionList);
      }	    
   }
}

Attention – la class class.user_maclass.php doit être incluse par le fichier ext_tables.php de la façon suivante :

include_once(t3lib_extMgm::extPath($_EXTKEY).'class.user_maclass.php');

Pour accéder aux données de l’utilisateur BE courant, nous avons la variable globale $BE_USER.

Exemple :

global $BE_USER;

if(!$BE_USER->isAdmin()){        
   //Récuperer les usergroup de l'utilisateur actuel    
   $ug = $BE_USER->user['usergroup'];    
   $arrug = explode(',',$ug);
}

On pourra toujours affirmer que TYPO3 est difficile à apprendre, du moins, pour les développeurs et non pas pour l’utilisateur final. Mais personne ne peut nier la force et la flexibilité de ce SGC.


Viewing all articles
Browse latest Browse all 10

Trending Articles