Submitted by quicksand on
Salut à tous,
J'ai un léger problème dans une fonction phptemplate. Le but de cette fonction et d'assigner au chaque élément de menu un ID CSS.
Pour cela,la fonction transforme la chaine de caractère en échangeant les espaces par des tirets bas, et les majuscules par les minuscules.
Voilà en exemple :
$search = array("á", "â", "ä", "a", "a", "a",
"é", "e", "ë", "e", "e",
"ó", "ô", "ö", "o", "o",
"í", "î", "i", "i",
"ú", "u", "ü", "u",
"ý", "y",
"ç",
"Á", "Â", "Ä", "A", "A", "A",
"É", "E", "Ë", "E", "E",
"Ó", "Ô", "Ö", "O", "O",
"Í", "Î", "I", "I",
"Ú", "U", "Ü", "U",
"Ý", "Y",
"Ç",
"'", '"', "`", " ");
$replace = array("a", "a", "a", "a", "a", "a",
"e", "e", "e", "e", "e",
"o", "o", "o", "o", "o",
"i", "i", "i", "i",
"u", "u", "u", "u",
"y", "y",
"c",
"A", "A", "A", "A", "A", "A",
"E", "E", "E", "E", "E",
"O", "O", "O", "O", "O",
"I", "I", "I", "I",
"U", "U", "U", "U",
"Y", "Y",
"C",
"-", "-", "-", "_"
);
$css_id = strtolower(str_replace($search, $replace, strip_tags($link)));
return '<li id="' . $css_id . '" class="' . ($leaf ? 'leaf' : ($children ? 'expanded' : 'collapsed')) .'">'. $link . $children ."</li>\n";
}
Le problème avec cette fonction, c'est qu'elle ne transforme pas les caractères spéciaux, comme le "é", j'ai pourtant essayé en local dans un fihcier PHP et ça a marché, mais sous Drupal, sans succès.
La fonction transforme bel et bien l'espace en tiret bas, mais le "é", n'est pas transformé en "e".
Quelqu'un pourrait m'aider sur ce point ?
Merci
C'est quelle fonction que tu
Permalien Soumis par haza le 22 Mars, 2008 - 23:22
C'est quelle fonction que tu redéfinie sur ton phptemplate ?
Au vu du return, ca semble être une fonction qui met en forme un élément pour une sortie html ?
A partir de là, tu es sur que le texte soumis comporte bien les caractères accentué et non les "équivalents" html ? (c'est a dire les è ; é ; et autres ç ; (sans les espaces, bien sur, sinon ils sont interpréter ici))
Si c'est le cas, c'est plutot logique que la substitution n'est pas effectué (mais que les espaces, eux, fonctionnent).
Sinon, pour info, j'ai du faire la même chose pour divers petit module, et pour le faire, je suis parti de la technique employé dans pathauto. Au final, ca donne ça :
<?php
// Definition d'un pattern de remplacement
$pattern = "/[^a-zA-Z0-9]+/ ";
// transileration
$titre_du_noeud = <em>transliteration($titre_du_noeud);
// Tout ce qui n'est pas alphanumérique pur (A à Z, sans accent, 0 à 9)
// devient un $separator
$separator = "</em>";
$node_clean = preg_replace($pattern, $separator, $titre_du_noeud); /**
* _transliteration
* @param
* $chaine : chaine de caractere. La chaine dans laquelle il faut virer
* tous les méchants caracteres pas beaux
* @return
* $o : la chaine d'entrée avec les caractere pas beaux remplacés par
des caracteres beaux
*/
function _transliteration($chaine) {
// Transliteration Powwwaaaa !!!!
$path = drupal_get_path('module', 'Mon_Petit_Module');
if (is_file($path. '/i18n-ascii.txt')) {
$translations = parse_ini_file($path. '/i18n-ascii.txt');
}
$o = strtr($chaine, $translations);
return $o;
} ?>
(voir fichier attaché pour le i18n-ascii.txt qui est dans le code)
Au cas où ça pourrait te servir ;)
La fonction définie dans
Permalien Soumis par quicksand le 22 Mars, 2008 - 23:59
La fonction définie dans phptemplate se charge d'attribuer aux liens dans le menu de navigation un ID Css unique afin de personnaliser chaque élément de menu, j'utilise cette fonction pour placer une icône différente pour chaque lien.
Et dans le CSS, je dois définir cette icone de cette manière :
#left li#classes_documentaires a {
background:url(icons/classes_documentaires.jpg);
}
La fonction a donc attribué au lien "Classes Documentaires" dans le menu navigation, un ID Css (classes_documentaires), en transformant les majuscules en minuscules, et les espaces en tirets bas.
Comme je l'ai expliqué plus haut, il ne transforme pas les caractères spéciaux, par exemple, pour le lien "Espace détente", logiquement, je devrais mettre dans le CSS :
#left li#espace_detente a {
background:url(icons/classes_documentaires.jpg);
}
Mais cela ne donne rien, l'icône ne s'affiche pas.
Voilà tout
Dans le code source de la
Permalien Soumis par haza le 23 Mars, 2008 - 00:19
Dans le code source de la page généré, où se trouve ton menu, tu as donc une classe du genre #left li#espace_détente a { ...
C'est bien ça ?
Exacte oui ! Dans le fichier
Permalien Soumis par quicksand le 23 Mars, 2008 - 00:26
Exacte oui !
Dans le fichier CSS attaché, la classe est du genre #left li#espace_detente a {..
Mais quand je vais voir le code source de la page sous firefox, je trouve : #left li#espace_détente a {..
donc le "é" est interprété tel qu'il est.
Sauf qu'en CSS, le "é", n'existe pas !
Personne pour m'aider sur ce
Permalien Soumis par quicksand le 29 Mars, 2008 - 15:46
Personne pour m'aider sur ce point ?
Je suis bloqué là.
Merci
Sinon il y a
Permalien Soumis par yched@drupal.org le 23 Mars, 2008 - 02:15
Sinon il y a http://drupal.org/project/transliteration
Salut, Merci pour ce lien,
Permalien Soumis par quicksand le 23 Mars, 2008 - 10:26
Salut,
Merci pour ce lien, mais je n'ai pas tellement compris son rôle, Tu pourrais me l'expliquer en quelques mots ?
Merci