[spip-dev] MENU_LANG

Hello,
j'ai un petit souci avec la balise menu_lang qui a l'air de venir du meta langues_multilingue :
ce meta contient ",fr,en, ..." et j'ai effectivement un truc bizarre dans l'espace redaction (config-multilang) puisque la liste commence par un [] grisé avant le [fr]
Je ne sais pas quelle manip j'ai fait qui a cassé la liste, je pense avoir simplement changé la liste des langues (decoché quelques cases et validé).

Consequences : le meta commencant par ",", le strpos dans inc-menu_lang retourne 0, ce qui est considéré comme un site en une langue et donc, pas de menu_lang.

A part ca, je n'ai pas compris pourquoi ca n'etait pas un formulaire "classique", ce qui permettrait d'en faire une version perso plus simplement ...
je vais essayer de faire un #FORMULAIRE_MENU_LANG pour voir.
@++

Hello,
j'ai un petit souci avec la balise menu_lang qui a l'air de venir du
meta langues_multilingue :
ce meta contient ",fr,en, ..." et j'ai effectivement un truc bizarre
dans l'espace redaction (config-multilang) puisque la liste commence par
un grisé avant le [fr]

  On viens d'avoir le tour ici :slight_smile:
  Tu dois avoir un article dont la langue a été forcée à '', ce qui le
fait créer cette pseudo-langue
- trouver l'article (ou la rubrique) fautive, et le (les) corriger
- en mysql, dégager la "," dans la table spip_meta
- buter le fichier ecrire/data/meta_cache pour forcer sa recréation

A part ca, je n'ai pas compris pourquoi ca n'etait pas un formulaire
"classique", ce qui permettrait d'en faire une version perso plus
simplement ...
je vais essayer de faire un #FORMULAIRE_MENU_LANG pour voir.

J'ai pas pris le temps d'en faire une contrib, mais voila une
boucle langue :
function boucle_LANGUES($id_boucle, &$boucles) {
  $boucle = &$boucles[$id_boucle];
  $code=<<<CODE
  \$SP++;
  \$code=array();
  \$l= split(',', lire_meta('langues_multilingue'));
  foreach(\$l as \$k) {
    \$Pile[\$SP] = array('abbrev' => \$k,
               'nom' => traduire_nom_langue(\$k));
    \$code=$boucle->return;
  }
  \$t0= join('$boucle->separateur', \$code);
CODE;

  return $code;
}

on peut alors faire ça :
<B_langues(LANGUES)>
  <select name="lang">
<BOUCLE_langues(LANGUES)>
    <option value='#ABBREV'>#NOM</option>
</BOUCLE_langues>
  </select>
</B_langues>

Hello,

le problème, c'est qu'on a pas de boucle à disposition pour tourner sur les langues, donc c'est difficile à en faire un squelette je pense.

Pierre

Stephane LAURENT wrote:

