[spip-dev] aide rapide php pour achever un patch "bouton radio" dans inc-extra.php3

Coucou,

J'ai commencé un mini patch pour inc-extra.php3 afin de proposer les champs
de type bouton radio, en suivant les traces de l'anarcat.

Je déclare donc dans mes-options.php3

"abo" => "radio|brut|Abonnement à la lettre
d'information|html|html,texte,non|format html,format texte,ne pas recevoir
de courrier",

ce qui permet de définir un nouveau type de champs avec en plus du titre :
le champs par defaut | la valeur des inputs | la valeurs des labels.

Dans cet exemple, les auteurs pourront choisir de recevoir la lettre
d'information et le format qu'ils preferent pour ca (on leur suggere Html si
le champs n'est pas rempli mais ca reste leur choix).

Ensuite dans inc-extra.php3 j'adpate la ligne 103 :

- list($form, $filtre, $prettyname, $default) = explode("|", $desc);
+ list($form, $filtre, $prettyname, $default, $allowed_vals, $labels) =
explode("|", $desc);

et dans le switch je rajoute le cas :

case "radio":

                          $values = explode(",", $allowed_vals);
                          if ($values == explode(",", "")) {
                            $values = Array();
                          }

                          /* affiche des <boutons radio> */
                          foreach ($values as $val) {
                            $affiche .= "<INPUT TYPE='radio'
NAME='suppl_$champ' VALUE='$val' id='$val'";
                            if ($extra[$champ] == $val) {
                              $selectionne = true;
                              $affiche .= " CHECKED ";
                            }
                            $affiche .= "><label
for='$val'>$val</label><br>";
                          }
                          /* la valeur du champ n'a pas ete trouvee, on la
rajoute */
                          if (($extra[$champ] == '') OR (!$selectionne)) {
                            $affiche .= "<br><INPUT TYPE='radio'
NAME='suppl_$champ' VALUE='$default' id='$default' CHECKED >";
       $affiche .= "<B><label for='$default'>$default</label></B><br>";
                          }

                          break;

Ca marche très bien sauf que le label du bouton prend la meme valeur que sa
valeur renvoyée et non pas son label tel qu'il est défini dans la
décalaration du champs.

Je manque de compétances pour m'y retrouver dans les explodes $values et $
labels et pour re attribuer a chaque bouton sa valeur et son label.

Mais j'aurai voulu vous passer un patch fonctionel a 100%, et j'enrage parce
que je me doute que c'est trivial pour l'achever, mais bon a force de
blocage je me permets de vous demander.

@+

BoOz

Bonjour,

J'ai updater le code pour le sitch et ca a l'air de marcher nickel maintenant. La db est bien updaté mais il reste un petit probleme du au header("Location: ..."); apres le update de la db qui fait que la page est relue en cache malgré les headers lui disnat de ne pas faire ainsi. Ce bug est une chose qui m'étais connue sur IE et j'ai remarqué que c'étais pareil avec Firebird, Netscape et Mozilla.

Une parade a cela serais de :
  - faire le location sur une autre page
ou
  - supprimer le location et affiché d'emblé la page après l'update

    case "radio":
             $values = explode(",", $allowed_vals);
             if ($values == explode(",", "")) {
                $values = Array();
             }

             $labels_values = explode(",", $labels);
             if ($labels_values == explode(",", "")) {
                $labels_values = Array();
             }

             /* verifie si la valeur actuelle est définie ou si il va falloir prendre celle par défaut */
             $selectionne = -1;
             foreach ($values as $key => $val) {
                if ($extra[$champ] == $val) $selectionne = $key;
             }

             /* affiche des <boutons radio> */
             foreach ($values as $key => $val) {
                $affiche .= "<INPUT TYPE='radio' NAME='suppl_$champ' VALUE='$val' id='$val'";
                if ($selectionne == $key) {
                   $affiche .= " CHECKED ";
                } elseif (($selectionne == -1) AND ($val == $default)) {
                   $affiche .= " CHECKED ";
                }
                $affiche .= "><label
for='$val'>".entites_html($labels_values[$key])."</label><br>";
             }
             break;

Sinon j'ai rajouté cela aussi pour l'affichage des extras de type 'radio' (remplacer la ligne commentée par ce qui suit) :

       //list($type, $filtre, $prettyname) = explode("|", $champs[$nom]);
       list($type, $filtre, $prettyname, $default, $allowed_vals, $labels) = explode("|", $champs[$nom]);
       if($type == 'radio') {
          $values = explode(",", $allowed_vals);
          if ($values == explode(",", "")) {
             $values = Array();
          }
          $labels_values = explode(",", $labels);
          if ($labels_values == explode(",", "")) {
             $labels_values = Array();
          }
          /* verifie si la valeur actuelle est définie ou si il va falloir prendre celle par défaut */
          $selectionne = -1;
          foreach ($values as $key => $val) {
             if ($contenu == $val) {
                $selectionne = $key;
             }
          }
          if($selectionne == -1)
             foreach ($values as $key => $val) {
                if ($contenu == $default) {
                   $selectionne = $key;
             }
          }
          $contenu = $labels_values[$selectionne];
       }

Voila pour ma premiere contribution a spip. Quelqu'un peut-il me dire comment on soumet un pathc pour qu'il soit éventuellement intégrer dans la version cvs des spip ou eventuellement lors d'une prochaine release.

J'ai aussi un patch qui permet de donner des description a tous les types de documents (xls, pdf, ...). Si ca interresse qqun demander le moi je le fournirai sans problème.

JF Dusariez
Qwentes

PS: pour la déclaration dans mes_options.php3 voir le message original ci dessous.

BoOz wrote:

Ouah, bravo ca marche au poil !

par contre deux petites remarques complémentaires:

- $type chez toi s'appelle $form je crois. (à moins que ma version ne soit
pas la dernière).
- est on obligé de mettre ca 2 fois (l'occurrence dans le switch redondante
??)

