Forum CMS Made Simple FR

Version complète : [Résolu]PREG_MATCH dans un {if}
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: ?
#~ Url du site : grignan.loft.galerie
#~ Hébergeur / Soft : o2switch
#~ Informations Système :
#~ ----------------------------------------------
#~ Cms Version: 2.1.2
#~ Installed Modules:
#~ AdminSearch: 1.0
#~ CGContentUtils: 2.1
#~ CGExtensions: 1.51.1
#~ CGGoogleMaps2: 0.99.3
#~ CGSimpleSmarty: 2.0.5
#~ CMSContentManager: 1.1
#~ CMSMailer: 6.2.14
#~ DesignManager: 1.1.1
#~ ExaCSS: 2.0.2
#~ FileManager: 1.5.2
#~ FormBuilder: 0.8.1.3
#~ JQueryTools: 1.3.8
#~ MicroTiny: 2.0.3
#~ MleCMS: 1.11.5
#~ ModuleManager: 2.0.2
#~ Navigator: 1.0.2
#~ News: 2.50.4
#~ Search: 1.50.2
#~ TinyMCE: 3.1.2
#~ Config Information:
#~ php_memory_limit:
#~ max_upload_size: 512000000
#~ url_rewriting: mod_rewrite
#~ page_extension: .html
#~ query_var: page
#~ auto_alias_content: true
#~ locale:
#~ set_names: true
#~ timezone: Europe/Paris
#~ permissive_smarty: false
#~ Php Information:
#~ phpversion: 5.5.32
#~ md5_function: On (Vrai)
#~ json_function: On (Vrai)
#~ gd_version: 2
#~ tempnam_function: On (Vrai)
#~ magic_quotes_runtime: Off (Faux)
#~ E_ALL: 24567
#~ E_STRICT: 2048
#~ E_DEPRECATED: 0
#~ test_file_timedifference: Aucune différence de date du système trouvée
#~ test_db_timedifference: Aucune différence de date du système trouvée
#~ create_dir_and_file: 1
#~ memory_limit: 512M
#~ max_execution_time: 120
#~ register_globals: Off (Faux)
#~ output_buffering: 4096
#~ disable_functions:
#~ open_basedir:
#~ test_remote_url: Valable
#~ file_uploads: On (Vrai)
#~ post_max_size: 512M
#~ upload_max_filesize: 512M
#~ session_save_path: /tmp (0700)
#~ session_use_cookies: On (Vrai)
#~ xml_function: On (Vrai)
#~ xmlreader_class: On (Vrai)
#~ check_ini_set: On (Vrai)
#~ curl: On
#~ Performance Information:
#~ allow_browser_cache: Off (Faux)
#~ browser_cache_expiry: 60
#~ php_opcache: On (Vrai)
#~ smarty_cache: Off (Faux)
#~ smarty_compilecheck: Off (Faux)
#~ smarty_cache_udt: Off (Faux)
#~ auto_clear_cache_age: On (Vrai)
#~ Server Information:
#~ Server Software: Apache
#~ Server Api: litespeed
#~ Server Os: Linux 2.6.32-531.29.2.lve1.3.11.10.el6.x86_64 On x86_64
#~ Server Db Type: MySQL (mysqli)
#~ Server Db Version: 5.6.28
#~ Server Db Grants: Trouvé un privilège "GRANT ALL" qui semble être adapté
#~ Permission Information:
#~ tmp: /home/farangpr/Sites/grignanloftgalerie/tmp (0755)
#~ tmp_cache: /home/farangpr/Sites/grignanloftgalerie/tmp/cache (0755)
#~ templates_c: /home/farangpr/Sites/grignanloftgalerie/tmp/templates_c (0755)
#~ modules: /home/farangpr/Sites/grignanloftgalerie/modules (0755)
#~ uploads: /home/farangpr/Sites/grignanloftgalerie/uploads (0755)
#~ Masque de création de fichier (umask) : /home/farangpr/Sites/grignanloftgalerie/tmp/cache (0755)
#~ config_file: 0644
#~ ----------------------------------------------
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~



Bonjour à tous,


Pour personnaliser un menu d'un site multilingue, je voulais utiliser la fonction preg_match dans le gabarit du menu afin d'attribuer une classe uniquement au premier node de second niveau (1.1 ou 2.1 ou 3.1 ...)
j'ai donc, fait comme ça:

Code :
[== PHP ==]
{if preg_match("/^\d[\.][1]$/", $node->hierarchy)}
     {$href_class = ['icon-home']}
{/if}

