Categories > TBS next version >

Objet et ifempty

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: oxman
Date: 2006-04-03
Time: 15:25

Objet et ifempty

Salut,

Dans ma page html j'ai mis :
<li>Ville : [var.fiche.ville]</li>

Ca affiche ça :
TinyButStrong Error (Object value): Can't merge [var.fiche.ville] because 'ville' is neither a method nor a property in the class 'stdClass'. This message can be cancelled using parameter 'noerr'.

Ville : Object id #3

Donc j'ai testé ça :
<li>Ville : [var.~fiche.ville;ifempty=Non précisé]</li>

Ca affiche ça :
TinyButStrong Error (Object value): Can't merge [var.~fiche.ville] because 'fiche' is neither a method nor a property in the class 'stdClass'. This message can be cancelled using parameter 'noerr'.

Ville : Object id #3


Donc en fait, ifempty ne semble pas marcher quand la propriété d'un objet est vide. C'est un bug non ?
Si oui tu peux le corriger dans la prochaine version stp
By: Skrol29
Date: 2006-04-03
Time: 16:28

Re: Objet et ifempty

Salut,

Il semble que la propriété "ville" ne soit pas vide, mais plutôt non définie. C'est à dire nulle ou simplement pas créée.
Pour remédier à cela, il suffit d'ajouter le paramètre "noerr".
[var.fiche.ville;noerr;ifempty=Non précisé]
By: oxman
Date: 2006-04-03
Time: 17:18

Re: Objet et ifempty

Non car ça ne marche pas non plus, j'ai mis ça :
  <li>Ville : [var.fiche.ville;noerr;ifempty=Non précisé]</li>
Et du coup je vois ça :
Ville : Object id #3

De même, j'ai testé ça en php :
$TBS->ObjectRef = &$fiche;
puis dans le template :
<h2>[var.~fiche.identifiant]</h2>
et ça affiche :
TinyButStrong Error (Object value): Can't merge [var.~fiche.identifiant] because 'fiche' is neither a method nor a property in the class 'stdClass'. This message can be cancelled using parameter 'noerr'.
Object id #3
By: Skrol29
Date: 2006-04-03
Time: 17:26

Re: Objet et ifempty

Si tu utilises :
  $TBS->ObjectRef = &$fiche;
alors la balise apropriée devrait être :
  <h2>[var.~identifiant]</h2>
en effet, "fiche" n'est pas connu sous (après) ObjectRef.

As-tu fais un débu pour vérifier le contnu de ta variable ?
Il est possible que $fiche->ville contienne un object au lieu d'une valeur.
D'où l'affichage
  Ville : Object id #3
Tu peux faire un
   export_var($fiche);
pour faire la vérif.
By: oxman
Date: 2006-04-03
Time: 17:31

Re: Objet et ifempty

Merci pour le premier point.
Pour le deuxième tu as tors, il y a bien NULL dans la variable :

object(stdClass)#3 (11) {
  ["id"]=>
  string(1) "2"
  ["identifiant"]=>
  string(5) "oxman"
  ["sexe"]=>
  string(1) "H"
  ["ville"]=>
  NULL
  ["departement_id"]=>
  string(2) "-1"
  ["departement_nom"]=>
  string(13) "Non renseigné"
  ["naissance"]=>
  string(10) "1982-07-03"
  ["groupe_nom"]=>
  string(6) "Invité"
  ["statut_nom"]=>
  string(6) "Membre"
  ["friends"]=>
  array(5) {
    [0]=>
    object(stdClass)#4 (3) {
      ["id"]=>
      string(1) "2"
      ["identifiant"]=>
      string(4) "LeeX"
      ["sexe"]=>
      string(1) "H"
    }
    [1]=>
    object(stdClass)#5 (3) {
      ["id"]=>
      string(1) "2"
      ["identifiant"]=>
      string(7) "HuReeKo"
      ["sexe"]=>
      string(1) "H"
    }
    [2]=>
    object(stdClass)#6 (3) {
      ["id"]=>
      string(1) "2"
      ["identifiant"]=>
      string(5) "Mandy"
      ["sexe"]=>
      string(1) "F"
    }
    [3]=>
    object(stdClass)#7 (3) {
      ["id"]=>
      string(1) "2"
      ["identifiant"]=>
      string(8) "Fonceuse"
      ["sexe"]=>
      string(1) "F"
    }
    [4]=>
    object(stdClass)#8 (3) {
      ["id"]=>
      string(1) "2"
      ["identifiant"]=>
      string(4) "Rina"
      ["sexe"]=>
      string(1) "H"
    }
  }
  ["age"]=>
  int(23)
}
By: Skrol29
Date: 2006-04-03
Time: 18:08

