Categories > TinyButStrong general (FR) >

Programmation Orientée Objet et les Blocs

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: laurent
Date: 2006-01-11
Time: 15:26

Programmation Orientée Objet et les Blocs

Je viens de rencontrer une impossibilité, je voudrais savoir si je fais une erreur ou cela est réellement impossible.

Je créer un objet (exemple simplifé)
class Commentaires {
    var $auteur = array('moi','lui');
    var $texte = array('blabla de moi','blabla de lui');
}

Mon programme php
$commentaires = new Commentaires();
$TBS->ObjectRef['commentaires'] = &$commentaires;
$TBS->MergeBlock('bloc_commentaire','array','commentaires');

$TBS->Show();

Mon fichier template
<div>
<h3>[bloc_commentaire.~commentaires.titre;block=div]</h3>
<h4>commenté par [bloc_commentaire.~commentaires.auteur].</h4>
</div>

Et lors de l'affichage de la page il y a l'erreur suivante :
TinyButStrong Error (MergeBlock [bloc_commentaire]): Invalid query 'commentaires' because global variable 'commentaires' is not an array.

Alors je me pose la question de savoir si on peut avec TBS utilisé des tableaux dans les objets ?
By: Skrol29
Date: 2006-01-11
Time: 16:12

Re: Programmation Orientée Objet et les Blocs

Bonjour,

On peut utiliser des tableaux dans les objets mais pas comme cela.

Quand tu écrits :
$TBS->MergeBlock('bloc_commentaire','array','commentaires');
cela suppose que $commentaires est une variable objet de type Array(). Car source = 'array'.

Bien que la source de données peut être de différents types, TBS ne fusionne que des enregistrements qui sont structurés sous forme de tableaux associatifs (colonne1 => valeur1, colonne2=> valeur2).
Si ce n'est pas le cas, il faut coder des fonctions ou des méthodes perso qui retournent les info sous cette forme.

C.F.
  http://www.tinybutstrong.com/manual.php#php_customdatasource

Dans ton cas, c'est assez simple, il suffit de coder 3 méthodes supplémentaires : tbsdb_open(), tbsdb_fetch() et tbsdb_close().
Par exemple :
class Commentaires {
  var $auteur = array('moi','lui');
  var $texte = array('blabla de moi','blabla de lui');
  function tbsdb_open() {
    $this->NumRec = 0;
    $this->NumMax = count($this->auteur);
    return true;
  }
  function tbsdb_fetch() {
    if ($this->NumRec>=$this->NumMax) return false;
    $id = $this->NumRec;
    $this->NumRec++;
    return array($this->auteur[$id]=>'auteur', 'text' => $this->texte[$id]);
  }
  function tbsdb_close() {}

By: laurent
Date: 2006-01-11
Time: 19:11

Re: Programmation Orientée Objet et les Blocs

Je continue de bloquer.

Après la modification de ma class par l'ajout des fonctions, je n'arrive pas à faire fusionner le bloc par l'intermédiaire de $TBS->MergeBlock.

Peux-tu m'aider sur l'écrire de la partie php. Merci

Vivement TinyButStrong 3 (Surment pour bientôt !)
By: Skrol29
Date: 2006-01-11
Time: 19:20

Re: Programmation Orientée Objet et les Blocs

Avec la modif de classe donne ci-avant, la fusion se code :
$TBS->MergeBlock('bloc_commentaire','~Commentaires');


Tu trouveras les infos de programmation POO pour personnaliser la lecture de données ici :
http://www.tinybutstrong.com/manual.php#php_oop

Et pour la personnaliser la lecture de données de façon plus générale, ici :
http://www.tinybutstrong.com/manual.php#php_customdatasource
By: Anonymous
Date: 2006-01-11
Time: 19:56

Re: Programmation Orientée Objet et les Blocs

Avec cette syntaxe, j'obtient le message d'erreur suivant
TinyButStrong Error (MergeBlock [bloc_commentaire]): Expression '~commentaires_open' is invalid because property ObjectRef is not an object.
By: Laurent
Date: 2006-01-11
Time: 19:57

Re: Programmation Orientée Objet et les Blocs

Je suis Anonymous. Je viens de changer d'ordinateur.
By: Skrol29
Date: 2006-01-12
Time: 17:17

Re: Programmation Orientée Objet et les Blocs

Oui effectivement, les info que je t'ai filé ne collent pas exactement à ton code, il aurait fallu les adapter.

Voici un exemple qui marche.
PHP :
include_once('tbs_class.php');

class Commentaires {
  var $auteur = array('moi','lui');
  var $texte = array('blabla de moi','blabla de lui');
  function Commentaires_open() {
    $this->NumRec = 0;
    $this->NumMax = count($this->auteur);
    return true;
  }
  function Commentaires_fetch() {
    if ($this->NumRec>=$this->NumMax) return false;
    $id = $this->NumRec;
    $this->NumRec++;
    return array('auteur'=>$this->auteur[$id], 'titre' => $this->texte[$id]);
  }
  function Commentaires_close() {}
}

$commentaires = new Commentaires();

$TBS = new clsTinyButStrong;
$TBS->LoadTemplate('test.htm');
$TBS->ObjectRef['commentaires'] = &$commentaires;
$TBS->MergeBlock('bloc_commentaire','~commentaires.Commentaires');
$TBS->Show();

HTML :
<div>
  <h3>[bloc_commentaire.titre;block=div]</h3>
  <h4>commenté par [bloc_commentaire.auteur].</h4>
</div>
By: Laurent
Date: 2006-01-12
Time: 18:58

Re: Programmation Orientée Objet et les Blocs

Merci pour cette exemple. Je confirme que cela fonctionne parfaitement.

Mais je trouve "pas naturel" le faite de mettre ~commentaires.Commentaires au niveau de la source du MergeBlock.

Et puis j'ai beau lire et relire le manuel, je ne trouve pas l'explication.
By: Skrol29
Date: 2006-01-12
Time: 19:41

Re: Programmation Orientée Objet et les Blocs

Oui, tu as raison, ce n'est pas très claire dans la doc. Je vais tâcher d'améliorer ça.

Le principe c'est que si le source de MergeBlock() est un mot clé commençant par '~', alors il va regarder dans ->ObjectRef ; puis on colle '.commentaires' car il faut regarder dans l'item 'commentaires' de cette propriété. Le mot clé qui suit doit être le préfixe des méthodes invoquées.

Ca aurait pû être 'zzz'. Illustration :
class Commentaires {
  ...
  function zzz_open() {...}
  function zzz_fetch() {...}
  function zzz_close() {}
}
...
$TBS->MergeBlock('bloc_commentaire','~commentaires.zzz');