$values = explode(",", $allowed_vals);
             if ($values == explode(",", "")) {
                $values = Array();
             }

             $labels_values = explode(",", $labels);
             if ($labels_values == explode(",", "")) {
                $labels_values = Array();
             }

M'enfin c'est du détail, ton script est très bien. J'ai constaté aussi que
la valeur des champs extras n'est visible dans le formulaire que lorsqu'on
vide tous les caches après avoir rempli une valeur.

@+

BoOz

"Dusariez Jean-françois" <jfd@qwentes.be> a écrit dans le message de
news:bu310g$uev$1@sea.gmane.org...

Bonjour,

J'ai updater le code pour le sitch et ca a l'air de marcher nickel
maintenant. La db est bien updaté mais il reste un petit probleme du au
header("Location: ..."); apres le update de la db qui fait que la page
est relue en cache malgré les headers lui disnat de ne pas faire ainsi.
Ce bug est une chose qui m'étais connue sur IE et j'ai remarqué que
c'étais pareil avec Firebird, Netscape et Mozilla.

Une parade a cela serais de :
  - faire le location sur une autre page
ou
  - supprimer le location et affiché d'emblé la page après l'update

  case "radio":
             $values = explode(",", $allowed_vals);
             if ($values == explode(",", "")) {
                $values = Array();
             }

             $labels_values = explode(",", $labels);
             if ($labels_values == explode(",", "")) {
                $labels_values = Array();
             }

             /* verifie si la valeur actuelle est définie ou si il va
falloir prendre celle par défaut */
             $selectionne = -1;
             foreach ($values as $key => $val) {
                if ($extra[$champ] == $val) $selectionne = $key;
             }

             /* affiche des <boutons radio> */
             foreach ($values as $key => $val) {
                $affiche .= "<INPUT TYPE='radio' NAME='suppl_$champ'
VALUE='$val' id='$val'";
                if ($selectionne == $key) {
                   $affiche .= " CHECKED ";
                } elseif (($selectionne == -1) AND ($val == $default)) {
                   $affiche .= " CHECKED ";
                }
                $affiche .= "><label
for='$val'>".entites_html($labels_values[$key])."</label><br>";
             }
             break;

Sinon j'ai rajouté cela aussi pour l'affichage des extras de type
'radio' (remplacer la ligne commentée par ce qui suit) :

       //list($type, $filtre, $prettyname) = explode("|", $champs[$nom]);
       list($type, $filtre, $prettyname, $default, $allowed_vals,
$labels) = explode("|", $champs[$nom]);
       if($type == 'radio') {
          $values = explode(",", $allowed_vals);
          if ($values == explode(",", "")) {
             $values = Array();
          }
          $labels_values = explode(",", $labels);
          if ($labels_values == explode(",", "")) {
             $labels_values = Array();
          }
          /* verifie si la valeur actuelle est définie ou si il va
falloir prendre celle par défaut */
          $selectionne = -1;
          foreach ($values as $key => $val) {
             if ($contenu == $val) {
                $selectionne = $key;
             }
          }
          if($selectionne == -1)
             foreach ($values as $key => $val) {
                if ($contenu == $default) {
                   $selectionne = $key;
             }
          }
          $contenu = $labels_values[$selectionne];
       }

Voila pour ma premiere contribution a spip. Quelqu'un peut-il me dire
comment on soumet un pathc pour qu'il soit éventuellement intégrer dans
la version cvs des spip ou eventuellement lors d'une prochaine release.

J'ai aussi un patch qui permet de donner des description a tous les
types de documents (xls, pdf, ...). Si ca interresse qqun demander le
moi je le fournirai sans problème.

JF Dusariez
Qwentes

PS: pour la déclaration dans mes_options.php3 voir le message original
ci dessous.

BoOz wrote:
> Coucou,
>
> J'ai commencé un mini patch pour inc-extra.php3 afin de proposer les

champs

