Здесь я представлю свой файлик который позволит вам использовать ЧПУ на PHP, без перекладывания ответственности на БД.
Файл позволяет:
Кратко выражаясь, это очень похоже на файл urls.py из Django, только на PHP.
А вот и сам код:
Надеюсь я удалил всё ненужное, но если найдёте что-нибудь, то обязательно сообщите.
Файл позволяет:
- Работать со ссылками прямо из него, всё просто и понятно, результатом работы является массив.
- Контроль уровня доступа к некоторым URI.
- Быстрое изменение самого URI для перехода.
Кратко выражаясь, это очень похоже на файл urls.py из Django, только на PHP.
А вот и сам код:
class urls
{
/* Описание переменых:
address Адрес по которому пользователь оброщается
* начало строки
& конец строки
aces_level Уровень доступа, к даному url
file Файл котырый необходимо предоставить
a_id_html элемент id в вёрстки html куда будет выведена сыллка
({?vars?}) - возврощаемое значения без пробелов
*/
private $urls = array(
array("address"=>"*&", "aces_level"=>"1", "file"=>"pages/main.php", "a_id_html"=>"main"), //Главна страница
array("address"=>"*login&", "aces_level"=>"0", "file"=>"pages/login.php", "a_id_html"=>"main"), //Логин
array("address"=>"*logout&", "aces_level"=>"2", "file"=>"all/logout.php", "a_id_html"=>"main"), //Деавторизация
array("address"=>"*signup&", "aces_level"=>"0", "file"=>"pages/checkIn.php", "a_id_html"=>"main"), //Регистрация
array("address"=>"*admin&", "aces_level"=>"5", "file"=>"admin_panel/main.php", "a_id_html"=>"main"), //Панель админитратора
);
private $aces_level = 0; //Уровень доступа
private $auth = 0; //Показывает авторизован, ли пользователь
private $dont_autherezet_user = 1; //Уровень доступа для не авторизованых пользователей
//Элементы для авторизации
private $user_auth_session = ''; //Названия элемента в массиве _SESSION
private $user_auth_cookie = ''; //Название элемента в массиве _COOKIE
private $user_url_decomposition; //URL пользователяв необходимом виде
private $page_404_error = "pages/error_page.php";
private function decomposition_url($url_for_decomposition){ //первращение url в массив с данными
$request = str_split($url_for_decomposition); $cell_number = -1;
$words = array();
for ($char = 0; $char < count($request); $char++) {
// оброботка спец символов
if ($char == 0 and $request[$char] == '*'){
continue;
}
if ($request[$char] == '&'){
break;
}
if ($request[$char] == '/') {
$cell_number += 1;
continue;
}
if ($cell_number < 0) {
//При возникновении ошибки, если не выполнился, ни один блок выше
$cell_number += 1;
}
$words[$cell_number] = $request[$char]; //сложение строк
}
return $words;
}
//проверка на наличие переменых во внутренних URL ($urls), где $url это строка из $urls
private function checking_for_variables_in_internal_URLs($url){
$url = $this->decomposition_url($url); //Получаем, массив из $url
//Производим, поиск номера элемента массива с переменой.
$array_with_numbers = array();
for ($char_number=0; $char_number<count($url); $char_number++){
$str_array = str_split($url[$char_number]);
for ($char_number_in_for=0; $char_number_in_for<count($str_array); $char_number_in_for++){
//начинаем проверку строки
if ($str_array[$char_number_in_for] == '('){
$num = $char_number_in_for+1;
if ($str_array[$num] == '{'){
$num = $char_number_in_for+2;
if ($str_array[$num] == '?'){
// Переменая найдена сохраняем номер элемента
$array_with_numbers[] = $char_number;
break; //При нахождении выходим в основной цикл
}
}
}
//Иначе проходим цикл без вопросов
}
}
//Производим поиск переменой в пользовательском REQUEST_URI
if (!isset($array_with_numbers[0])){
return;
}
$variables_array = array();
for ($char_numbers=0; $char_numbers<count($array_with_numbers); $char_numbers++){
$all = $this->user_url_decomposition[$variables_array[$char_numbers]];
}
return $variables_array; //Возврощаем, массив вида "название переменой"=>"значение"
}
function __construct($aces_level_front, $auth=0)
{
if ($auth != 0 ){
$this->auth = $auth;
}
$this->user_url_decomposition = $this->decomposition_url($_SERVER['REQUEST_URI']);
$this->aces_level = $aces_level_front; //Присваем уровень доступа для даного пользователя
}
public function url()
{
/* Возврощает массив с данными, подходящими по запросу, иначе ничего не возврощает. */
//Цикл возврощает максимально подходящий элемент массива $urls
for ($element_number=0; $element_number<count($this->urls); $element_number++) { //Обробатываем все елементы массива urls
//Начинаем обробатывать остальные элементы массив
//Производим проверку уровня досутпа
if ($this->aces_level >= $this->urls[$element_number]['aces_level']) { //Если пользователь имеет права доступа
if ($this->urls[$element_number]['aces_level'] == 0 and $this->aces_level != 0) { // Проверяем что пользователь не авторизован
continue; //Если авторизован, переходим к следущему URL
}
} elseif ($this->urls[$element_number]['aces_level'] != $this->dont_autherezet_user and $this->aces_level != 0) { //Если URL доступен для не авторизованых пользователей, то пропускаем пользователя
continue; //Иначе переходим к следущему URL
} //Также пользователь будет выходить отсюда, если не имет прав доступа
if ($this->urls[$element_number]['aces_level'] > $this->dont_autherezet_user and $this->aces_level == 0){
//Если уровень доступа к URI больше чем уровень доступа не авторизованого пользователя то
continue;
}
//Начинаем сравнивать url
$url = $this->decomposition_url($this->urls[$element_number]['address']); //Создаём массив из address
//Првоеряем все совпадение URL до возможных
$changing_similarities = 0; //Переменая сходства
for ($variable_recognize_elements_array=0; $variable_recognize_elements_array<count($this->user_url_decomposition); $variable_recognize_elements_array++) { //сравниваемэлементы массивов
if ($this->user_url_decomposition[$variable_recognize_elements_array] == $url[$variable_recognize_elements_array]){
$changing_similarities++; //Если URL соподает, то продолжаем поиск
} else { // Иначе, проверяем не является ли даный элемент переменной
$str_array = str_split($url[$variable_recognize_elements_array]);
for ($char_number_in_for=0; $char_number_in_for<count($str_array); $char_number_in_for++){
//начинаем проверку строки
if ($str_array[$char_number_in_for] == '('){
$num = $char_number_in_for+1;
if ($str_array[$num] == '{'){
$num = $char_number_in_for+2;
if ($str_array[$num] == '?'){
// Переменая найдена сохраняем номер элемента
$changing_similarities++;
break; //При нахождении выходим в основной цикл
}
}
}
//Иначе проходим цикл без вопросов
}
if ($variable_recognize_elements_array+1 != $changing_similarities){ //Если не совпадений, то выходим из цикла
break;
}
}
}
if(count($this->user_url_decomposition) == $changing_similarities){ // Проверяем совподают ли url, это больше предостережение
//Возврощаем необходимый файл
$variables_array = $this->checking_for_variables_in_internal_URLs(($this->urls[$element_number]['address']));
return array('file'=>$this->urls[$element_number]['file'], 'vars'=>$variables_array);
}
}
return array('file'=>$this->page_404_error); //Если не было найдено url, выводим ошибку
}
public function ajax_href(){
/* Возврощает ссылки с id блоков a, на страницу в формате JSON*/
}
function __destruct()
{
$this->aces_level = 0; //Устанавливаем в изначальное положение
}
}
Надеюсь я удалил всё ненужное, но если найдёте что-нибудь, то обязательно сообщите.