J'utilise Laravel 5.8 avec AdminLTE pour Laravel .
Il existe plusieurs options pour créer un menu, dont l'un est de le créer dans le fichier de configuration fourni, que j'utilise.
Vous pouvez spécifier une clé active
dans le menu qui vous permet de créer le menu a la classe qui rend l'élément de menu actif et active le menu déroulant.
J'ai un élément de menu, que je voudrais rendre actif sur ces pages:
active => ['/ posts']
) Ces URL ne doivent pas correspondre:
Je ne peux pas utiliser / posts / *
car cela rendrait la page de création et d'autres actives.
Le readme suggère que vous pouvez également utiliser regex pour ce faire. Je n'utilise pas du tout regex, mais j'en suis venu à ceci, qui, selon regex101 semble correspondre à ce dont j'ai besoin:
[ 'text' => 'Posts overview', 'url' => '/posts', 'icon' => 'list', 'active' => ['/posts', '^\/posts\/[0-9]+$'], 'active' => ['/posts', '/posts/[^0-9]'] // also tried this ],
J'ai essayé de l'implémenter comme ceci:
^\/posts\/[0-9]+$
Malheureusement , cela ne semble pas fonctionner car cela ne rend pas l'élément de menu actif sur les pages répertoriées ci-dessus.
Modifier: j'ai également créé un problème dans le référentiel GitHub car je soupçonne que cela pourrait être un problème avec le paquet.
Suis-je en train de manquer quelque chose ou de mal faire?
4 Réponses :
Dans la classe ActiveChecker.php
du projet, vous pouvez trouver ce morceau de code
protected function checkPattern($pattern) { $fullUrlPattern = $this->url->to($pattern); $fullUrl = $this->request->fullUrl(); return Str::is($fullUrlPattern, $fullUrl); }
Basé sur la documentation laravel, Str :: est n'exécute pas de correspondance d'expression régulière, mais juste supporte les astérisques pour les jokers.
Dans votre cas, vous pouvez publier un PR qui utilisera regexo si le modèle donné est une expression régulière, sinon, exécutez Str :: est
Je pensais aussi à quelque chose comme ça, mais vérifier si une chaîne est une expression régulière avec une autre expression régulière est une solution qui ne fonctionnera pas pour toutes les expressions rationnelles. Une autre solution serait quelque chose comme la réponse acceptée de cette question . Mais cela me semble vraiment piraté.
Hé, j'ai ouvert une pull request pour une solution similaire à ce que vous suggéré, je vous attribuerai la prime.
Merci! J'ai jeté un coup d'œil au PR et c'est du bon matos. Corrigez simplement la syntaxe (je suppose que leur CI ne permet pas d'ajouter des lignes vides dans le commit), et appuyez pour le faire fusionner
Vous pouvez essayer d'utiliser le modèle ci-dessous dans votre code:
/posts /posts/3829 /posts/921 /posts/1
Cela fonctionnera pour les scénarios de test ci-dessous:
/^\/posts(\/[0-9]+)?$/
Vous peut vérifier l'exigence avec la solution fournie sur REGEX_Solution
J'espère que cela fonctionne !
C'est là que la dénomination d'itinéraire est vraiment utile. Donc, dans mon code, cette route nommerait quelque chose comme admin: post.index
. Ensuite, pour vérifier s'il était actif, je pourrais utiliser l'assistant de requête et une méthode appelée routeIs ()
.
En utilisant le nom que j'utiliserais, voici un exemple:
request()->routeIs('admin:post.*')
Maintenant, si je voulais que ce lien soit actif pour les routes de création, d'édition, de suppression, etc., je ferais ce qui suit:
request()->routeIs('admin:post.index')
Ceci fonctionnerait puisque j'applique des noms de route suivant une hiérarchie de notation par points.
Vous pouvez éventuellement fournir plusieurs modèles à cette méthode s'il y avait des routes spécifiques que vous vouliez faire correspondre.
J'ai créé une solution à mon problème, ce n'est en aucun cas la plus jolie solution, mais cela fonctionnera, pour le moment.
J'ai édité le fichier ActiveChecker.php
et édité le Fonction checkPattern ()
, donc il évalue regex si le modèle dans le fichier de configuration commence par regex:
.
'active' => ['/suppliers', 'regex:@^posts/[0-9]+$@'],
Dans mon fichier de configuration, je peux maintenant simplement le faire, pour utiliser un modèle d'expression régulière, simplement en utilisant le préfixe regex:
.
protected function checkPattern($pattern) { $fullUrlPattern = $this->url->to($pattern); $fullUrl = $this->request->fullUrl(); if(mb_substr($pattern, 0, 6) === "regex:") { $regex = mb_substr($pattern, 6); if(preg_match($regex, request()->path()) == 1) { return true; } return false; } return Str::is($fullUrlPattern, $fullUrl); }
Le chemin de la requête qui est posts / 1
par exemple, sera comparée à l'expression régulière, pas à l'URL complète.
Essayez
'active' => ['/ ^ \ / posts (?: \ / \ D +)? $ /']
@ WiktorStribiżew Merci pour votre suggestion, mais le résultat reste le même: le menu ne s'allume pas. Je commence à penser que cela pourrait être un problème avec le package sur GitHub.
Ok, probablement, je voulais juste souligner que les expressions rationnelles en PHP sont définies avec des délimiteurs d'expression régulière, et dans la plupart des cas, les ajouter suffit. De plus,
'/ ^ \ / posts (?: \ / \ D +)? $ /'
regex correspond à une chaîne qui commence par/ posts
et se termine immédiatement ici ou a/
et 1+ chiffres après (facultatif). Peut-être qu'une fois que vous aurez compris comment faire fonctionner les regex dans ce code, cela vous sera utile.