> de type bouton radio, en suivant les traces de l'anarcat.
>
> Je déclare donc dans mes-options.php3
>
> "abo" => "radio|brut|Abonnement à la lettre
> d'information|html|html,texte,non|format html,format texte,ne pas

recevoir

> de courrier",
>
> ce qui permet de définir un nouveau type de champs avec en plus du titre

:

> le champs par defaut | la valeur des inputs | la valeurs des labels.
>
> Dans cet exemple, les auteurs pourront choisir de recevoir la lettre
> d'information et le format qu'ils preferent pour ca (on leur suggere

Html si

> le champs n'est pas rempli mais ca reste leur choix).
>
>
> Ensuite dans inc-extra.php3 j'adpate la ligne 103 :
>
> - list($form, $filtre, $prettyname, $default) = explode("|", $desc);
> + list($form, $filtre, $prettyname, $default, $allowed_vals, $labels) =
> explode("|", $desc);
>
> et dans le switch je rajoute le cas :
>
> case "radio":
>
> $values = explode(",", $allowed_vals);
> if ($values == explode(",", "")) {
> $values = Array();
> }
>
> /* affiche des <boutons radio> */
> foreach ($values as $val) {
> $affiche .= "<INPUT TYPE='radio'
> NAME='suppl_$champ' VALUE='$val' id='$val'";
> if ($extra[$champ] == $val) {
> $selectionne = true;
> $affiche .= " CHECKED ";
> }
> $affiche .= "><label
> for='$val'>$val</label><br>";
> }
> /* la valeur du champ n'a pas ete trouvee, on

la

> rajoute */
> if (($extra[$champ] == '') OR (!$selectionne))

{

> $affiche .= "<br><INPUT TYPE='radio'
> NAME='suppl_$champ' VALUE='$default' id='$default' CHECKED >";
> $affiche .= "<B><label for='$default'>$default</label></B><br>";
> }
>
> break;
>
>
> Ca marche très bien sauf que le label du bouton prend la meme valeur que

sa

> valeur renvoyée et non pas son label tel qu'il est défini dans la
> décalaration du champs.
>
> Je manque de compétances pour m'y retrouver dans les explodes $values et

$

> labels et pour re attribuer a chaque bouton sa valeur et son label.
>
> Mais j'aurai voulu vous passer un patch fonctionel a 100%, et j'enrage

parce

oui c'est obligatoire de mettre les 2 explode ... un pour les allowed vals et l'autre pour les labels (sinon tes labels ne sont d'aucunnne utilitée")

Le problème de cache n'en est pas vraiment un, enfin pas au niveau de spip mais plutot au niveau des browsers. c'est que j'expliquais dans le message précédent.

Sinon il ya juste un truc qui me chagrine c'est le manque de support multilingue pour une solution pareil. Au niveau des articles il ya moyen de réglé ca en jouant avec le dommaines d'application rubrique par rubrique mais au niveau des auteurs j'ai bien peur que aucun support multilingue n'est possible sans de lourde modifs au niveau des fonctins des extras.

Si qqun a une idée pour régler ce problème, merci de m'en faire part.
Mis a part peut etre si l'on a des squelettes par langue et que l'on test les différentes valeurs avant affichage. Ou peut etre que un filtre pourrait faire l'affaire car il me semble que l'on peu détecter la langue. Bon dans tous les cas si vous avez des idées, ne vous génez pas.

Je pense que une implémentation de select box et de checkbox pourrait etre aussi judicieux et utile pour certain d'entre nous.

JF
Qwentes

BoOz wrote:

Sinon il ya juste un truc qui me chagrine c'est le manque de support
multilingue pour une solution pareil. Au niveau des articles il ya moyen
de réglé ca en jouant avec le dommaines d'application rubrique par
rubrique mais au niveau des auteurs j'ai bien peur que aucun support
multilingue n'est possible sans de lourde modifs au niveau des fonctins
des extras.

Bon, euh, rappelons quand même : "extra" c'est pour ajouter vite-fait mal
fait des champs utilisateurs dans SPIP. Pas une plate-forme de développement
de nouvelles fonctionnalités béton. Là vous risquez d'aller dans le mur.

Il faudra probablement repenser les extra sous forme d'une table séparée et
d'une belle interface d'admin, si vous voulez que ça ait une chance de
sortir du hack pratique mais sans plus :slight_smile:

-- Fil

Oui je pense que ca pourrais devenir qqchose d'assez puissant ... cela impliquerais la réécriture complète des extras. Ca devrait être techniquement assez facile mais au niveau de l'interface admin un peu difficille a intégrer. Il suffirais dès lors de se baser sur les memes principes de base de traductions articles pour les extras. Faudra que je regarde un peu la structure de la base de donnée pour m'en inspirer et voir ce que l'on peut faire.

Bon je n'ai pas résisté et je viens d'aller voir la db articles de spip. je pense que ca devrait pas etre trop difficille.
Je vous tiens tous au courant de toute facon.

JF

Fil wrote: