2012-07-30 3 views
9

Sto creando un layout di fisarmonica per una barra laterale di amministrazione. Ora ho bisogno di identificare il collegamento attivo e aggiungere una classe active a quel collegamento. Ecco il mio codice:Come identificare il collegamento al menu attivo in CakePHP

<div class="accordion-group"> 
<div class="accordion-heading"> 
    <a href="#collapseSeven" data-parent="#side_accordion" data-toggle="collapse" class="accordion-toggle"> 
     <i class="icon-th"></i> Gallery Manager 
    </a> 
</div> 
<div class="accordion-body collapse" id="collapseSeven"> 
    <div class="accordion-inner"> 
     <ul class="nav nav-list"> 
      <li> 
       <?php echo $this->Html->link('View All',array('controller' => 'gallaries', 'action' => 'index'));?> 
      </li> 
      <li> 
       <?php echo $this->Html->link('Add New',array('controller' => 'gallaries', 'action' => 'add'));?> 
      </li> 
     </ul> 
     </div> 
    </div> 
</div> 

Qual è il modo migliore per farlo? Grazie in anticipo!

risposta

5

ho trovato la soluzione:

$url = $this->Html->url('INPUT_THE_URL') ; 
$active = $this->request->here == $url? true: false; 
+0

downvote, perché 'here()' include tutti i parametri nominati e la stringa di query. – mrdaliri

+0

L'URL in questa '$ this-> request-> here' non è necessariamente uguale a quello generato dal router, anche se dovrebbe essere. Dovresti normalizzare i tuoi URL con ['Router :: normalize()] (http://api.cakephp.org/2.6/class-Router.html#_normalize) prima di confrontarli. – bfncs

2

Ci sono un certo numero di modi, qui sono alcuni per aggiungere la classe al contenitore

<li <?php echo ($url == 'users/account')? 'class="current"' : ''?>> 
<li <?php echo (preg_match("/addresses/", $url))? 'class="current"' : ''?>> 
<li <?php echo ($this->params['controller'] == 'attributes')? 'class="current"' : ''?>> 

Oppure si può passare nella $options

$options = array(); 
if($this->controller == 'mycontroller' && $this->action == 'myaction'){ 
    $options = array_merge($options, array('class'=>'active')); 
} 
echo $this->Html->link('Title', '/url', $options); 
+0

Con questo approccio devo mettere condizione on/prima di ogni eventuale nesso aiutante o qualsiasi altro approccio con cui posso farlo in modo dinamico – Krishna

+2

@Krishna questo è normalmente il modo in cui si dispone sfortunatamente, per farlo in PHP, puoi creare la tua classe di helper se hai un layout coerente. – Dunhamzzz

+0

ci sono helper esistenti ecc. Che potresti usare. prova a google per loro o cerca il sito web dei plugin cakephp. – mark

1

modo semplice per aggiungere Qui classe attiva:

<ul class="nav nav-list"> 
    <li class="<?php echo (($this->params['controller']==='gallaries')&&($this->params['action']=='index'))?'active' :'' ?>"> 
      <?php echo $this->Html->link('View All',array('controller' => 'gallaries', 'action' => 'index'));?> 
    </li> 
    <li class="<?php echo (($this->params['controller']==='gallaries')&& ($this->params['action']=='add'))?'active' :'' ?>"> 
      <?php echo $this->Html->link('Add New',array('controller' => 'gallaries', 'action' => 'add'));?> 
    </li> 
</ul> 

Penso che questo sarà utile per voi.

+0

Questo approccio porterà a falsi positivi quando si utilizza [instradamento prefisso] (http://book.cakephp.org/2.0/en/development/routing.html#prefix-routing) e [indirizzamento plugin] (http: // book.cakephp.org/2.0/en/development/routing.html#plugin-routing) così come i falsi negativi quando richiedi contenuti con altri URL rispetto a quelli canonici. Inoltre è molto prolisso e un [DRY] (http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself). Un approccio migliore sarebbe il controllo degli URL corrispondenti dopo la normalizzazione con ['Router :: normalize()'] (http://api.cakephp.org/2.6/class-Router.html#_normalize). – bfncs

3

Per verificare se un determinato URL è attualmente attivo in Cakephp 2.x, è necessario verificare se è normalizzato (nel senso di Router::normalize()) il modulo è lo stesso del modulo normalizzato dell'URL attualmente richiesto (nel senso di $this->request->here).

$currentUrl = Router::normalize($this->request->here); 
$checkedUrl = Router::normalize($myUrl); 
$isActive = $currentUrl === $checkedUrl; 

A volte si potrebbe desiderare una corrispondenza allentata per mostrare una pagina come attiva in un menu, se un bambino è attualmente mostrato. Pensare di voler visualizzare il collegamento del menu al sito di panoramica dei frutti allo /fruits/ come attivo durante la navigazione nel sito dei dettagli Banana allo /fruits/banana/. Puoi ottenerlo facilmente cercando solo una corrispondenza parziale.

$isActive = (0 === strpos($currentUrl, $checkedUrl)); 

Di sicuro il vostro corrispondente potrebbe ottenere più complessi, per esempio se si sta pesantemente facendo uso di params nome e simili e vogliono rifletterla nel menu, ma si dovrebbe trovare la strada da qui.

Una soluzione per il vostro problema particolare potrebbe essere simile a questo:

$currentUrl = Router::normalize($this->request->here); 
$links = array(
    array(
     'label' => __('View All'), 
     'url' => array('controller' => 'galleries', 'action' => 'index'), 
    ), 
    array(
     'label' => __('Add New'), 
     'url' => array('controller' => 'galleries', 'action' => 'add'), 
    ), 
    /* ... */ 
); 

foreach ($links as $link) { 
    $linkLabel = $link['label']; 
    $linkUrl = Router::url($link['url']); 
    $linkHtml = $this->Html->link($linkLabel, $linkUrl); 

    $linkActive = $currentUrl === $linkUrl; 

    echo $this->Html->tag('li', $linkHtml, array(
     'class' => $linkActive ? 'active' : '', 
     'escape' => false, // to not escape anchor markup 
    )); 
} 

Per rendere il vostro vivo solo che pochino più facile nemmeno pensare a questa domanda, si potrebbe anche usare un Helper per la creazione di menu che qualcuno altrimenti costruito come torifat/cake-menu_builder.

1

So che questo è piuttosto vecchio ma ho trovato una buona soluzione.

in base alla risposta di Faisal ho scritto il mio semplice Helper:

App::uses('AppHelper', 'View/AppHelper'); 

class PVHtmlHelper extends AppHelper { 

    public $helpers = array('Html'); 

    public function link($title = null, $url = null, $options) { 

     if ($title == null || $url == null) 
      return; 

     $class = (($this->params['controller']===$url['controller']) && ($this->params['action']==$url['action']))?'active' :''; 

     echo "<li class='" . $class . "'>" . $this->Html->link($title, $url, $options) . "</li>"; 
    } 

} 

Forse è necessario modificare il echo <li> all'interno della funzione alle proprie esigenze.

Esempio:

echo $this->PVHtml->link('Login', array('controller' => 'users', 'action' => 'login')); 
+0

Grazie, mi ha aiutato molto! =) Uso CakePHP 3.1.5. Quindi per chiunque legga questo, la sintassi per 3.x deve essere: '$ this-> request-> params ['action']'. E alcune differenze all'inizio del file. Vedi: [Cakephp-3-Creating-Helpers] (http://book.cakephp.org/3.0/en/views/helpers.html#creating-helpers) – eve