Categories > TinyButStrong general (FR) >

Répéter un block un nombre indéterminée de fois

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: oxman
Date: 2007-11-24
Time: 17:10

Répéter un block un nombre indéterminée de fois

Bonjour,

J'essaye de répéter un block de façon dynamique, j'essaye plein de truc dans tous les sens, mais je ne m'en sors pas.

Typiquement je voudrais faire ça :
<table cellspacing="0">
        <tr>
            <td>Nom</td>
            <td colspan="2"><input type="text" name="name" value="[system_load.name]"></td>
        </tr>
        <tr>
            <td>[caracts3.val;block=tr]</td>
            <td><select type="text" name="coeff[[caracts3.val]]"><option value="[coeff.val;block=option]">[coeff.key]</option></select></td>
        </tr>
</table>

Mais ça ne amrche pas, car un block ne peut être utilisé qu'une fois.
Alors je suis parti dans un truc du genre :
            <td><select type="text" name="coeff[[caracts3.val]]"><option value="[coeff.[caracts3.val];block=option]">[coeff.[caracts3.val].key]</option></select></td>

Avec :
$TBS->MergeBlock('coeff', $coeff);
et $coeff qui vaut :
Array
(
    [frappe_cd] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

    [frappe_r] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

    [block_cd] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

    [block_r] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

    [top_cd] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

    [top_r] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

    [def_cd] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

    [def_r] => Array
        (
            [Très utile (4)] => 4
            [Utile (2)] => 2
            [Normal (0)] => 0
            [Faible (-2)] => -2
            [Très faible (-4)] => -4
        )

)

Mais sans succès, j'ai tourné ça dans tous les sens, et j'ai toujours un truc du genre :
TinyButStrong Error in field [coeff.frappe_cd.key...] : item 'frappe_cd' is not an existing key in the array. This message can be cancelled using parameter 'noerr'.

TinyButStrong Error in field [coeff.frappe_cd...] : item 'frappe_cd' is not an existing key in the array. This message can be cancelled using parameter 'noerr'.

TinyButStrong Error in field [coeff.frappe_r.key...] : item 'frappe_r' is not an existing key in the array. This message can be cancelled using parameter 'noerr'.

TinyButStrong Error in field [coeff.frappe_r...] : item 'frappe_r' is not an existing key in the array. This message can be cancelled using parameter 'noerr'.

TinyButStrong Error in field [coeff.block_cd.key...] : item 'block_cd' is not an existing key in the array. This message can be cancelled using parameter 'noerr'.

TinyButStrong Error in field [coeff.block_cd...] : item 'block_cd' is not an existing key in the array. This message can be cancelled using parameter 'noerr'.

TinyButStrong Error in field [coeff.block_r.key...] : item 'block_r' is not an existing key in the array. This message can be cancelled using parameter 'noerr'.

etc..

Comment je peux procéder ?
By: Skrol29
Date: 2007-11-26
Time: 01:35

Re: Répéter un block un nombre indéterminée de fois

Salut Oxman,

Avec quoi fusionnes-tu le bloc "caracts3" pour obtenir ce message d'erreur ?
Que cherches-tu à obtenir comme résultat final ?

Pour faire des blocs dynamiques, le plus souvent il faut utiliser les sous-blocs :
http://www.tinybutstrong.com/fr/manual.php#html_block_subblock
By: oxman
Date: 2007-11-26
Time: 07:02

Re: Répéter un block un nombre indéterminée de fois

Salut,

Dans caracts :
$caracts      = array('frappe_cd', 'frappe_r', 'block_cd', 'block_r', 'top_cd', 'top_r', 'def_cd', 'def_r');

Rien de plus classique :o)
By: Skrol29
Date: 2007-11-26
Time: 10:28

Re: Répéter un block un nombre indéterminée de fois

Salut,

La solution c'est d'ulisier les sous-blocs.
Exemple dans ton cas : (ça marche si $coeff est une variable globale)

