Quelle serait la meilleure façon de rechercher le segment d'URI actuel dans une vue Cadedigniter? Ce que j'essaie de faire est d'utiliser le segment URI actuel [I.e. $ this-> uri-> segment (1)] Pour mettre en surbrillance la page en cours de la barre de navigation.
Le meilleur que j'ai trouvé est de faire p> Il peut même être possible d'étendre la classe de contrôleur par défaut pour réussir le segment URI actuel, mais je ne suis pas sûr que cela fonctionnerait, ou même comment faire le faire. P> P>
6 Réponses :
J'ai également eu le même problème lorsque je construisais un site Web de client à CakephP, en passant ces chaînes pour chaque élément de menu du contrôleur à visualiser, puis en vérifiant à nouveau pour la mise en œuvre de la mise en évidence sur fastidieuse pour dire le moins.
Pour certains de mes projets maintenant, je vous ai mis en œuvre la même chose en stockant les informations de page pour chacune des pages de menu de navigation dans la base de données, des éléments tels que le nom de page, l'URL, le titre, la position dans le menu de navigation, etc. P>
Ensuite, au début du contrôleur, je stocke toutes ces données dans un tableau indique i gère la fonctionnalité de navigation via un seul contrôleur qui vérifie le segment URI et charge le Contenu basé sur cela. p> La pièce de surbrillance est laissée à une instruction IF lors de la génération de la vue, où je comparais le nom de chaque page aux informations que j'ai larguées dans quelque chose comme ça ... p> De cette façon, je n'ai pas besoin de transmettre les constantes de chaîne (segments d'Uri dans votre cas) à la vue. Cette approche CMS-Kinda me permet de flexible dans l'ajout d'éléments supplémentaires à mon menu, sans ajouter plus de code. P> Je me souviens d'avoir ceci à partir d'un codédiciteur wiki, vous ne pouvez pas trouver le lien à ce moment-là. p> p> $ PageInfo code>. P>
$ PageInfo CODE>. p>
J'utilise moi-même une fonction supplémentaire similaire à l'ancre (). Je l'appelle Active_anchor (), et il faut tous les mêmes paramètres plus un autre (l'URI). La fonction ajoute ensuite la classe 'active' si la chaîne URI passée correspond au paramter URL Active_anchor ().
La fonction renvoie à l'aide de la fonction d'ancrage (tout ce que la fonction a été déterminée si le lien avait besoin de la classe "active". ou non. p>
Je viens de mettre ce code dans un fichier appelé "my_url_helper.php". De cette façon, lorsque l'aide de l'URL est chargée (En fait, je charge réellement que l'un depuis à peu près tout mon point de vue l'utilise quand même.) Ce n'est que du code rapide aussi, à peu près sûr, il fonctionnerait. Fondamentalement, il faut les mêmes arguments que la fonction d'ancrage (), mais aussi Variable clé. Il ajoute une classe de "active" à la balise d'ancrage si la clé et l'URL correspondent. P> <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
if ( ! function_exists('active_anchor'))
{
function active_anchor($url = NULL, $title = NULL, $key = NULL, $params = array())
{
if ($url && $key)
{
if($key == $url)
{
if (array_key_exists ('class' , $params))
{
$params['class'] .= ' active';
}
else
{
$params['class'] = 'active';
}
}
}
return anchor($url, $title, $params);
}
}
J'aime cette approche. Où mettais-je cette fonction? Je suppose que j'ai besoin d'étendre l'une des classes CI, mais je ne suis pas sûr de quoi?
Je vais probablement être flammé pour suggérer une approche côté client, mais c'est quelque chose que j'ai utilisé dans le passé pour marquer la page actuelle comme en surbrillance:
var path = location.pathname.substring(1); if ( path ) $('#navigation a[href$="' + path + '"]').parents('li').attr('class', 'current');
Vous saviez que c'est la mauvaise approche, mais vous l'avez recommandé de toute façon?
Ce moyen simple et courir bien pour moi ..
<li class="<?=($this->uri->segment(2)==='test')?'current-menu-item':''?>"><?php echo anchor ('home/index','HOME'); ?></li> <li class="<?=($this->uri->segment(2)==='blog')?'current-menu-item':''?>"><?php echo anchor ('home/blog','BLOG'); ?></li> <li class="<?=($this->uri->segment(2)==='bla..bla')?'current-menu-item':''?>"><?php echo anchor ('home/blog','bla..bla'); ?></li>
Si vous avez vos contrôleurs organisés dans des dossiers, URI_SEGEMENT (2) ne serait plus la fonction de contrôleur.
Dans chaque projet de codeigniter, je collecte des informations de base sur la demande dans My_Controller.
I étendre le contrôleur de base et placez une logique d'initialisation qui doit se produire sur chaque page. Cela inclut l'obtention des informations sur le contrôleur et la méthode, qui est transmise à la vue. Comme un court exemple: p> maintenant dans une vue telle que la navigation, vous pouvez utiliser ces informations telles que ceci: p> J'aime bien car avec des itinéraires ou des réécrites, vous pouvez accéder aux contrôleurs et aux méthodes de différentes URL. De cette façon, vous définissez si le lien est actif sur la base du contrôleur / méthode qui servant le contenu et non basé sur l'URL. P> En outre, ces informations peuvent être réutilisées dans vos contrôleurs ou vos vues pour une raison quelconque. Et vous ne demandez pas continuellement au routeur ou à l'URI de calculer les informations (qui non seulement est inefficace, mais est lourde à écrire sur et sur). P> p>
Simple way to check the uri segment in view, Add some code if matches found. <li class="<?php echo (strcmp($this->uri->segment(2),'test')==0)?'active':''; ?>"><li> <li class="<?php echo (strcmp($this->uri->segment(2),'test1')==0)?'active':''; ?>"><li> <li class="<?php echo (strcmp($this->uri->segment(2),'test2')==0)?'active':''; ?>"><li>
Je fais la même chose, et je suis très curieux d'une meilleure solution.