[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 =   |  
> #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