Categories > TinyButStrong general (FR) >

Utiliser une fonction php personnelle

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: Yonn
Date: 2006-02-28
Time: 00:58

Utiliser une fonction php personnelle

Bonjour !
J'utilise avec une grande satisfaction le moteur TBS depuis quelques semaines et je m'en réjouis chaque jour davantage ! Merci donc pour l'excellent travail et le temps consacré aux bricoleurs du dimanche dans mon genre...

Mon problème : je souhaite réaliser un index des entrées d'une table mysql classées par leurs initiales avec des petits separateurs (en l'occurence, la lettre de l'initiale), quelque chose dans ce gout là :

A
ablabla
ablublu
abloblo

B
blabla
blublu
bloblo
...

Je me prépare donc une fonction php qui m'affiche chaque lettre et glisse à la suite le resultat d'une requete sql selectionnant les entrées commencant par cette lettre...

Malheureusement, je ne suis pas assez futé pour saisir les subtilités des fonctions onformat et ondata, qui me semblent les pistes les plus sérieuses... en fait, je n'ai pas compris comment réaliser une syntaxe correcte pour TBS. Je me trouve donc coincé avec une fonction en php tout bète et je ne sais pas comment la faire digérer par tBS... Si une bonne âme pouvait m'orienter, je lui promet une gratitude éternelle (rien que ça !)

Merci !
By: Skrol29
Date: 2006-02-28
Time: 11:12

Re: Utiliser une fonction php personnelle

Bonjour Yon,

La technique ne pas pas être la même selon que tu veuilles voir appraître les lettre qui n'ont pas d'enregistrement ou pas.
J
  jblabla
  jblabla
K
L
  lblaba
  lblabla
ou
J
  jblabla
  jblabla
L
  lblaba
  lblabla
By: Yonn
Date: 2006-02-28
Time: 14:26

Re: Utiliser une fonction php personnelle

Diable ! Que de raffinement !
Effectivement, ce que j'avais codé de mon coté comportait une condition à l'affichage des lettres sans enregistrement mais je ne vais pas faire la fine bouche...
En fait, mon problème réside dans l'utilisation des $Nombloc, $enreg et $NumEnreg, je n'ai absolument pas compris comment les utiliser (j'ai honte...).
Donc, si je peux éliminer les lettres sans enregistrement, c'est mieux, mais si j'arrive seulement à comprendre le fonctionnement des fonctions utilisateur dans TBS, ce sera déjà pas mal.
En tout cas, merci pour la rapidité de la réponse!
By: Skrol29
Date: 2006-02-28
Time: 15:13

Re: Utiliser une fonction php personnelle

J'ai pas compris ce que tu voulais faire exactement, mais voici quelques explications sur l'utilisation des fonctions perso pour "ondata" (c'est la même chose pour "onformat", aux arguments près).

"ondata" fonctionne sur le principe des fonctions évènementielles. C'est à dire que tu codes ta fonctions mais c'est TBS qui va l'exécuter aux moments opportuns, en lui passant des arguments utiles.

Exemple :
HTML:
<div>
  [b1.capitale;block=div;ondata=mafct] [b1.titre]
</div>
PHP:
$TBS->MergeBlock('b1',$cnx_sql,'SELECT * FROM ma_table');
...
function mafct($NomBloc,&$Enreg,$RecNum) {
  $Enreg['capitale'] = strtolower($Enreg['titre'][0]);
}

Dans cette exemple, la fonction mafct() est appelée une fois pour chaque enregistrement. C'est TBS qui l'appele en passant l'enregsitrement en cours dans le paramètre $Enreg. La fonction ajoute une nouvelle colonne 'capitale' à cet enregistrement. Attention à bien mettre le symbole & devant la définition de l'argument $Enreg, sinon l'enregsitrement ne sara pas réllement modifié.
By: Yonn
Date: 2006-02-28
Time: 16:09

Re: Utiliser une fonction php personnelle

... Je commence à prendre la mesure de mon niveau d'incompétence. Je pense avoir compris ton exemple (c'est déjà pas mal) mais, je n'arrive pas à me sortie de mon problème.
mon code ressemble à ça :
for ($i=65; $i<=90; $i++)
    {
    $lettre = chr($i);
    $index_nonfetch= mysql_query('SELECT mot_cle FROM svt_definitions WHERE mot_cle REGEXP "^'.$lettre.'"');
    $decompte_vrac = mysql_query('SELECT COUNT(*) AS nb FROM svt_definitions WHERE mot_cle REGEXP "^'.$lettre.'"');
    $decompte = mysql_fetch_array($decompte_vrac);
    if ($decompte['nb']!=0)
        {
        echo $lettre.'<br />';
         while ($index= mysql_fetch_array($index_nonfetch))
            {
            echo $index['mot_cle'].'<br />';
            }
        }
    }
Je me fais une boucle pour chaque lettre de l'alphabet et s'il y a une entre de ma table qui correspond, j'affiche la lettre suivie des entrées selectionées dans ma requete sql.
Ce que je ne parviens pas à faire avec TBS, c'est modifier la requete sql à chaque fois que je change de lettre... (et après ça, je pense que j'aurai des problèmes pour tester s'il y a des entrées pour cette lettre).
Désolé d'insister ...
Merci en tout cas pour ta patience.
By: Skrol29
Date: 2006-02-28
Time: 16:30

Re: Utiliser une fonction php personnelle

Salut Yonn,

Je te conseille les sous-blocs. Les sous-bloc TBS sont fait typiquement pour le problème que tu exposes. Les sous-blocs fonctionnent avec des requêtes dynamiques côté PHP. Voici  comment faire :

Côté HTML : on crée deux blocs : un bloc principal qui va aficher la liste des lettres utilisés, puis un sous-bloc qui va afficher les enregistrements pour chaque lettre.
<div>
  LETTRE : [princ.lettre;block=div] 
  <div>
    [sub.mot_cle;block=div,p1='[princ.lettre]'] <br>
  </div>
</div>
Remarque bien le paramètre 'p1'. C'est lui qui va activer le mode sous-bloc pour la fusion de "sub". Ce paramètre va être passé de façon dynamique à la requête correspondante.

Côté PHP, on fusionne d'abord le bloc principale (important), puis le sous-bloc. Et hop, en deux lignes c'est dans la poche :
$TBS->MergeBlock('princ','mysql','SELECT UCASE(LEFT(mot_cle,1)) AS lettre FROM svt_definitions ');

$TBS->MergeBlock('sub','mysql','SELECT mot_cle FROM svt_definitions WHERE mot_cle REGEXP "^%p1%"');
By: Yonn
Date: 2006-02-28
Time: 16:41

Re: Utiliser une fonction php personnelle

Pitain ! C'est génial !
Franchement, à chaque fois que je réussi (on qu'on réussi pour moi ;) merci pour ton aide) à utiliser une nouvelle fonction du moteur, je me dis que j'ai bien fait de vous faire confiance et ben là, je suis à genoux devant tant de simplicité ! Merci pour ton aide et surtout, merci pour TBS !
Yonn