Re: Objet et ifempty

Quand une variable est à Null, PHP considère qu'elle n'est pas initialisée.
le code :
$x = null
echo (is_set($x)) ? "ok" : "pas ok";
retourne "pas ok". C'est pour cela que tu as le message TBS.

De façon générale, il faut mieux utiliser False dans PHP pour "désactiver" une varibale. Ou encore chaîne vide ('') qui est assez pratique pour la fusion.
By: oxman
Date: 2006-04-03
Time: 18:25

Re: Objet et ifempty

Niveau base de donnée ça n'est pas propre ça.
Ca pourrait être implanté dans TBS.

Tant pis je vais faire une fonction qui transforme les "null" en false.
By: Skrol29
Date: 2006-04-03
Time: 18:44

Re: Objet et ifempty

Oui, effectivement, question base de donnée, ce n'est pas propre. Le NULL de PHP n'a pas le même sens que le NULL des bases de données. MySQL qui est très copain avec PHP propose toujours l'option NOT NULL pour les champs. Comme ça, pas de problème.

Par contre je ne comprend pas pour quoi TBS affiche "Object id #3" alors qu'il y a une valeur NULL. je vais jetter un oeil là dessus.
By: oxman
Date: 2006-04-03
Time: 18:45

Re: Objet et ifempty

Bah oui c'est pas normal, surtout le "ifempty", car is_set retourne false, donc "ifempty" devrait être utilisé.
By: Skrol29
Date: 2006-04-04
Time: 10:11

Re: Objet et ifempty

Salut Oxman,

Est-ce possible d'avoir un bout de code pour reproduire ton problème ?
By: oxman
Date: 2006-04-04
Time: 14:01

Re: Objet et ifempty

Plop,

Oui et non, ca ça vient d'une database, et d'une classe etc...
Je vais essayer de te résumer du mieux que je peu.

fiche.php :
$Db = new Db;
$TBS = new clsTinyButStrong;

$TBS->LoadTemplate("fiche.html");

function my_func($blockName, &$CurrRec, $RecNum)
{
        if ($CurrRec->sexe == 'H'):
                $CurrRec->sexe = "<span style=\"color:#369\">".$CurrRec->sexe."</span>";
        else:
                $CurrRec->sexe = "<span style=\"color:#c66\">".$CurrRec->sexe."</span>";
        endif;
}

$fiche = $Db->get_line('SELECT * FROM membre_publique where identifiant = $1', $_GET['id']);
$fiche->friends = $Db->get_list('SELECT * FROM liste_ami WHERE id = $1', $fiche->id);
$fiche->age     = calcul_age($fiche->naissance);

$TBS->ObjectRef = &$fiche;
$TBS->MergeBlock('AMIS', $fiche->friends);

var_dump($fiche);

