[TYPO3-UG Quebec] Menu multilingue et script php

Fred hamel at urbansecurity.org
Mon Jul 9 15:02:57 CEST 2007


Bon, j'ai réellement besoin de me reposer et de revoir mes fondamentaux, 
c'était mon attribution qui était mauvaise.
J'ai fait ce script qui fonctionne très bien :

<?php
/* exec_SELECTquery ($select_fields, $from_table, $where_clause, 
$groupBy='', $orderBy='', $limit='')  */
class user_functions {
    function my_flags($content,$conf)    {
            /* Récupération de l'id de l'item courant */
        $cur_uid = $this->cObj->stdWrap($conf['factor'], $conf['factor.']);
            /* Création du span qui va contenir les drapeaux, drapeau 
anglais (langue par défaut) en premier + url */
        $babel = "<span class='babel'><a 
href='index.php?id=".$cur_uid."&L=0'><img 
src='fileadmin/media/flags/flag_uk.gif' /></a>";
            /* Création d'un array contenant les noms des images des 
drapeaux */
        $flags = array('flag_uk.gif', 'flag_fr.gif', 'flag_de.gif', 
'flag_es.gif', 'flag_it.gif', 'flag_pt.gif', 'flag_pl.gif');
            /* Création de la requête en prenant garde de ne pas prendre 
en compte les champs supprimés ou cachés */
        $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery ('*', 
'pages_language_overlay', 'pid='.$cur_uid.' AND deleted=0');
        
        while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)){

            $babel .= "<a 
href='index.php?id=".$row['pid']."&L=".$row['sys_language_uid']."'>";
            $babel .= "<img 
src='fileadmin/media/flags/".$flags[$row['sys_language_uid']]."' />";
            $babel .= "</a>";

        }
        $babel .= "</span>";
        return $babel;
    }
}
?>

Pas très optimisé Typo3 mais ça fonctionne, si quelqu'un a des 
suggestions pour l'améliorer je suis preneur, tant que ça peut me 
permettre de progresser. On m'a par exemple recommandé d'utiliser 
exec_SELECTgetrows à la place de exec_SELECTquery mais lorsque j'essaye 
de le remplacer j'ai des messages d'erreur, je continue de rechercher 
là-dessus.

