Categories > TinyButStrong general (FR) >

Problème avec les headers

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: Dede
Date: 2007-07-26
Time: 18:08

Problème avec les headers

Bonjour,
C'est la première fois que je réalise un VRAI site en PHP et l'on m'a conseillé d'utiliser TBS, je le trouve très bien mais malheureusement j'ai quelques problèmes liés à son utilisation...

Pour comprendre mon problème, il faut tout d'abord que je vous montre la structure que j'ai retenue pour mon site : tout passe par index.php avec un affichage des pages en fonction de ce qui est passé en POST.
Voici mon index :

    require_once "include/class/tbs_class.php";
    require_once "include/variables.inc.php";

    global $subTpl;
    global $index;

    //Sous modèle (contenu de la page)
    $subTpl = "template/index.tpl";
    $pageTitle = "Accueil";
    $jsLink = "script/ajax1.js";
    $pageNb = NULL;

    // Création du template
    $index = new clsTinyButStrong();

    if(isset($_REQUEST["page"])){
        $pageNb = $_REQUEST["page"];
        switch ($_REQUEST["page"])
        {
        //Page d'accueil
         case 1:
            $subTpl = "template/index.tpl";
            $pageTitle = "Accueil";
            break;
        //Page de la recherche sur la base
         case 2:
            $subTpl = "template/recherche.tpl";
            $pageTitle = "Base Infra";
            break;
                //....
        //par défaut on affiche l'index
        default:
            $subTpl = "template/index.tpl";
            $pageTitle = "Accueil";
            break;
        }
    }
    //on remet la valeur a NULL
    else{
        $pageNb = NULL;
    }

    //Chargement du template principale qui appel les sous templates
    $index->LoadTemplate("template/manulex.tpl");
    $cssLink = "include/style.css";

    //chargement des includes
    //vu qu'ils utilisent la fonction mergeBlock on est obligé de les mettre après LoadTemplate
    if(!empty($pageNb)){
        switch($pageNb){
        case 2:
            //Formulaire de recherche sur ManulexInfra
            include("include/recherche.php");
            break;
                //...
        default:
            break;
        } // switch
    }

    //Affichage de la page
    $index->Show();


Comme vous l'avez vu mes include se font après la fonction LoadTemplate vu que tous les appels de type MergeBlock() doivent se faire après LoadTemplate, ce qui me pose en réalité beaucoup de problème...

En fait, je fais un formulaire de requète pour une base de donnée et donc je dois affiché (ou non) des champs en fonction des champs sélectionné comme voulant être affichés (vous me suivez?)

Donc dans mon tableau de résultat de la recherche, j'ai mis du code comme celui-ci :

<td>[blkReq.ORTHO] [onload;block=td;when [var.col_ortho]=1]</td>

Le problème est que le code PHP qui va mettre ma variable d'affichage de colonne à 1 se trouve dans un include chargé après la fonction LoadTemplate et donc au moment de l'affichage du template la variable de colonne ne pourra pas etre a 1.

Vous comprenez mon problème??

C'est vraiment genant je suppose qu'il y'a une solution mais je ne l'ai pas trouvée pour l'instant.

Merci de votre aide,
à bientot,
dede
By: Skrol29
Date: 2007-07-26
Time: 18:53

Re: Problème avec les headers

Salut Dede,

Ton champ [onload;block=td;when [var.col_ortho]=1] ne doit effectivement pas être fusionné au chargement du sous-modèle, mais entre la définition de la variable $col_ortho et le MergeBlock('blkReq').

Il s'agit donc d'un problème de segmentation des étapes de fusion.
Pour géré ça, tu peux remplacer
[onload;block=td;when [var.col_ortho]=1]
par
[prepare;block=td;when [var.col_ortho]=1]

Et dans ton sous-script "recherche.php", tu rajoutes :
$col_ortho = ...;
$TBS->MergeBlock('prepare','cond');
...
$TBS->MergeBlock('blkReq',...);

'cond' est un mot clé de TBS qui force le fusion du bloc comme des blocs conditionnels 'onload' ou 'onshow'.
Attention, dans la dernière version (TBS 3.2.0) , cette fonctionnalité ne fusionne que des blocs et pas des champs.

Et hop, le tour est joué.
Tu peux généraliser le principe pour tous tes sous-scripts de ton appli en utilisant le même nom 'prepare'. Tu peux aussi segmenter en ajoutant d'autres étapes et faire des 'prepare1', 'prepare2', ....




