Index de l'article

Exécuter des requêtes

Dans un plugin PHP de formulaire

Il y a plusieurs façons d'exécuter des requêtes SQL en fond avec Fabrik, par exemple dans un plugin PHP de formulaire, où l'on souhaite remplacer une valeur dans une table liée par une valeur saisie en table principale.

Pratique quand vous avez été obligé de lier vos tables sur des chaînes textuelles, mais souhaitez quand même en permettre la modification. Exemple : une liste de sociétes attachées à leurs employés respectifs. Le nom de la société change, ou un utilisateur a décelé une faute d'orthographe, la modification doit également se faire sur la table des employés.

Dans ce cas décrit, la table liée permet d'attacher plusieurs enregistrements bien sûr (les employés), et renvoie donc un tableau (is_array).

$ma_var_new_field = $formModel->formData['matable1___champ1'] ;
 
$ma_var_old_field = $formModel->formData['matable2___champ2'][0];
$ma_var_old_field = is_array($ma_var_old_field) ? $ma_var_old_field[0] : $ma_var_old_field;
 
defined('_JEXEC') or die('Restricted access');
$db = FabrikWorker::getDBO(false, YourConnexionID);
 
$query = "
update table2
set champ2 = '$ma_var_new_field'
where champ2 = '$ma_var_old_field'
" ;
 
$db->setQuery($query);
$db->query();

Dans un cron PHP (scheduled task)