Fred a écrit :
> Revoir les bases est toujours payant.
> J'ai donc repris le tutoriel et j'ai utilisé une classe que j'ai 
> déclarée dans la page comme suit :
> page.includeLibs.some_random_id_string = 
> fileadmin/media/scripts/test_fun.inc (au passage, que veut dire "some 
> random id string" ??)
> Puis je l'appelle ainsi dans mon menu :
>
>  # Second level menu-object, textual
> temp.menu_2.2 = TMENU
> temp.menu_2.2 {
>    # Normal state properties
>  NO{
>  #linkWrap = &nbsp | &nbsp
>  #before.data = field:uid
>  #allWrap = <tr><td class="menu_2_lvl_2_no"> | </td></tr>
>  allWrap.cObject = COA
>  allWrap.cObject{
>       10 = TEXT
>       10.value = <tr><td class="menu_2_lvl_2_no">
>       #20 = PHP_SCRIPT
>       #20.file=fileadmin/media/scripts/test_fun.inc
>       20 = USER
>       20.userFunc = user_functions->multiplyTest
>       20.factor = 2
>       30 = TEXT
>       30.value =  | </td></tr>
>  }
>  }
>    # Enable active state and set properties:
>  ACT = 1
>  ACT.allWrap = <tr><td class="menu_2_lvl_2_ac"> | </td></tr>
> }
>
> Et comme ça ça fonctionne, j'ai bien l'id de la page courante qui 
> apparaît multiplié par 2.
>
> Mais là où je ne comprend plus c'est pourquoi il ne veut pas prendre 
> 20.factor = field:uid afin que la variable transmise soit non-plus le 
> nombre 2 mais bien l'uid de la page de l'item du menu ? Pourtant ça 
> fonctionne très bien quand je fais before.data = field:uid , dans ce 
> cas j'ai bien l'uid de l'item en question ???
>
>
> Fred a écrit :
>> Bon, dans un sens ça progresse, j'arrive à inclure un php dans le menu.
>> J'ai essayer d'intégrer le sélecteur de kasper mais il répète le 
>> même, normal puisqu'il tient compte de la variable courante.
>> J'arrive également à afficher l'uid de l'item avec before.data = 
>> field:uid mais je ne vois pas bien comment l'utiliser dans un script 
>> php, d'autant que celui que j'ai créé (avec une simple fonction du genre
>>
>> function(){
>> $content = youpi
>> }
>>
>> m'affiche un message d'erreur me disant que cette fonction est déjà 
>> déclarée.
>> Je rame, mais si quelqu'un a une idée... en attendant j'espère que ça 
>> aidera d'autres personnes.
>>
>> Fred a écrit :
>>> Merci pour la solution, mais en fait le multilingue fonctionne.
>>>
>>> En fait je pense intégrer un menu qui soit à peu près celui de 
>>> kasper mais je ne sais pas wrapper le script php dans le menu.
>>> Je pense qu'un script php peut faire l'affaire, il récupère l'id de 
>>> la page pointée en lien  et le compare avec les entrées disponibles 
>>> en traductions, c'est ce que fait le script de kasper, me semble-t-il.
>>>
>>> //récupération des données de pages_language_overlay pour l'id en cours
>>> $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 
>>> 'pages_language_overlay', 'pid='.intval($GLOBALS['TSFE']->id);
>>> $tab    = array();
>>> while($tab = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
>>>    $rows[] = $row;
>>> }
>>> //s'il ne trouve rien il n'y a pas de traduction
>>> if (count($rows) == 0){
>>>    $rub_menu    = "<div><a 
>>> href=\"index.php?id=\"".intval($GLOBALS['TSFE']->id."></div>";
>>> }else{
>>> //inclusion des drapeaux pour chaque langue
>>>   }
>>>
>>> Grosso-modo (c'est en cours de travail).
>>>
>>>
>>>
>>> Sébastien Rivest a écrit :
>>>> Bonjour Fred,
>>>>  
>>>>
>>>> Je ne sais pas si cela peut te venir en aide... Mais pour les sites 
>>>> multilangues, j'utilise une config dans le champ setup de mon 
>>>> template principale.
>>>>
>>>>  
>>>>
>>>> # configuration de la langue pour le site par défaut
>>>>
>>>> config.sys_language_uid =0
>>>>
>>>> config.language=fr
>>>>
>>>> config.locale_all=fr_FR
>>>>
>>>> page.config.language = fr
>>>>
>>>>  
>>>>
>>>> #configuration de la variable L
>>>>
>>>>  
>>>>
>>>> config.linkVars=L
>>>>
>>>>  
>>>>
>>>> #français
>>>>
>>>> [globalVar = GP:L = 0]
>>>>
>>>> config.sys_language_uid = 0
>>>>
>>>> config.language = fr
>>>>
>>>> config.locale_all = fr_FR
>>>>
>>>> page.config.language = fr
>>>>
>>>>  
>>>>
>>>>  
>>>>
>>>> #doit etre retourner pour que les langues marchent
>>>>
>>>> [GLOBAL]
>>>>
>>>>  
>>>>
>>>> #anglais
>>>>
>>>> [globalVar = GP:L = 1]
>>>>
>>>> config.sys_language_uid = 1
>>>>
>>>> config.language = en
>>>>
>>>> config.locale_all = english
>>>>
>>>> page.config.language = en
>>>>
>>>>  
>>>>
>>>> #doit etre retourner pour que les langues marchent
>>>>
>>>> [GLOBAL]
>>>>
>>>>  
>>>>
>>>>  
>>>>
>>>> Solution #1
>>>>
>>>> Ensuite, le code typoscript qui génère mon menu est standard et 
>>>> s'adapte en fonction des langues.
>>>>
>>>>  
>>>>
>>>> Suggestion pour ton menu (Je n'ai pas du tout testé ça !) :
>>>>
>>>>  
>>>>
>>>> Instancie une variable quand tu configures tes langues dans le 
>>>> template principal...
>>>>
>>>> (Champ constant cette fois-ci)
>>>>
>>>>  
>>>>
>>>> [globalVar = GP:L = 0]
>>>>
>>>> drapeauMenu= class="menu_2_lvl_1"
>>>>
>>>>  
>>>>
>>>> Ensuite dans ton code temp.menu_2 :
>>>>
>>>>  
>>>>
>>>> NO.allWrap = <tr><td {$drapeauMenu}> | </td></tr>
>>>>
>>>>  
>>>>
>>>>  
>>>>
>>>> Solution #2
>>>>
>>>>  
>>>>
>>>> Tu pourrais aussi envisager de charger une autre feuille de style 
>>>> (personnalisée selon la langue). Donc si l'usager navigue sur ton 
>>>> site anglais, il voit la feuille de style en anglais. Pour cela 
>>>> (dans le champ setup) utilise :
>>>>
>>>>  
>>>>
>>>> [globalVar = GP:L = 1]
>>>>
>>>> page.stylesheet = fileadmin/template/monSite/css/styleAnglais.css 
>>>> par exemple.
>>>>
>>>>  
>>>>
>>>>  
>>>>
>>>> Réflexion
>>>>
>>>>  
>>>>
>>>> Je viens de penser que tu veux peut-être que ton menu détecte dans 
>>>> quelle langue est l'item généré du menu... Dans ce cas, je ne 
>>>> saurais t'aider... si tu as utilisé la solution avec une seule 
>>>> hiérarchie mais des versions différentes de tes pages selon les 
>>>> langues, je ne saurais pas comment «capter» l'information car le 
>>>> lien généré par le code du menu mène vers une page qui possède 
>>>> elle-même une version pour chaque langue.
>>>>
>>>>  
>>>>
>>>> J'espère que ça peut te donner des pistes de solution.
>>>>
>>>>  
>>>>
>>>> Bonne chance !
>>>>
>>>>  
>>>>
>>>>  
>>>>
>>>> -----Message d'origine-----
>>>> De : typo3-ug-quebec-bounces at lists.netfielders.de 
>>>> [mailto:typo3-ug-quebec-bounces at lists.netfielders.de] De la part de 
>>>> Fred
>>>> Envoyé : 4 juillet 2007 06:42
>>>> À : typo3-ug-quebec at lists.netfielders.de
>>>> Objet : [TYPO3-UG Quebec] Menu multilingue et script php
>>>>
>>>>  
>>>>
>>>> Bonjour,
>>>>
>>>>  
>>>>
>>>> Voici le descriptif de mon deuxième problème.
>>>>
>>>> J'ai un site en 5 langues, j'utilise le sélecteur de kasper, tout
>>>> fonctionne.
>>>>
>>>> Ce que je souhaite faire, ça serait inclure ce sélecteur (ou un autre)
>>>> directement dans l'item concerné, afin que les drapeaux des 
>>>> éventuelles
>>>> traductions apparaissent à côté de chaque titre.
>>>>
>>>> J'épluche la documentation mais le forum français n'est pas accessible
>>>> ces temps-ci.
>>>>
>>>> Je pense que ça doit être possible via un script php à inclure dans le
>>>> allwrap mais je ne vois pas comment.
>>>>
>>>>  
>>>>
>>>> temp.menu_2 = HMENU
>>>>
>>>> temp.menu_2.entryLevel = 2
>>>>
>>>>   # First level menu-object, textual
>>>>
>>>> temp.menu_2.1 = TMENU
>>>>
>>>> temp.menu_2.1 {
>>>>
>>>>     # Normal state properties
>>>>
>>>>   NO.allWrap = <tr><td class="menu_2_lvl_1"> | </td></tr>
>>>>
>>>> }
>>>>
>>>>   # Second level menu-object, textual
>>>>
>>>> temp.menu_2.2 = TMENU
>>>>
>>>> temp.menu_2.2 {
>>>>
>>>>     # Normal state properties
>>>>
>>>>   NO.linkWrap = <td class="menu_2_lvl_2_no"> | </td>
>>>>
>>>>   NO.allWrap = <tr class="toto">|</tr>
>>>>
>>>>     # Enable active state and set properties:
>>>>
>>>>   ACT = 1
>>>>
>>>>   ACT.allWrap = <tr><td class="menu_2_lvl_2_ac"> | </td></tr>
>>>>
>>>> } _______________________________________________
>>>>
>>>> TYPO3-UG-quebec mailing list
>>>>
>>>> TYPO3-UG-quebec at lists.netfielders.de
>>>>
>>>> http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-ug-quebec
>>>>
>>>>   


More information about the TYPO3-UG-quebec mailing list