J'ai pas pris le temps d'en faire une contrib, mais voila une
boucle langue :
function boucle_LANGUES($id_boucle, &$boucles) {

.../...

on peut alors faire ça :
<B_langues(LANGUES)>
  <select name="lang">
<BOUCLE_langues(LANGUES)>
    <option value='#ABBREV'>#NOM</option>
</BOUCLE_langues>
  </select>
</B_langues>

Mhhh, c'est bon ça !

Donc on a des boucles sur tous les tableaux php qu'on veut ! Et on le savait
même pas ! Géant.

-- Fil

Presque, j'ai oublié un morceau, il faut ajouter une "pseudo table" :

$langues = array(
  "abbrev" => "char(2)",
  "nom" => "varchar(20)"
);
$langues_key = array(
  "PRIMARY KEY" => "abbrev"
);
$GLOBALS['tables_aso']['langues'] =
  array('field' => &$langues, 'key' => &$langues_key);

Consequences : le meta commencant par ",", le strpos dans inc-menu_lang
retourne 0, ce qui est considéré comme un site en une langue et donc,
pas de menu_lang.

Je corrige ce bug-ci en tous cas. En attendant la méga contrib de boucle sur
un tableau php :slight_smile:

-- Fil

Fil wrote:

Donc on a des boucles sur tous les tableaux php qu'on veut ! Et on le savait
même pas ! Géant.

oui, mais on le savait, non?
Merci à Pif pour le code en tout cas :wink:

le problème que moi j'avais, c'etait la traduction des critères mysql (tri, etc...) pour une table php.

Pierre

oui, mais on le savait, non?

certains savaient, d'autres non

Merci à Pif pour le code en tout cas :wink:

oui

le problème que moi j'avais, c'etait la traduction des critères mysql
(tri, etc...) pour une table php.

Il faut bien commencer par quelque chose. Mais plut^to que définir ainsi une
boucle(LANGUES), est-ce qu'il ne faut pas plutôt définir une boucle(ARRAY)
ou boucle(PHP), qui serait plus "générique" ?

-- Fil

Fil wrote:

le problème que moi j'avais, c'etait la traduction des critères mysql (tri, etc...) pour une table php.

Il faut bien commencer par quelque chose. Mais plut^to que définir ainsi une
boucle(LANGUES), est-ce qu'il ne faut pas plutôt définir une boucle(ARRAY)
ou boucle(PHP), qui serait plus "générique" ?

oui oui, on pourrait imaginer une boucle générique, mais comment lui passer le tableau? et comment faire pour que la table_principale soit remplie "génériquement"?
Enfin, on pourrait déjà supposer qu'on a declarer en dur cette table dans mes_fonctions.php3

Pierre

MERCI !!!

C'est clair que c'est mieux que mon formulaire à 2 balles ...

En passant, j'avais mal compris ce formulaire qui est finalement "classique" si ce n'est que la fonction menu_lang_pour_tous est mutualisée entre les 2 formulaires, mais située dans inc-menu_lang_ecrire.

Merci pour la "correction" Fil, maintenant, le formulaire resiste meme aux articles mal enregistrés : ca venait d'un test de formulaire public qui avait mal rempli la table ... désolé.

@++

Christian Lefebvre a écrit :

oui oui, on pourrait imaginer une boucle générique, mais comment lui
passer le tableau?

Par son nom <BOUCLE(PHP truc)> => c'est $truc qui compte. Ah oui, mais
comment affecter $truc ? Il faudrait que <BOUCLE(PHP truc)> commence par
initialiser $truc en appelant une fonction
        initialiser_boucle_truc()

(ou à défaut d'existence de cette fonction :
        initialiser_boucle_php('truc')
qui retrounerait $GLOBALS['truc'] )

et comment faire pour que la table_principale soit
remplie "génériquement"?

En regardant les array_keys($truc)

Enfin, on pourrait déjà supposer qu'on a declarer en dur cette table
dans mes_fonctions.php3

Si c'est vraiment générique ça ne doit rien obliger dans mes_fonctions. A
part éventuellement initialiser_boucle_truc().

-- Fil

Merci pour la "correction" Fil, maintenant, le formulaire resiste meme
aux articles mal enregistrés : ca venait d'un test de formulaire public
qui avait mal rempli la table ... désolé.

Tu as fait sortir un bug, il faut pas être désolé :slight_smile:

-- Fil

Bof .. ça me parait un peu compliqué en fait, et y'aura toujours un
cas à la con qui rentre pas dans le moule.
  Et si on fait ça, autant mettre un foreach et ressortir du placard
la balise <PHP> pour que ça soit caché ...

$GLOBALS['tables_aso']['langues'] =

ici j'ai mis
$GLOBALS['tables_principales']['langues'] =

et le tout dans mes_fonctions, et ça marche

-- Fil

En installant un petit patch dans inc-html-squel.php3 :

(ajouter ça ligne 248) :
                if (preg_match("/^LISTE (.*)/", $type, $r))
                  {
                    $type = 'LISTE'; #substr($type,$p+1);
                        $result->sous_requete = $r[1];
                  }

on peut récupérer 'toto' dans la définition de la boucle(LISTE toto) faite
avec function boucle_LISTE.

Le code devient un peu trop lourd pour continuer à l'échanger par mail, mais
enfin, j'obtiens ça, qui est presque générique (seule la function
init_liste_toto() est spécifique).

<?php

// BOUCLE(LISTE toto)
function boucle_LISTE($id_boucle, &$boucles) {
        $boucle = &$boucles[$id_boucle];

        $quoi = $boucle->sous_requete;
        $init_quoi = 'init_liste_'.$quoi;
        if (function_exists($init_quoi))
                $init_quoi = "$init_quoi()";
        else
                $init_quoi = "init_liste('".texte_script($quoi)."')";

        $code=<<<CODE
        \$SP++;
        \$code=array();
        \$l= $init_quoi;
        foreach(\$l as \$k) {
                \$Pile[\$SP] = array('item' => \$k);
                \$code[]=$boucle->return;
        }
        \$t0= join('$boucle->separateur', \$code);
CODE;

        return $code;
}

$item = array(
        "item" => "blob"
);
$GLOBALS['tables_principales']['liste'] =
        array('field' => &$item, 'key' => array());

function init_liste_toto() {
        return split(',', lire_meta('langues_multilingue'));
}

?>

Squelette :

<B_langues>
        <select name="lang">