Ici un exemple de transfert régulier de données vers une base distante (la liste utilisée par le cron vérifie déjà d'éventuelles similitudes avec les enregistrements distants, et ne renvoie que les non-existants).

Comme les données appelées dans un cron Fabrik se trouve dans un tableau de tableaux d'objets, un double foreach sera nécessaire.

<?php
defined('_JEXEC') or die('Restricted access');
 
// Variables
foreach ($data as $group) {
foreach ($group as $row) {
$my_title = $row->table1___title ;
$my_firstname = $row->table1___firstname ;
$my_lastname = $row->table1___lastname ;
$my_speciality = $row->table1___speciality ;
$my_email = $row->table2___email_raw ;
$my_country = $row->table3___country ;
$my_code_phone1 = $row->table4___code_phone1 ;
$my_phone1 = $row->table4___phone1 ;
 
// Query
$db = FabrikWorker::getDBO(false, YourIdConnexion);
 
// Apostroph replace
$my_lastname = str_replace("'", "\'", $my_lastname);
$my_firstname = str_replace("'", "\'", $my_firstname);
...
 
// Just one query in a simple syntax in a temporary table
$query = "
INSERT INTO y_table
(civility, lastname, firstname, speciality, email, country, code_tel1, tel1)
VALUES ('$my_title', '$my_lastname', '$my_firstname', '$my_speciality', '$my_email', '$my_country', '$my_code_phone1', '$my_phone1') ;
" ;
 
$db->setQuery($query);
$db->query();
 
}}
?>

Attention

  • Si vous voulez insérer dans plusieurs tables distantes liées entre elles, il semble que Joomla/Fabrik ne le permettent pas. Utilisez alors une table temporaire puis un trigger, afin de dispatcher vos données comme souhaitée. Un exemple de trigger à cette fin ici !
  • Pensez à échapper ou à remplacer toutes vos variables susceptibles de contenir des apostrophes (juste avant la requête), sinon la requête échouera !
  • Si vous souhaitez exécuter plusieurs requêtes dans un cron (des requêtes séparées par un point-virgule) alors vous devez être en pilote MySQL PDO !

Dans un filtre de liste (Data/Pre-filter)

Il est possible de filtrer dynamiquement une liste à partir d'une requête SQL, et si besoin à partir d'une base distante ! Très pratique dans le cas de communication entre bases distantes.

Exemple ici dans une requête NOT IN, où il est nécessaire de faire un implode sur les résultats, afin de les séparer par une virgule. Les guillemets se gérent toutes seules grâce à Fabrik. Choisissez bien Eval dans le Type de requête Fabrik, sinon le code ne sera pas correctement interprêté :

// DB 2 access
$myDb = FabrikWorker::getDbo(false, YourIdConnexion) ;
 
// Recover query by email
$myQuery = $myDb->getQuery(true) ;
 
$myQuery->select('email')
->from('customer') ;
 
$myDb->setQuery($myQuery) ;
$MyResultsSoft = $myDb->loadColumn() ;
$MyResultsSoft = implode(",",$MyResultsSoft);
 
return $MyResultsSoft ;

Dans un champ (calc field)

Ici par exemple, pour tester ligne par ligne la correspondance avec des emails d'une table d'une base distante. Sur chaque ligne une requête WHERE s'exécute sur la base distante, avec pour paramètre l'email de la ligne courante. On ajoute du HTML/CSS pour mettre les résultats de couleurs différentes (Oui en vert et Non en rouge) :

// Declaration de la variable stockant l email d origine de chaque ligne
$SpecialEmail = '{MaTableLocale1___MonEmail}';
 
// if-else de gestion des cas vides - pour eviter de declencer une requete WHERE vide
if (!empty($SpecialEmail)) {
 
// Acces a la base de donnees
$myDb = FabrikWorker::getDbo(false, YourIdConnexion);
 
// Creation requete - argument true pour nettoyer une eventuelle ancienne requete
$myQuery = $myDb->getQuery(true);
 
// Requete de recuperation de la valeur concernee en fonction de l id d'origine
$myQuery->select('email')
->from('MaTableDistante')
->where('email = ' . $myDb->quote($SpecialEmail));
$myDb->setQuery($myQuery);
$DirectoryPresent = $myDb->loadResult();
if (!empty($DirectoryPresent)) {
 
// Calcul
return '<div style="text-align: center ; font-weight : bold ; color : green ; ">Yes</div>' ;
}
 
// Si vide
else {
return '<div style="text-align: center ; font-weight : bold ; color : red ; ">No</div>';
}}
 
// Si vide
else {
return '';
}

Autre exemple, toujours dans un champ cal, mais nous récupérons cette fois plusieurs lignes de résultats, soit un tableau : 

$monId = '{pipelines___id}';
 
$myDb = FabrikWorker::getDbo(false, 5);
 
$myQuery = $myDb->getQuery(true);
 
$myQuery->select(array('link_contact, notes'))
->from('pipelines_links')
->where('pipeline_id = ' . $myDb->quote($monId));
 
$myDb->setQuery($myQuery);
$myResults = $myDb->loadObjectList();
 
$list = array();
foreach ($myResults as $row)
{
$list[] = "".$row->link_contact . " " . $row->notes . "";
}
return implode($list);
Liens ou pièces jointes
Accéder à cette adresse URL (http://fabrikar.com/forums/index.php?wiki/troubleshooting-tools/)Wiki Fabrik sur les troubleshooting tools[Article]0 Ko
Accéder à cette adresse URL (http://fabrikar.com/forums/index.php?wiki/calculation-element/)Wiki Fabrik sur les champs calc pour débogage[Article]0 Ko
Accéder à cette adresse URL (http://fabrikar.com/forums/index.php?wiki/php-form-plugin/)Wiki Fabrik sur le plugin PHP pour les formulaires[Article]0 Ko
Accéder à cette adresse URL (http://fabrikar.com/forums/index.php?wiki/filtering-lists-tables/)Filtres de listes[Article officiel Fabrik sur les pré-filtres de listes]0 Ko
Accéder à cette adresse URL (https://api.joomla.org/cms-3/classes/JDatabaseDriver.html)Joomla! API[Documentation Joomla]0 Ko
Accéder à cette adresse URL (https://docs.joomla.org/Selecting_data_using_JDatabase)Selecting data using JDatabase[Documentation Joomla]0 Ko