PHP:
// Fusion du bloc principal
$caracts = array('frappe_cd', 'frappe_r', 'block_cd', 'block_r', 'top_cd', 'top_r', 'def_cd', 'def_r');
$TBS->MergeBlock('caracts3', $caracts);
// Fusion des sous-blocs
$TBS->MergeBlock('coeff','array','coeff[%p1%]');

HTML:
  <tr>
    <td>[caracts3.val;block=tr]</td>
    <td>
      <select type="text" name="coeff[[caracts3.val;block=tr]]">
        <option value="[coeff.val;block=option;p1=[caracts3.val]]">[coeff.key]</option>
      </select>
    </td>
  </tr>
By: oxman
Date: 2007-11-26
Time: 19:46

Re: Répéter un block un nombre indéterminée de fois

Merci bien chef :o)
By: oxman
Date: 2007-11-30
Time: 10:55

Re: Répéter un block un nombre indéterminée de fois

Cependant je me trouve confronté à un autre problème du coup.

Comment faire pour sélectionner une option à l'aide du plugin adéquate dans ces select ?

Car bien entendu un :
[var.coeff_selected;p1=[caracts3.val];ope=html;select]
Ne fonctionne pas :)
By: Skrol29
Date: 2007-11-30
Time: 14:58

Re: Répéter un block un nombre indéterminée de fois

Il y a plusieurs liste de sélection.
Comment sont informés les items à sélectionner ?

By: oxman
Date: 2007-12-02
Time: 23:12

Re: Répéter un block un nombre indéterminée de fois

Je ne comprends pas trop la question.
Désolé de répondre si tardivement, je regardais la colonne où on voit l'auteur du post, en pensant (et me trompant comme souvent) que c'était l'auteur du dernier post.

Donc je pensais que tu n'avais pas encore répondu :o)

Donc du coup j'ai utilisé ce code crados en attendant :
<select type="text" name="coeff[[caracts3.val]]">
    <option value="[coeff.value;block=option;p1=[caracts3.val]]" [coeff.selected;htmlconv=no]>[coeff.name]</option>
</select>


$coeff = array();
foreach($caracts as $caract) {
        foreach ($coeff_system as $key => $value) {
                $selected = '';

                if (isset($data) and $data[$caract] == $value)
                        $selected = 'selected="selected"';

                $coeff[$caract][] = array(
                        'value' => $value,
                        'name' => $key,
                        'selected' => $selected
                );
        }
}

Je pense que ça répond à ta question, c'est dans data (qui provient d'une requête) que je sais ce qui est sélectionné.

Array
(
    [id] => 4
    [0] => 4
    [name] => Attaque placé
    [1] => Attaque placé
    [frappe_cd] => 1
    [2] => 1
    [frappe_r] => 1
    [3] => 1
    [block_cd] => 2
    [4] => 2
    [block_r] => 2
    [5] => 2
    [top_cd] => 3
    [6] => 3
    [top_r] => 3
    [7] => 3
    [def_cd] => 0
    [8] => 0
    [def_r] => 0
    [9] => 0
)
By: oxman
Date: 2007-12-11
Time: 13:23

Re: Répéter un block un nombre indéterminée de fois

Cette fois je crois que c'est toi qui n'a pas vu  mon message :'D
By: Skrol29
Date: 2007-12-11
Time: 15:21

Re: Répéter un block un nombre indéterminée de fois

Ouaip,

Si $data est une variable globale qui contient les sélections telle que tu l'as indiqué, alors le modèle ci-dessous devrait fonctionner.
Mais rappelle-toi qui si tu as beaucoup d'items à sélectionner, alors le plug-in HTML de sélection de liste devient lent.

  <tr>
    <td>[caracts3.val;block=tr]</td>
    <td>
      <select type="text" name="coeff[[caracts3.val;block=tr]]">
        <option value="[coeff.val;block=option;p1=[caracts3.val]]">[coeff.key]</option>
        <option>[var.data.[caracts3.val];noerr;ope=html;select]</option>
      </select>
    </td>
  </tr>