Меню побудови схеми


9

У мене виникають проблеми з обробкою меню в активному стані, коли меню не використовується для маршрутизації.

Я родом з Drupal, де система меню також обробляє маршрутизацію. тому налаштування активного стану та стану активного сліду обробляється маршрутом (який також діє як система візуалізації меню).

Зараз у багатьох фреймворках PHP є класи маршрутизаторів, які керують маршрутизацією. Це здається хорошим розділенням, оскільки Меню не повинно знати про POST || ВАРІАНТИ || ... запити.

Але під час написання фронтену мені стало важко кодувати меню. Або зберігання всього в БД і передача цих значень до перегляду. Мені не подобається такий підхід - це те, що ти наче створюєш копію того, що ти вже написав у своєму маршрутизаторі, але тепер використовуєш клас меню.

Приклад:

Route::get('/somewhere','routename.somewhere','showStuffController');
Route::post('/somewhere','routename.somewhere','saveStuffController');

Menu::add('label.somewhere','routename.somewhere');

Ви розділяєте тут проблеми, тож це приємно. Але меню сильно залежить в маршруті, щоб встановити його активний стан. У меню також потрібно знати про ієрархію, щоб встановити активний слід.

Так що так, встановлення активного сліду та активних класів статусу насправді є предметом перегляду. Але маючи

if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; }

всі ваші погляди здаються дурними. Потім додайте всі ті дратівливі активні сліди, якщо це, і це справжній роздут. Повідомлення, що перед тим, як подання відображається, і встановлення прапорця активного контуру на істинне просто здається настільки потворним, як я це знаю (передбачення, що циркулює над усіма дітьми, що переходить на всіх дітей, ...)

Моє запитання:

Чи існує закономірність чи розумний спосіб отримати цей очищувач, краще, ...? Як слід вирішувати "проблему" активного сліду?

Я думав передати дитину -> батьків. Тож починайте з реклами найглибший рівень, а потім працюйте вперед. Але тоді дитина знає про свого батька, але батько нічого не знає про своїх дітей (здається дивним).

Відповіді:


1

коли меню не використовується для маршрутизації

Я хотів би сказати , що маршрутизація може бути використана для меню.


Як ви вже зазначали, маршрутизатор буде гарним місцем для підключення. Я не думаю, що було б некрасиво використовувати гачок, який оцінює мета меню для поточної сторінки в кожному запиті.

Якщо ви ставите своїм поглядом відповідальним за відстеження активного стану, ви не розділяєте занепокоєння. Перегляди повинні робити все, для чого вони зроблені, - але це не обов'язково, щоб вони також керували станом свого меню. Метадані меню, як правило, у широкому доступі однакові, і вам потрібен лише маршрут, щоб можна було знайти і винести меню.

Залежно від маршрутизатора і ваших потреб, проста функція або клас, який бере деякі статичні метадані меню, і поточного маршруту буде достатньо для надання всієї необхідної вам інформації після цього.

Сама мета меню не обов'язково повинна бути об'єктом. Проста структура даних ключових значень без методів повинна бути достатньою у більшості випадків.

Гачок може створити об'єкт стану з деякими загальними функціональними можливостями, пов'язаними з вашим меню, наприклад, сухарі, глибина, батьківська сторінка або поточна сторінка, і зробити цей об’єкт відомим у контексті вашого http запиту. У вас є різні можливості всередині гака - але загалом мова йде про збір, підготовку та передачу необхідних даних для чогось, що вміє з цим боротися.

Цей підхід відповідає вашим потребам і має ряд переваг:

  1. Вашій базі даних не потрібно обробляти дані, які ви можете надати під час виконання з низькими витратами
  2. У вас буде меню (мета) в одному місці, що робить його доступним
  3. Якщо ви хочете, щоб ваше меню повністю покладалося на 1: 1 на ваших маршрутах, це можна досягти, надаючи мета меню динамічно
  4. Якщо ваш вміст зростає (і, отже, меню), ви можете перемістити ці дані в сеанс, який може бути записаний у сховище швидкого ключа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.