> For the complete documentation index, see [llms.txt](https://endpoint-docs.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://endpoint-docs.gitbook.io/docs/geo-point/sait.md).

# Сайт

## 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**

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