Le problème est que j'ai une erreur me disant que cette fonction est interdite:

[ins]Syntax error in template "cms_template:GLG Main Navigation" on line 27 "{if preg_match("/^\d[\.][1]$/", $hierarchy)}" PHP function 'preg_match' not allowed by security setting[/ins]

Pourquoi la fonction est interdite, et y'a-t-il une solution pour contourner cette interdiction?

Merci
>Pourquoi la fonction est interdite
parce que c'est un danger Wink
Voir Syntax error in template "..." on line 1 "..." PHP function '...' not allowed by security setting.
jce76350 a écrit :>Pourquoi la fonction est interdite
parce que c'est un danger Wink

Ok, je comprends que certaines fonctions puissent être dangereuse et que donc...

Code :
[== Indéfini ==]
$config['permissive_smarty'] = 1;

... la modif du fichier config puissent ouvrir des failles de sécurité

Est-ce possible alors d'arriver au même résultat dans le template du menu sans passer par un preg_match ?
Au lieu de mettre une classe, tu utilises le sélecteur :first-child
Code :
ul > :first-child {
    //les propriétés contenues dans ta classe icon-home
}
Jean le Chauve a écrit :Au lieu de mettre une classe, tu utilises le sélecteur :first-child
Code :
ul > :first-child {
    //les propriétés contenues dans ta classe icon-home
}

Ca, je suis d'accord pour pour la feuille de css mais pour remplacer le texte du menu par une icone font, il faut que je passe par une classe et que je supprime le texte directement dans le menu:

Code :
[== PHP ==]
{if preg_match("/^\d[\.][1]$/", $node->hierarchy)}
     {$href_class = ['icon-home']}
{/if}

...

{* regular item *}
                <li{do_class classes=$list_class}{$aria_support}>
                    <a{do_class classes=$href_class} href='{$node->url}'{if $node->target != ''} target='{$node->target}'{/if}>{if !preg_match("/^\d[\.][1]$/", $node->hierarchy)}{$node->menutext}{$parent_indicator}{/if}</a><br/><span class="menuborder"></span>
                    {if isset($node->children)}
                        {Simplex_menu data=$node->children depth=$depth+1}
                    {/if}
                </li>

avec mon css qui donne ça:

Code :
[== CSS ==]