<BOUCLE_langues(LISTE toto)>
                <option value='#ITEM'>[(#ITEM|traduire_nom_langue)]</option>
</BOUCLE_langues>
        </select>
</B_langues>

Et ça marche. On le passe sur SPIP Zone ?

-- Fil

Salut,
Bon, je reviens la dessus un peu après la bataille, mais j'etais sans connexion ce week end.

Alors, j'ai essayé d'ajouté un #URL_LANG pour reproduire le comportement de #MENU_LANG sous forme d'images de cette facon :
<B_langues>
  <div class="menu_lang">
<BOUCLE_langues(LANGUES)>
    <a href="#URL_LANG"><img src="img_lang/#ABBREV.jpg" alt="#NOM" border="0"/></a>
</BOUCLE_langues>
  </div>
</B_langues>

dans mes_options, j'ai mis :
/////////////////////////////////////
// BOUCLE LANGUES
/////////////////////////////////////
$langues = array(
    "abbrev" => "char(2)",
    "nom" => "varchar(20)",
    "url_lang" => "varchar(255)"
);
$langues_key = array(
    "PRIMARY KEY" => "abbrev"
);
$GLOBALS['tables_principales']['langues'] =
    array('field' => &$langues, 'key' => &$langues_key);

function boucle_LANGUES($id_boucle, &$boucles) {
    $boucle = &$boucles[$id_boucle];
    $separateur=join('', $boucle->separateur);
    $code=<<<CODE
    \$SP++;
    \$code=array();
    \$cible = new Link();
    \$cible->delVar('lang');
    \$cible = \$cible->getUrl();
    \$site = lire_meta('adresse_site');
    \$post = (\$site ? \$site : '..') . '/spip_cookie.php3?url='.urlencode(\$cible);
       \$l= split(',', lire_meta('langues_multilingue'));
    foreach(\$l as \$k) {
        \$mUrl=\$post.'&var_lang='.\$k;
        \$Pile[\$SP] = array('abbrev' => \$k,
                             'nom' => traduire_nom_langue(\$k),
                             'url_lang' => \$mUrl);
        \$code[]=$boucle->return;
    }
    \$t0= join('$separateur', \$code);
CODE;

    return $code;
}

ca marche mais ...
$boucle->separateur me retournait Array ???
j'ai betement remplacé par :
join('', $boucle->separateur);
mais j'aimerai comprendre ...
c'est pas deja traité (et mieux que ca ...) par le compilo ca ?
pourquoi les critères généraux ne s'appliqueraient pas ?
Cette fonction calculer_boucle fait un peu mal à la tete, mais il doit y avoir moyen de sortir les criteres généraux, non ?
Bon, pour {0,n}, ca se discute vu que MySQL le gere (mais toutes les bases ne le gerent pas...), mais {1/2},{doublons} ... c'est peut etre jouable ?
Bon, OK, j'en demande beaucoup, mais comme je sais que vous en faites beaucoup ...

En attendant, c'est deja pas mal comme ca !
:wink:

@++

Fil a écrit :

$boucle->separateur me retournait Array ???
j'ai betement remplacé par :
join('', $boucle->separateur);
mais j'aimerai comprendre ...

J'avais pensé à un jeu différencié de séparateurs mais l'idée n'avait pas abouti. J'ai quand même gardé le code gérant plusieurs occurrences des séparateurs dans les critères, car ça ne doit pas etre considéré comme une erreur a priori, ça servira peut-etre quand même un jour.

c'est pas deja traité (et mieux que ca ...) par le compilo ca ?
pourquoi les critères généraux ne s'appliqueraient pas ?Cette fonction calculer_boucle fait un peu mal à la tete, mais il doit y
avoir moyen de sortir les criteres généraux, non ?

je ne comprends pas la question.

Déesse A.

Déesse A. a écrit :

J'avais pensé à un jeu différencié de séparateurs mais l'idée n'avait pas abouti. J'ai quand même gardé le code gérant plusieurs occurrences des séparateurs dans les critères, car ça ne doit pas etre considéré comme une erreur a priori, ça servira peut-etre quand même un jour.

Ah, OK (je vois pas bien comment ca peut servir, mais effectivement, ca ne coute rien de garder un tableau)

c'est pas deja traité (et mieux que ca ...) par le compilo ca ?
pourquoi les critères généraux ne s'appliqueraient pas ?Cette fonction calculer_boucle fait un peu mal à la tete, mais il doit y
avoir moyen de sortir les criteres généraux, non ?
   
je ne comprends pas la question.

Oui, désolé, il etait tard quand j'ai fait le mail.
En fait, j'aimerai pouvoir faire des criteres doublons et 1/2 voire meme 1,n sans avoir à les coder ... (c'est toujours noel non ?)
C'est juste une idée comme ca sur le principe, je ne vois pour le moment pas vraiment comment faire (sauf à faire un passage par reference de ce qui est manipulé ...)
J'ai regardé un peu le code de calculer_boucle mais je n'y ai pas passé assez de temps.
Tel que je l'ai fait, ces criteres sont inactifs.
En fait, je me disais qu'il y avait peut etre moyen de "sortir" la gestion de mode_partie et de doublons (pas vu ou c'etait ca ...) de calculer_boucle de facon à pouvoir l'utiliser dans une boucle déclarée dans mes_options (pas forcement que ca se fasse tout seul, mais eviter de recoder toute cette partie pour chaque boucle "non SQL").

Voila, c'est vraiment juste une idée en l'air, l'ajout de boucle marche deja très bien.

@++

PS : il y a aussi la gestion des separateurs qui a l'air très bien faite, ca serait dommage de faire du copier/coller ...

Je pense que la bonne solution c'est de définir un jeu spip_abstract_{select, fetch, count, free}
comme s'il s'agissait quand même d'un serveur SQL, car du coup tu n'as meme plus à savoir comment
s'appelle la fonction qui gere mode_partie etc.

Déesse A.

Déesse A. a écrit :