|
Il peut y avoir deux type de Datasource : DB ou PHPARRAY. Le DB est une table SQL, le PHPARRAY comme son nom l'indique est un tableau PHP, mais attention la recherche avec renderlet:SEARCH ne semble bien marcher sur des datasource:PHPARRAY
Une datasource:DB avec une requête SQL conditionnées par les droits de l'utilisateur courant
<datasources>
<datasource:DB name="tx_bdd_faq">
<sql>
<userobj>
<php><![CDATA[
// si l'utilisateur appartient au group administrateur dans la table fe_users de TYPO3, il a le droit de tout voir dans la table
$admin_condition = "0";
// $GLOBALS["TSFE"]->fe_user->user['usergroup'] permet d'avoir
les groupes du front-end user logué en train d'utiliser ce formulaire
$groups = explode(",", $GLOBALS["TSFE"]->fe_user->user['usergroup']);
if (in_array("2", $groups) || in_array("3", $groups)) {
$admin_condition = "1";
}
$sql = "SELECT uid,pid,deleted,tstamp,crdate,cruser_id, hidden, question
FROM tx_bdd_faq
WHERE deleted = 0
AND hidden = 0
AND pid = 63
AND ( ". $admin_condition ." OR cruser_id = " . $GLOBALS["TSFE"]->fe_user->user['uid'] .")";
// pour afficher la requête si besoin
//debugster ($sql);
return $sql;
]]></php>
</userobj>
</sql>
</datasource:DB>
</datasources>
datasource:PHPARRAY avec gestion de critères de recherches
Les datasource:PHPARRAY sont nécessaires si vous avez besoin de traiter vos données avec PHP avec utilisation. Dans le cas ci dessous on doit afficher autant de ligne qu'il y a de départements dans un champ département qui est au format "dep1,dep2,dep3..." en base de données, ne sachant gérer cela via un requête SQL, j'étais donc suivi les recommandations de Ameos et géré mes données à partir d'un PHPARRAY. Problème : les filtre de recherche ne sont pas gérés dans datasource:PHPARRAY, ils ne semblent l'être que dans une datasource:DB. J'ai donc du stocké mes filtres (tout bêtement le contenu des formulaire de recherche via un t3lib_div::_POST() par exemple) et appliquer les critère de recherche moi même dans la datasource.
Sur l'algorithme de traitement des départements : on récupère ce champ 'dep1,dep2,...', on l'expose et on ajoute autant de lignes que de dep, ce qui est difficile en SQL avec cette structure, se fait très bien en PHP :
<datasource:PHPARRAY name="tx_bdd_essais">
<bindsTo>
<userobj>
<php>
<![CDATA[
$search_clause = "";
// ici on récupère les filtres de recherche précédement stoqué dans la sand box, on peut aussi les récupérer dans les variables postées avec t3lib_div::_POST();
if ($this->oSandBox->filters['cherche']) {
$mot_cle = $this->oSandBox->filters['cherche']['recherche_croisee'];
if ($mot_cle) {
$search_clause .= " AND (nom LIKE '%" . $mot_cle ."%'" .
" OR centre_coordonateur LIKE '%" . $mot_cle ."%'".
" OR promu_par LIKE '%" . $mot_cle ."%'".
" OR reference_affsaps LIKE '%" . $mot_cle ."%'".
" OR reference_cpp LIKE '%" . $mot_cle ."%'".
" OR objectif_rationnel LIKE '%" . $mot_cle ."%'".
" OR villes LIKE '%" . $mot_cle ."%'".
" OR conditions_detailllees LIKE '%" . $mot_cle ."%'".
" OR inclusion_exlusion LIKE '%" . $mot_cle ."%'".
" OR prenom_contact LIKE '%" . $mot_cle ."%'".
" OR mail_contact LIKE '%" . $mot_cle ."%') ";
}
}
$result= $GLOBALS["TYPO3_DB"]->exec_SELECTgetRows("*",
//"uid, nom, domaine_sante, crdate, tstamp, hidden, deleted, departement, region, date_debut",
"tx_bdd_essais",
"pid = 63 AND hidden = 0 AND deleted = 0 AND (date_cloture_recrutement = 0 OR date_cloture_recrutement > UNIX_TIMESTAMP()) " . $search_clause,
"",
"uid DESC",
"");
$nb = count($result);
$ma_selection = $GLOBALS["TSFE"]->fe_user->getKey("ses","listeprotocoles");
$ma_selection = explode(",", $ma_selection);
for ($i=0; $i<$nb; $i++) { // boucle de traitement de chaque row
$nom = $result[$i] ["nom"];
$hidden = $result[$i] ["hidden"];
$domaine_sante = $result[$i] ["domaine_sante"];
$uid = $result[$i] ["uid"];
$crdate = $result[$i] ["crdate"];
$tstamp = $result[$i] ["tstamp"];
$deleted = $result[$i] ["deleted"];
$date_debut = $result[$i] ["date_debut"];
$region = $result[$i] ["region"];
$listedep=$result[$i]["departement"];
$result[$i]["protocole_id"] = $uid;
if (in_array($uid, $ma_selection)) {
$result[$i]["btn-ajout-selection"] = "1" ;
} else {
$result[$i]["btn-ajout-selection"] = "0";
}
$check = $result[$i]["btn-ajout-selection"];
$listedepartement = explode(",", $listedep);
if ($listedepartement[0] == "") { unset($listedepartement[0]); }
//debugster($listedep);
$nbdep = count($listedepartement);
if ($nbdep > 0) {
unset($result[$i]); // supprime l'enregistrement
for ($k=0; $k<$nbdep; $k++) { // boucle de traitement de chaque fiche
$numdepartement = $listedepartement[$k];
//debugster($numdepartement);
$dep= $GLOBALS["TYPO3_DB"]->exec_SELECTgetRows(
"numero, CONCAT(numero, '-',departement ) as caption",
"tx_bdd_departements",
"pid=63 AND uid = " . $numdepartement ,
"",
"",
"1"
);
//debugster($dep);
$numdepartement = $dep[0][caption];
$new = array(
'uid' => $uid . "00" . $dep[0][numero],
'protocole_id' => $uid,
'nom' => $nom,
'domaine_sante' => $domaine_sante,
'crdate' => $crdate,
'tstamp' => $tstamp,
'hidden' => $hidden,
'deleted' => $deleted,
'departement' => $numdepartement,
'region' => $region,
'date_debut' => $date_debut,
'btn-ajout-selection' => $check
);
//debugster($new);
array_push($result, $new);
}
}
}
//debugster($result);
return $result ;
]]>
</php>
</userobj>
</bindsTo>
</datasource:PHPARRAY>
|