[class^="icon-"], [class*=" icon-"] {
    font-family: 'icomoon';
    speak: none;
    font-style: normal;
    font-weight: normal;
    font-variant: normal;
    text-transform: none;
    line-height: 1;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

.icon-home:before {
    content: "\e907";
}

Le css, je peux le transposer à ul > :first-child, comme tu le dis, y'a pas de soucis, mais pour supprimer le texte du menu et n'avoir que l'icone... sans passer par des position:absolute et des left: -9999px pour le texte, le plus simple est de conditionner l'affichage directement dans le template du menu.

Du moins, je vois ça comme ça pour le moment...
Je ne vois pas l'intérêt de ne pas le gérer par le css : plus simple à mettre en place et surtout plus accessible.
Et avec un {if depth>1 && $node@first}{else}{$node->menutext}{$parent_indicator}{/if} ?
C'est bon !!!!

En fait, en faisant un explode de $node->hierarchy pour récupérer le premier chiffre et en le concaténant avec ".1" qui est la position voulue dans le menu on obtient toutes les premières pages du second niveau:

Code :
[== Indéfini ==]


{foreach $data as $node}

   {assign var='hierarchy' value="."|explode:$node->hierarchy}
   {assign var='hierarchy' value=$hierarchy[0]|cat:".1"}

   {* setup classes for the anchor and list item *}

...

   {if $node->hierarchy == $hierarchy}
      {$href_class = ['icon-home']}
   {/if}
    
...

   {* regular item *}
      <li{do_class classes=$list_class}{$aria_support}>
         <a{do_class classes=$href_class} href='{$node->url}'{if $node->target != ''} target='{$node->target}'{/if}>
            {if $node->hierarchy != $hierarchy}{$node->menutext}{$parent_indicator}{/if}
         </a>
        
         <br/><span class="menuborder"></span>

         {if isset($node->children)}
            {Simplex_menu data=$node->children depth=$depth+1}
         {/if}
      </li>

   {/if}
{/foreach}

Ouik a écrit :Je ne vois pas l'intérêt de ne pas le gérer par le css : plus simple à mettre en place et surtout plus accessible.

Comme je l'ai dit juste avant, je veux une icone et pas une icone + texte.
En css, on ne peux pas remplacer du contenu, on peut en rajouter avant ou après mais pas supprimer dfu texte.
Sinon, il aurait fallu englober le texte dans une balise <span> par exemple et rendre cette balise non visible et je n'avais pas envie de ça.
Regarde mon post précédent, si ce n'est pas déjà fait.
Jean le Chauve a écrit :Regarde mon post précédent, si ce n'est pas déjà fait.

Je l'ai vu juste après avoir posté ma solution fonctionnelle.

Je viens d'essayer la tienne et j'ai l'icone+le texte, ce qui est con car c'était encore plus simple et mieux

par contre ta solution fonctionne comme ça:

Code :
{if $depth==0 && $node@first}{else}{$node->menutext}{$parent_indicator}{/if}
{if $depth>0 && $node@first}
ou $node->depth > 0
Jean le Chauve a écrit :{if $depth>1 && $node@first}

$depth est 0 pour toutes les pages de mon premier niveau, qui est en fait le second mais pt'etre que le childrenof change la profondeur des pages.

Code :
[== Indéfini ==]
{Navigator loadprops='0' childrenof=$lang_parent template='GLG Main Navigation'}
On se croise, je viens de modifier le post précédent.
C'est bien $depth==0 dans mon cas qu'il faut utiliser car avec $depth>0 toutes les premières pages de chaque niveau sont impactées et moi je ne veux que celle du premier niveau affiché

En tout cas merci pour ce bout de code, c'est simple, clair et ça fait le job ! Wink
Effectivement quand tu nous auras tout dit Wink
Tu aimes faire durer le suspens Smile
Citation :pour remplacer le texte du menu par une icone font, il faut que je passe par une classe et que je supprime le texte directement dans le menu:
Citation :childrenof=$lang_parent
La prochaine fois, essaye de donner tous les renseignements utiles dès le premier message Wink
snatch1974 a écrit :Pour personnaliser un menu d'un site multilingue, je voulais utiliser la fonction preg_match dans le gabarit du menu afin d'attribuer une classe uniquement au premier node de second niveau (1.1 ou 2.1 ou 3.1 ...)

En disant un menu multilingue, il me semblait qu'il allait de soit qu'il y'avait un childrenof dans la déclaration et j'ai bien précisé "uniquement au premier node de second niveau" :p

J'aurais dû être plus clair, c'est de ma faute mais avec un depth à 0 et une hierarchy qui commence à 2.1, on s'embrouille rapidement ! :lol:

En tout cas, un grand grand merci Wink

Je clôs?
Clos mon ami, clos :p
Et pour finir en beauté, "clore" ne prend un accent circonflexe qu'à la 3e personne du singulier de l'indicatif présent Cool
snatch1974 a écrit :
Ouik a écrit :Je ne vois pas l'intérêt de ne pas le gérer par le css : plus simple à mettre en place et surtout plus accessible.

Comme je l'ai dit juste avant, je veux une icone et pas une icone + texte.
En css, on ne peux pas remplacer du contenu, on peut en rajouter avant ou après mais pas supprimer dfu texte.
Sinon, il aurait fallu englober le texte dans une balise <span> par exemple et rendre cette balise non visible et je n'avais pas envie de ça.

TU n'en as peut-être pas envie, certains de tes utilisateurs, très certainement. Bref, dommage pour eux. :/
Ouik a écrit :
snatch1974 a écrit :
Ouik a écrit :Je ne vois pas l'intérêt de ne pas le gérer par le css : plus simple à mettre en place et surtout plus accessible.

Comme je l'ai dit juste avant, je veux une icone et pas une icone + texte.
En css, on ne peux pas remplacer du contenu, on peut en rajouter avant ou après mais pas supprimer dfu texte.
Sinon, il aurait fallu englober le texte dans une balise <span> par exemple et rendre cette balise non visible et je n'avais pas envie de ça.

TU n'en as peut-être pas envie, certains de tes utilisateurs, très certainement. Bref, dommage pour eux. :/

C'est juste une page d'accueil sans grand intérêt réel donc, juste une icone en forme de petite maison pour matérialiser cette page dans le menu est amplement suffisant sur ce coup là... en plus le site concerne une gallerie d'art à vendre donc, la petite maison va bien et moins longtemps le site restera en ligne, mieux ce sera car celà voudra dire qu'elle est vendue ! :lol: