class active & foreach

Par zenkiai, il y a 14 ans


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, il y a 14 ans

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, il y a 14 ans

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

abdelakbirG, il y a 14 ans

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, il y a 14 ans

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

abdelakbirG, il y a 14 ans

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')))
abdelakbirG, il y a 14 ans

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>
abdelakbirG, il y a 14 ans

aucun probleme avec cache :D

zenkiai, il y a 14 ans

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

abdelakbirG, il y a 14 ans

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

zenkiai, il y a 14 ans

Ça marche !