Bonjour, après avoir lu plusieurs sujets dessus, j'ai réussi à mettre une classe active sur mes liens courant.
J'ai fait ainsi dans menu.ctp

<?php $pages = $this->requestAction(array('controller'=>'pages','action'=>'menu','admin'=>false)); ?>
<?php $controller = $this->request->params'controller'];?>
<li>
<?php echo $this->Html->link('Articles',array('controller'=>'posts','action'=>'index'),array('class'=>$controller=='posts'?'active':null)); ?> </li>
<?php foreach($pages as $k=>$v): $v = current($v); ?>
    <li><?php echo $this->Html->link($v'name'],$v'link'],array('class'=>($v'name']==$v'slug'])?'active':null)); ?></li>
<?php endforeach; ?>

Cela fonctionne bien pour mes articles, par contre pour mes pages cela ne fonctionne pas, lorsque je mets

'class'=>$controller=='pages'?'active':null

et que je clique sur une de mes pages, tous mes liens correspondant à mes pages passent en active , logique. C'est pourquoi j'ai mis

'class'=>($v'name']==$v'slug'])?'active':null

et là plus rien, aucune classe active.
Est ce que ma syntaxe est bonne ?
Y a-t-il une autre solution pour paraît à ce problème ?

Merci

10 réponses


abdelakbirG
Réponse acceptée

code modifier :) autre solution

<?php $pages = $this->requestAction(array('controller'=>'pages','action'=>'menu','admin'=>false)); ?>
<ul>
<li>
    <?php echo $this->Html->link('Articles',array('controller'=>'posts','action'=>'index'),array('id'=>'Articles')); ?>
 </li>

<?php foreach($pages as $k=>$v): $v = current($v); ?>
 <li>
    <?php echo $this->Html->link($v'name'],$v'link'],array('id'=>'P'.$v'id'])); ?>
 </li>
<?php endforeach; ?>
</ul>

et dans la vue de pages/show ajouter

<<script type="text/javascript">
    $('document').ready(function() {
        $('#P<?php echo $page'id']; ?>').addClass("active");
    })
</script>

et dans la vue de posts/ index et show ajouter

<<script type="text/javascript">
    $('document').ready(function() {
        $('#Articles').addClass("active");
    })
</script>

tu peux essayer avec c'est code :)
menu.ctp

<?php $pages = $this->requestAction(array('controller'=>'pages','action'=>'menu','admin'=>false)); ?>
<?php if(isset($this->Session->read('active')) && !empty($this->Session->read('active'))){
  $active=$this->Session->read('active');
}else
    $active=null;
?>
<ul>
<li>
<?php if($active == 'Articles'): ?>
       <?php echo $this->Html->link('Articles',array('controller'=>'posts','action'=>'index')
                                       ,array('class'=>'active')); ?>
    <?php else: ?>
        <?php echo $this->Html->link('Articles',array('controller'=>'posts','action'=>'index')); ?>
    <?php endif ; ?>
 </li>
<?php foreach($pages as $k=>$v): $v = current($v); ?>
 <li>
    <?php if($active == 'P'.$v'id']): ?>
        <?php echo $this->Html->link($v'name'],$v'link'],array('class'=>'active')); ?>
    <?php else: ?>
        <?php echo $this->Html->link($v'name'],$v'link']); ?>
    <?php endif ; ?>
 </li>
<?php endforeach; ?>
</ul>

est dans Postecontroller action index ajoute

public function index()
{
    $this->Session->write('active', 'Articles');
    ........

est dans Postecontroller action show ajoute

function show($id=null,$slug=null){
    if(!$id || !is_numeric($id)){
    throw new NotFoundException('Aucun page ne correspond à cet ID');
    }
    $this->Session->write('active', 'P'.$id);
    ............
zenkiai
Auteur

Je te remercie, mais j'ai une erreur :
Fatal error: Can't use method return value in write context in /home/.../app/View/Elements/menu.ctp on line 2

essayer avec c'est code
mais le seul problem le cache

<?php $pages = $this->requestAction(array('controller'=>'pages','action'=>'menu','admin'=>false)); ?>
<?php $active=$this->Session->read('active'); ?>
<ul>
<li>
<?php if($active == 'Articles'): ?>
       <?php echo $this->Html->link('Articles',array('controller'=>'posts','action'=>'index')
                                       ,array('class'=>'active')); ?>
    <?php else: ?>
        <?php echo $this->Html->link('Articles',array('controller'=>'posts','action'=>'index')); ?>
    <?php endif ; ?>
 </li>

<?php foreach($pages as $k=>$v): $v = current($v); ?>
 <li>
    <?php if($active == 'P'.$v'id']): ?>
        <?php echo $this->Html->link($v'name'],$v'link'],array('class'=>'active')); ?>
    <?php else: ?>
        <?php echo $this->Html->link($v'name'],$v'link']); ?>
    <?php endif ; ?>
 </li>
<?php endforeach; ?>
</ul>
zenkiai
Auteur

merci cela fonctionne, mais j'ai le soucis du cache en effet.
Pourquoi j'ai cette erreur avec ton premier code ?

j'ai trouve le problème dans lien mé je ne connais pas exactement

if(isset($this->Session->read('active')) && !empty($this->Session->read('active')))

aucun probleme avec cache :D

zenkiai
Auteur

Un p'tit coup de jaja, ça n'a jamais fait de mal. J'avais oublié cet adage du grand-père. C'est intemporel.
Merci AbdelakbirG, cela fonctionne avec ta dernière solution.
Je vais tout de même essayer de régler le soucis de la première. J'aime bien le faite d'utiliser cakePHP sans le Javascript.
A bientôt

de rien mais si tu ai trouve un solution pour 1 er solution dit moi

zenkiai
Auteur

Ça marche !