$TBS->Show();
(j'ai viré les includes)

get_line en gros fait ça :
$this->query($query);
return pg_fetch_object($this->data);

get_list en gros fait ça :
$this->query($query);
while($temp = pg_fetch_object($this->data))
                                array_push($result, $temp);

return $result;


membre_ami est une vue :
SELECT membre.id, membre.identifiant, membre.sexe, membre.ville, membre.departement_id, departement.departement_nom, membre.naissance, groupe.groupe_nom, statut.statut_nom
   FROM membre
   JOIN groupe ON groupe.id = membre.groupe_id
   JOIN statut ON statut.id = membre.statut_id
   JOIN departement ON departement.id::bpchar = membre.departement_id;

liste_ami aussi :
SELECT ami.membre_id AS id, membre.identifiant, membre.sexe
   FROM membre
   JOIN ami ON ami.membre_id_ami = membre.id;

Au passage si quelqu'un veut me donner des conseils de programmation sur cet exemple, il est le bienvenu :)
By: oxman
Date: 2006-04-04
Time: 14:02

Re: Objet et ifempty

Oups et fiche.html :
<div id="fiche">
        <h2>[var.~identifiant]</h2>
        <p>Age : [var.~age] ans</p>
        <ul id="coordonnees">
                <li>Ville : [var.~ville;noerr;ifempty=Non précisé]</li>
                <li>Département : [var.~fiche.departement_nom]</li>
        </ul>
        <ul id="amis">
                <li>[AMIS.identifiant;block=li]</li>
        </ul>
</tr>
</div>


Note : dans mon précédent message c'était "peux" et pas "peu" ;)
By: oxman
Date: 2006-04-06
Time: 15:57

Re: Objet et ifempty

La version 30 est censée corriger mon problème ?
Si oui, et bien ça n'est pas le cas, mon problème persiste.
By: Skrol29
Date: 2006-04-06
Time: 16:02

Re: Objet et ifempty

Salut,

Non, la 3.00b30 ne corrige pas ce bug.
J'ai du mal à reproduire ton problème. Mais je suis toujours dessus.
By: Skrol29
Date: 2006-04-06
Time: 16:21

Re: Objet et ifempty

Quelle version de PHP as-tu ?
By: oxman
Date: 2006-04-06
Time: 16:30

Re: Objet et ifempty

PHP Version 5.1.2-1
By: Skrol29
Date: 2006-04-06
Time: 17:20

Re: Objet et ifempty

Le bug est corrigé dans la v 3.00b31 déjà dispo en téléchargement.

Merci pour avoir remonté ce bug et pour ta patience.

Pour info, la paramètre "noerr" reste nécessaire car malheusement PHP ne fourni aucun outil pour différencier une propriété de valeur NULL, d'une propriété non définie.
By: oxman
Date: 2006-04-07
Time: 10:11

Re: Objet et ifempty

C'est moi qui te remercie.
Ca marche parfaitement.

Concernant mon problème de variable NULL j'ai fait ceci :
                        foreach($result as $key => $elt):
                                if ($elt == NULL)
                                        $result->$key = "";
                        endforeach;

Je pense que c'est plus propre que de balancer des noerr un peu partout.
By: Skrol29
Date: 2006-04-07
Time: 10:26

Re: Objet et ifempty

Concernant le pb des NULL, j'ai vu que tu récupères les infos depuis un système de connectivité (peut être ezSQL). Très souvent ces systèmes ont un paramètre qui régule le retour des valeur NULL. À l'aide d'une constante tu leur demandes de retourner des chaînes vides à la pace des NULL.
Les fonctions MySQL ont ça.
By: oxman
Date: 2006-04-07
Time: 11:11

Re: Objet et ifempty

Bah en fait j'ai préféré faire mon petit système de connectivité.
Je n'ai pas trouvé un petit système qui faisait ce que je voulais, donc je me suis fait le miens.

Ce qui explique mon foreach, que j'ai évidement placé dans mon système de connectivité ;)

-mavie-
A ca j'ai ajouté un parsing propre des arguments pour éviter les injections (qui me convient plus que les systèmes du genre ezSQL) et un compteur de requêtes qui permet de dire combien de requêtes j'ai fait par page.
-/mavie-
By: Skrol29
Date: 2006-04-07
Time: 14:35

Re: Objet et ifempty

Ha ok, bien joué.
Mois aussi j'utilise mon petit outil d'intérrogation SQL. On l'apperçoit dans le source des applis téléchargeables. Il a évolué un peu depuis, mais en gros la fonction qui me manque c'est l'insertion automatique des valeurs dans la requête SQL.