Розробка CMS з нуля
Доброго дня, читачу! Або вечір… не важливо, головне, що ти заглянув) Сьогодні ми продовжимо розробляти нашу CMS і реалізуємо таку штуку, як ЧПУ. Про те, що це, навіщо потрібно і як працює - все це розберемо і на виході отримаємо новий модуль для нашої системи. Сповнені вперед!
Отже, завдання на сьогодні:
- реалізувати розуміння двигуном семантичних посилань
- зробити це у вигляді модуля
- робота модуля не повинна позначатися на роботі логіки CMS
- при включенні семантичних урл, звичайні посилання повинні також працювати
- перевірити всю цю справу на простеньких прикладах
Мабуть, почнемо. Для початку, ми повинні створити файл з ім'ям .htaccess, так, саме таке ім'я по суті імені немає тільки розширення. Це конфігураційний файл веб-сервера для конкретного домену. Він нам потрібен щоб описати правило перезапису, яке стане основою для роботи нашого модуля. Отже, у створений у корені сайту файл .htaccess пишемо наступне:
Можливо, швидше за все навіть точно, це не найкращий варіант, але для основної роботи самих ЧПУ нам це цілком підходить. Параметр Модуль – це не ті модулі, які ми зараз розробляємо. Це модулі зовнішнього функціоналу, наприклад, модуль новин або реєстрації користувача. Щоб ви не плуталися у майбутньому. А тепер, як я це реалізував на PHP, поїхали.
Оголошуємо функцію і одразу створюємо масив, який повертатиме наша функція з набором наших даних.
Все, прелюдія позаду – починаємо серйозні речі робити. Т.к. ми приймаємо в функцію параметр, що говорить нам про те, яке посилання йому належить обробити, то почнемо з найцікавішого - семантичного урл, отже:
Якщо після цілого розподілу на 2 ми отримали залишок, відмінний від нуля, то значить кількість параметрів непарна,розбиваємо те, що є в масиві за знаком амперсанд (&) і, якщо в масиві щось є, ми отримаємо асоціативний масив виду ЗМІННА = ЗНАЧЕННЯ. Ми домовилися що обов'язково повинні бути присутніми 2 змінні, отже якщо їх немає, то немає сенсу обробляти цей запит.
Так, перевірили, все є, значить записуємо значення у відповідні осередки та видаляємо ці дані з масиву $_GET. Після видалення параметрів МОДУЛЬ і ДІЯ все, що залишається - це список параметрів для сторінки, що запитується. Їх теж записуємо в наш масив даних, але в окрему комірку. А якщо запит не проходить наші перевірки, то й не паримося його обробляти.
З альтернативним методом все, тепер повертаємось до ЧПУ. Якщо запит має парну кількість параметрів, то перший з них — МОДУЛЬ, а другий — ДІЯ. Просто виймаємо їх по черзі, видаляючи вихідний масив. Після цього, у нашому вихідному масиві, якщо щось і залишилося, це наші параметри для конкретної сторінки. Записуємо їх також у наш кінцевий масив. Все це виглядає так:
Залишилося тільки закрити найпершу операцію if у нашій функції та повернути отриманий масив з даними:
Ось і все, ЧПУ вже працюватиме, а якщо хтось вирішить по-старому звернутися до сайту - потрапить на альтернативний парсер. Не знаю, як вам, а мені сподобалася така реалізація. Єдине, що ще залишилося зробити - написати обробник, який спрацьовуватиме, якщо ЧПУ відключено. Тут нічого складного: у нас вже є потрібний код вище - той альтернативний обробник, який з цим впорається. Не повторно його розписуватиму, він практично ідентичний, дивіться самі:
Ну як? Кажу ж, той же код 🙂 Різниця лише в тому, що ми не намагаємося розбити рядок по слішах, а відразурозбиваємо по амперсанду, от і все. Ось тепер модуль роботи з ЧПУ можна назвати готовим, можна приступати до перевірок, але для початку давайте додамо одну змінну до нашого з вами конфіг:
Тепер приступаємо до тестів. Відкриваємо наш файл index.php і підключаємо новий модуль до нашого реєстру, відразу після підключення модуля бази даних:
Тепер можемо перевірити, як прийняв наш реєстр нового бійця - зайдемо на localhost, або інший локальний домен (якщо ви змінювали налаштування сервера). Якщо все пішло як слід, то у списку підключених модулів ми побачимо модуль з ім'ям "ЧПУ". Чи є? Чудово! Тепер перевіримо безпосередньо роботу модуля surl. Наприкінці файлу index.php пишемо наступний код:
Ну як?) Тепер спробуємо альтернативний парсер і запросимо ту саму сторінку, але у форматі get:
Якщо все зроблено правильно, клас відпрацює без помилок і при запиті обох посилань ви побачите, що функція правильно обробляє як ЧПУ, так і прості url з get-параметрами. Якщо відключити ЧПК у конфзі, то спрацьовуватиме одразу альтернативний парсер. Отже, що ж у результаті: модуль surl розуміє як людинозрозумілі УРЛи, так і класичні посилання з get-параметрами однаково; можна відключити обробку ЧПК і працювати тільки з get-запитами – це не вплине на логіку нашої системи. Поставлені на початку статті завдання виконані – я вважаю це черговий успішний крок, давайте себе з цим привітаємо;
Звісно, цим все не обмежиться. Ми навчили нашу CMS тільки розуміти семантичні посилання. Потрібен ще щонайменше якийсь обробник, який прийнявши дані МОДУЛЬ/ДІЯ/ПАРАМЕТРИ підвантажить потрібний модуль, який запустить необхідну дію з отриманими параметрами. До того ж я хочу реалізувати так звані аліаси статичних (не обов'язково?)сторінок.