By: Dede
Date: 2007-07-27
Time: 12:37

Re: Problème avec les headers

Ah ok, merci pour l'info!!
Donc, ça veux dire que mes variables $col_... doivent être dans un tableau maintenant vu que j'utilise la nouvelle version (3.2) et que prepare n'est que pour les blocks?

En tout cas merci pour tout, je vais tester ça au plus vite ;).

A+
dede
By: Skrol29
Date: 2007-07-27
Time: 13:47

Re: Problème avec les headers

Ben non, pas besoin.

Pour les variables sont supportés dans certaines paramètres comme 'if', 'then', 'else'.
Pour els autres variable, tu peux les mettre en [var] si elle peuvent être fusionnées en fin de traitement, sinon tu peux utiliser un MergeField :

HTML :
[prepare_var.col_ortho]

PHP :
$TBS->MergeField($prepare_var,$GLOBAL);
By: Dede
Date: 2007-07-27
Time: 14:58

Re: Problème avec les headers

Salut,
J'ai pas compris ton dernier message en fait... :s
Puis je comprend pas non plus quand tu dis

Attention, dans la dernière version (TBS 3.2.0) , cette fonctionnalité ne fusionne que des blocs et pas des champs.

les variable d'affichage de colonne sont des champs, donc cette fonctionnalité ne devrait pas marcher?

D'ailleurs j'ai testé et ça ne marche pas, mais bon je dois faire quelquechose de mal :

Voici le code PHP ou je passe mes variables à un en fonction des champs qui ont été sélectionnés pour être affichés ;

    function verifCol($code){
        switch($code){
        case 'ORTHO':
            $col_ortho = 1;
            break;
        case 'PHON':
            $col_phon = 1;
            break;
               //...
        default:
            break;
        }

        //on force la fusion des éléments
        $index->MergeBlock('prepare','cond');
    }

Voici le code HTML (j'ai juste fait un test pour ORTHO) :

        <td>[blkReq.ORTHO] [prepare;block=td;when [var.col_ortho]=1]</td>
        <td>[blkReq.PHON] [onload;block=td;when [var.col_phon]=1]</td>

Dans le cas de ORTHO, j'ai maintenant mes colonne qui s'affiche dès le début (donc avant la requète) avec en texte ça et le texte reste le même après la requète:
[blkReq.ORTHO] [prepare;block=td;when 0=1]

Pour les autres, rien ne s'affiche même après la requète...

Encore un autre problème dut au fait que j'utilise les include "dynamique" : je dois mettre les variables de colonne dans mon include de variables et je dois les mettre en global, sinon TBS me fait cette erreur :

TinyButStrong Error in field [var.col_ortho...] : the PHP global variable named 'col_ortho' does not exist or is not set yet. This message can be cancelled using parameter 'noerr'.

Est-ce grave? Est-ce que je peu continuer en mettant 'noerr' comme paramètre? Si oui, ou dois-je mettre ce paramètre?

Je pensais que l'utilisation d'un système de template serait une réele aide au développement, mais la ça deviens plus compliqué qu'autre chose. J'ai l'impression qu'en mélangeant le code PHP avec l'HTML je pourrait plus facilement faire ce que je veux. Est-ce une limite des systèmes de templates ou un manque de maîtrise de ceux-ci?
Je pense quand même que c'est la deuxième solution c'est pour ça que je vais perséverer :D.

En tout cas merci pour ton aide et ta réactivité Skrol29 ;).

A+
dede
By: Skrol29
Date: 2007-07-29
Time: 17:21

Re: Problème avec les headers

Salut,

> Puis je comprend pas non plus quand tu dis :
>> Attention, dans la dernière version (TBS 3.2.0) ,
>> cette fonctionnalité ne fusionne que des blocs et pas des champs.

Ca veut dire que quand tu appelles la fonction
  $TBS->MergeBlock('prepare','cond');
cela fusionne tes balises du type [prepare;block=tr;...]
mais cela ne fusionne pas les balises du type [prepare;file=...]
ni celles du type [prepare.champ;block=tr;...].


Dans ton exemple posté en dernier, il faut absolument que la ligne
$index->MergeBlock('prepare','cond');
vienne avant le ligne
$index->MergeBlock('blkReq',...);

C'est à dire que tu dois afficher ou masquer la colonne ORTHO avant de fusionne les enregistremenets.