Сайт

Сайт

Geo Point

Сайт проекта "ГеоПоинт" предназначен для работы и обеспечения контроля за геодезическими проектами компании. Основной функционал сайта состоит из отображения доступных пользователю проектов и всех точек проекта. Помимо доступа к проектам пользователь может просматривать историю работ по каждому проекту, посмотреть голосовые команды во время проведения съемки, доступные базовые станции рядом с топосъемкой и пункты ГГС и ОМС.

Структура проекта

Структура проекта сайта "ГеоПоинт" разделена на несколько частей: часть визуального интерфейса, часть серверной логики и клиентская часть. Все пути адресации задаются жестко на основании констант, указанных в проекте. Такой подход обусловлен наличием переадресации и ЧПУ (человекопонятный URL).

В директории assets располагаются файлы клиента: картинки, стили, файлы js.

В директории core располагается вся серверная логика. Сюда относятся подключения к БД, переадресация, формирование данных страниц, обработка ошибок и т.д.

В директории pages располагаются файлы с разметкой страниц. Здесь файлы header.php и footer.php содержат статичные части каждой страницы, кроме страницы авторизации.

Подключение файлов, ЧПУ и переадресация

Подключение файлов в проекте осуществляется с помощью использования spl_autoload_register. Для подключения классов методу автоподключения добавляются подключаемые директории, в которых осуществляется проверка наличия файлов. Важно: названия класса и файла должны совпадать, не зависимо от регистра.

Реализация ЧПУ основана на настройках файла .htaccess, который занимается перенаправлением всех запросов на файл index.php. При обращении к сайту в файле формируется новый URL, где параметром передается исходный адрес запроса.

Переадресация работает на классе Router, который обрабатывает входящие URL и получает из них параметры. Параметры в дальнейшем записываются в переменную класса или передаются в метод вызываемого класса. На основе доступных классов и методов строится URL и переадресация. Каждое подключение должно иметь уникальное распознавание строки методом dispatch или иметь обобщенный шаблон для подключения классов и вызова методов. Важно: при формировании парсера нужно учитывать, что статические пути малого объема имеют больший спектор действия по сравнению с динамическими большего объема, поэтому стоит учитывать, что первыми должны записываться пути большего объема. Например, шаблон типа '/geo\/user/' будет перекрывать шаблон типа '/geo\/user\/\d+/', что делает невозможным обращение по второму шаблону, если он будет идти после первого.

Файлы проекта

Файлы серверной логики проекта разделяются на группы: основные - файлы, обеспечивающие базовую логику работы, обработчики ошибок - файлы, реализующие формирование логов и отправку ошибок на клиент, контроллеры - файлы, обеспечивающие наполнение страниц и другие вспомогательные функции.

Файлы основной логики

База данных

Здесь располагаются основные методы взаимодействия с БД. В классе DataBase имеются методы для формирования запросов выборки и вставки. При этом для получения данных из БД можно использовать метод getOne() или getAll(). Разница методов в формировании ответа, в первом случае в ответе будет массив с полученными полями, а во втором - массив элементов, в которых будут записаны получаемые поля.

Вызывая конструктор базы данных, создается подключение, которое будет активно до прекращения использования класса. Как только с классом прекращается работа и он "уничтожается", срабатывает метод __destruct() и подключение к базе данных закрывается.

Роутер

Здесь располагается логика формирования шаблонов парсинга и переадресации на классы и методы.

Метод addRoute() добавляет шаблоны парсинга, адрес класса и метода.

Метод dispatch() вызывается для парсинга URL и перенаправления на вызываемый класс.

Метод redirect() создает экземпляр вызываемого класса и обращается к вызываемому методу класса. При этом осуществляется проверка наличия класса и метода.

Метод route() осуществляет перенаправление на класс и метод из передаваемых параметров в строке URL. Отличие от метода dispatch() этот метод обращается к классу и методу, которые указаны в адресной строке, а не в шаблоне парсера.

Метод getParamter() возвращает данные парсинга, которые были получены из URL.

Контроллер

Контроллер - это родительский класс всех контроллеров, который позволяет выполнять переадресацию, отрисовку страниц и отправку данных на клиент.

Метод render() получает путь до подключаемой страницы и данные, которые на этой страницы будут отображаться. Для формирования данных используется метод extract(), который из ассоциативного массива данных формирует переменные, используемые на странице.

Метод redirect() выполняет переадресацию с помощью header('Location: ...').

Метод json() из получаемых данных данных формирует JSON строку, которая отправляется на клиент.

Окружение

Класс Env при вызове конструктора подключает данные, необходимые для работы проекта. После создания экземпляра класса появляется возможность использовать метод putenv() для собственных настроек проекта.

Класс ошибок

Основная задача класса MyError получить данные об ошибке, записать их в лог и отправить пользователю информацию об ошибке. Для этого в случае возникновения исключения или для "выброса" в нужном месте создается экземпляр класса с передачей параметров сообщения об ошибке и её коде или данные из обработчика исключений.

Класс получает ошибку, записывает её исходное состояние в файл лога с датой и временем возникновения ошибки. Сообщение об ошибке и код ошибки записываются в неизменном виде.

После записи данных в лог формируется ответ пользователю. Для этого используется метод getCode() из класса CodeResponce, который возвращает код ответа сервера, основанного на HTML ответах.

Директория контроллеров

Здесь расположены все контроллеры, участвующие в формировании страниц. Каждый контроллер отвечает за одну конкретную страницу, кроме table.php. Класс Table используется для динамического формирования таблиц на страницах, он принимает данные, которые наполняют таблицу, поля выборки с подписями столбцов в таблице, данные о кнопках, необходимых для отображения в таблице и элементы HTML разметки.

Метод generate() класса Table генерирует таблицу с учетом повтора данных, то есть повторяющиеся данные, которые идут друг за другом будут объединены в одну ячейку. После завершения формирования таблицы, отдается HTML разметка.

Все остальные классы, расположенные в данной директории, отвечают за формирование страниц и обработку данных на странице. Методы принимают данные из POST и GET запросов вместе с данными из URL строки, если таковые имеются.

Клиентская логика

Клиентская логика разнесена на 7 файлов: auth.js, action.js, constants.js, modal.js, query.js, trash.js и map.js.

action.js

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

constants.js

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

modal.js

Здесь располагаются настройки модальных окон и их логика работы. Определение внешнего вида модального окна задаётся массивом используемых полей. Таким образом динамически создается интерфейс окна.

query.js

Здесь располагается вся основная логика взаимодействия с сервером. Все запросы POST и GET проходят через этот файл. Здесь же записываются параметры запроса, которые будут отправлены.

auth.js

Здесь располагается весь функционал по авторизации и регистрации на сайте.

trash.js

Здесь располагается инициализация вкладок страницы "Корзина".

map.js

Здесь располагается логика формирования карты и таблицы точек. На карту выводятся также пункты ОМС и ГГС, доступные базовые станции.