Использование регулярных выражений, чтобы сделать пункт меню активным в Laravel Adminlte - PullRequest
2 голосов
/ 11 мая 2019

Я использую Laravel 5.8 с AdminLTE для Laravel .

Существует несколько вариантов создания меню, одним из которых является его создание в предоставленном файле конфигурации, который я использую.

Вы можете указать в меню клавишу active, которая позволяет сделать так, чтобы в меню был класс, который активизирует пункт меню и активирует раскрывающийся список.

У меня есть пункт меню, который я хотел бы сделать активным на этих страницах:

  • / posts (работает с active => ['/posts'])
  • / posts / {post_id} (идентификаторы только цифры)

Эти URL не должны совпадать:

  • / posts / create
  • / posts / anyotherlink
  • / posts / 1text

Я не могу использовать /posts/*, потому что это сделает страницу создания и некоторые другие активными.

Файл readme предполагает, что вы также можете использовать регулярные выражения для этого.Я вообще не использую regex, но я пришел к этому, что, согласно tot regex101 , похоже, соответствует тому, что мне нужно:

^\/posts\/[0-9]+$

Я пытался реализоватьэто так:

[
    'text'    => 'Posts overview',
    'url'     => '/posts',
    'icon'    => 'list',
    'active'  => ['/posts', '^\/posts\/[0-9]+$'],
    'active'  => ['/posts', '/posts/[^0-9]'] // also tried this
],

К сожалению, это, похоже, не работает, поскольку не делает пункт меню активным на перечисленных выше страницах.

Редактировать: Я также создал проблему в репозитории GitHub, так как подозреваю, что это может быть проблема с пакетом.

Я что-то упустил, или что-то не так?

Ответы [ 4 ]

2 голосов
/ 15 мая 2019

В классе ActiveChecker.php проекта вы можете найти этот фрагмент кода

protected function checkPattern($pattern)
{
    $fullUrlPattern = $this->url->to($pattern);

    $fullUrl = $this->request->fullUrl();

    return Str::is($fullUrlPattern, $fullUrl);
}

На основе документации laravel, Str::is не выполняет сопоставление регулярному выражению, но justs поддерживает звездочки для подстановочных знаков.

В вашем случае вы можете опубликовать PR, который будет использовать регулярное выражение, если данный шаблон является регулярным выражением, в противном случае выполните Str::is

0 голосов
/ 17 мая 2019

Я создал решение для своей проблемы, это ни в коем случае не самое красивое решение, но пока оно будет работать.

Я отредактировал файл ActiveChecker.php и отредактировал функцию checkPattern(), поэтому он оценивает регулярное выражение, если шаблон в файле конфигурации начинается с 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);
}

В моем файле конфигурации я теперь могу просто сделать это, чтобы использовать шаблон регулярного выражения, просто используя regex: префикс.

'active'  => ['/suppliers', 'regex:@^posts/[0-9]+$@'],

Путь запроса, например, posts/1, будет сравниваться с регулярным выражением, а не с полным URL.

0 голосов
/ 16 мая 2019

Здесь наименование маршрута действительно полезно.Итак, в моем коде этот маршрут был бы назван как admin:post.index.Затем, чтобы проверить, был ли он активен, я мог бы использовать помощник запроса и метод с именем routeIs().

Используя имя, которое я использовал, вот пример:

request()->routeIs('admin:post.index')

Теперь,если бы я хотел, чтобы эта ссылка была активной для маршрутов создания, редактирования, удаления и т. д., я бы сделал следующее:

request()->routeIs('admin:post.*')

Это сработало бы, поскольку я применяю имена маршрутов в соответствии с иерархией точечных обозначений.

При желании вы можете указать несколько шаблонов для этого метода, если есть определенные маршруты, которые вы хотите сопоставить.

0 голосов
/ 15 мая 2019

Вы можете попробовать использовать следующий код в вашем коде:

/^\/posts(\/[0-9]+)?$/

Это будет работать для следующих тестовых сценариев:

/posts
/posts/3829
/posts/921
/posts/1

Вы можете проверить требование с помощью предоставленного решения. REGEX_Solution

Надеюсь, что это работает!

...