Per aspera ad astra
Home Les DATASOURCES
Example of Table Blog layout (FAQ section)
Les DATASOURCES PDF Imprimer Envoyer
Écrit par Administrator   
Mardi, 16 Février 2010 02:43

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>
 



Mise à jour le Lundi, 08 Mars 2010 02:15