diff --git a/1.php/index.php b/1.php/index.php index 85b57b2..69c16b4 100644 --- a/1.php/index.php +++ b/1.php/index.php @@ -1,20 +1,7 @@ getModelElement(); - $outputList = array(); - - foreach ($modelElements as $item) { - $outputList[] = $item['id'] . ' ' . $item['data']; - } - - return implode("\n", $outputList); -} - -die(output()); +die(output($_GET['root'])); ?> \ No newline at end of file diff --git a/1.php/logic/model.php b/1.php/logic/model.php index 2ca87ac..f0ab362 100644 --- a/1.php/logic/model.php +++ b/1.php/logic/model.php @@ -6,7 +6,7 @@ class Model { $this->realization = $realization; } - public function getModelElement ($root = null, $stringData = true, $reversiveModelId="") { + public function getModelElement ($root = null, $stringData = false, $reversiveModelId="") { $returnValues = array(); $this->realization->ready(); $items = $this->realization->getElement($root); @@ -16,22 +16,26 @@ class Model { $rootId = $reversiveModelId == "" ? (string)$logicItemId : $reversiveModelId . "." . $logicItemId; if ($item['isElement'] == false) { if ($stringData) $returnValues[] = array ( - "id" => $rootId, - "data" => $item['stringData'] + "id" => $rootId, + "data" => $item['stringData'], + "root_id" => $item['id'] ); else $returnValues[] = array ( - "id" => $rootId, - "data" => $item['data'] + "id" => $rootId, + "data" => $item['data'], + "root_id" => $item['id'] ); } else { if ($stringData) $returnValues[] = array ( - "id" => $rootId, - "data" => $item['stringData'] + "id" => $rootId, + "data" => $item['stringData'], + "root_id" => $item['id'] ); else $returnValues[] = array ( - "id" => $rootId, - "data" => $item['data'] + "id" => $rootId, + "data" => $item['data'], + "root_id" => $item['id'] ); $childElements = $this->getModelElement( @@ -41,8 +45,9 @@ class Model { ); foreach ($childElements as $childElement) { $returnValues[] = array ( - "id" => $childElement['id'], - "data" => $childElement['data'] + "id" => $childElement['id'], + "data" => $childElement['data'], + "root_id" => $item['id'] ); } } diff --git a/1.php/method.php b/1.php/method.php new file mode 100644 index 0000000..815b0ec --- /dev/null +++ b/1.php/method.php @@ -0,0 +1,34 @@ +getModelElement(null, true); + foreach ($modelElementsForSearch as $i) { + if ($i['id'] == $root) { + $itemIerarchyId = $i['id']; + $root = $i['root_id']; + break; + } + } + } + + $modelElements = $model->getModelElement($root, true, $itemIerarchyId); + $outputList = array(); + + foreach ($modelElements as $item) { + $outputList[] = $item['id'] . ' ' . $item['data']; + } + + return implode("\n", $outputList); +} +?> \ No newline at end of file diff --git a/1.php/readme.md b/1.php/readme.md index 559a2e5..cd5067a 100644 --- a/1.php/readme.md +++ b/1.php/readme.md @@ -20,6 +20,7 @@ # Постановка задачи Необходимо написать страницу на php, которая будет выводить информацию из модели о его родителях и наследниках. При этом, дополнительно предусмотреть возможность вывода наследников отдельного родителя, введённого в параметрах *(это условие не обязательно)* # Реализация + ## Разработка модели Поскольку вывод информации происходит из абстрактной модели, нам необходимо сделать собственную реализацию модели. Далее, обеспечить модульность, чтобы можно было менять практическую реализацию модели *(например, заменить запросы к БД на запросы к файловой системе и т.д.)*. При разработки модели было принято решение реализовать класс для модели и для её реализации: @@ -103,7 +104,7 @@ class Model { $this->realization = $realization; } - public function getModelElement ($root = null, $stringData = true, $reversiveModelId="") { + public function getModelElement ($root = null, $stringData = false, $reversiveModelId="") { $returnValues = array(); $this->realization->ready(); $items = $this->realization->getElement($root); @@ -113,22 +114,26 @@ class Model { $rootId = $reversiveModelId == "" ? (string)$logicItemId : $reversiveModelId . "." . $logicItemId; if ($item['isElement'] == false) { if ($stringData) $returnValues[] = array ( - "id" => $rootId, - "data" => $item['stringData'] + "id" => $rootId, + "data" => $item['stringData'], + "root_id" => $item['id'] ); else $returnValues[] = array ( - "id" => $rootId, - "data" => $item['data'] + "id" => $rootId, + "data" => $item['data'], + "root_id" => $item['id'] ); } else { if ($stringData) $returnValues[] = array ( - "id" => $rootId, - "data" => $item['stringData'] + "id" => $rootId, + "data" => $item['stringData'], + "root_id" => $item['id'] ); else $returnValues[] = array ( - "id" => $rootId, - "data" => $item['data'] + "id" => $rootId, + "data" => $item['data'], + "root_id" => $item['id'] ); $childElements = $this->getModelElement( @@ -138,8 +143,9 @@ class Model { ); foreach ($childElements as $childElement) { $returnValues[] = array ( - "id" => $childElement['id'], - "data" => $childElement['data'] + "id" => $childElement['id'], + "data" => $childElement['data'], + "root_id" => $item['id'] ); } } @@ -300,4 +306,53 @@ class RealizationMySQL extends Realization { // Создал класс, нас $this->isReady = false; } } -``` \ No newline at end of file +``` +## Разработка основной страницы +Далее, вся реализация была помещена в папку logic и разбита на два файла: model.php *(Базовый класс интерфейса модели и абстрактный реализации)* и mysql-realization.php *(Класс реализации MySQL)*. +Далее можно приступить к непосредственной реализации программы: в корне мы создадим два файла: method.php и index.php. + +В method.php будет расположена функция, принимающая в себя параметр рассматриваемого элемента (либо принимающий факт его отсутствия (null)) и возвращающая ответ. Отдельно созданный файл нужен, чтобы в случае надобности применения данных из данной программы с заданными параметрами мы могли их импортировать как модуль программы, а не делать отдельно HTTP-запрос к странице. +```php +include "./logic/mysql-realization.php"; + +function output ($root = "") { + $itemIerarchyId = ""; // Без этого параметра у нас будет выводиться с единицы, а не с номера элемента в общей иерархии + + $model = new Model( + new RealizationMySQL("127.0.0.1", "root", "root", "realizations-db") + ); + + if ($root == "" || $root == null) { + $root = null; + } + else { + $modelElementsForSearch = $model->getModelElement(null, true); + foreach ($modelElementsForSearch as $i) { + if ($i['id'] == $root) { + $itemIerarchyId = $i['id']; + $root = $i['root_id']; + break; + } + } + } + + $modelElements = $model->getModelElement($root, true, $itemIerarchyId); + $outputList = array(); + + foreach ($modelElements as $item) { + $outputList[] = $item['id'] . ' ' . $item['data']; + } + + return implode("\n", $outputList); +} +``` + +Далее, мы вызываем данную функцию из index.php: +```php +/* Отключим WARNING */ +error_reporting(E_ERROR | E_PARSE); +include "method.php"; + +die(output($_GET['root'])); +``` +Проект завершён. \ No newline at end of file diff --git a/1.php/sql/sql-with-create-schema.sql b/1.php/sql/sql-with-create-schema.sql new file mode 100644 index 0000000..c4bd2f6 --- /dev/null +++ b/1.php/sql/sql-with-create-schema.sql @@ -0,0 +1,55 @@ +CREATE DATABASE IF NOT EXISTS `realizations-db` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; +USE `realizations-db`; +-- MySQL dump 10.13 Distrib 8.0.30, for Win64 (x86_64) +-- +-- Host: localhost Database: realizations-db +-- ------------------------------------------------------ +-- Server version 8.0.30 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `model-table` +-- + +DROP TABLE IF EXISTS `model-table`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model-table` ( + `id` int NOT NULL AUTO_INCREMENT, + `legatee` int DEFAULT NULL, + `data` varchar(64) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `id_UNIQUE` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `model-table` +-- + +LOCK TABLES `model-table` WRITE; +/*!40000 ALTER TABLE `model-table` DISABLE KEYS */; +INSERT INTO `model-table` VALUES (1,NULL,'RRT'),(2,1,'RRTm'),(3,1,'qwe'),(4,3,'qwe1'),(5,3,'qwe2'),(6,NULL,'ert'); +/*!40000 ALTER TABLE `model-table` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2023-03-12 1:16:25 diff --git a/1.php/sql/sql-without-create-schema.sql b/1.php/sql/sql-without-create-schema.sql new file mode 100644 index 0000000..71cdcf5 --- /dev/null +++ b/1.php/sql/sql-without-create-schema.sql @@ -0,0 +1,53 @@ +-- MySQL dump 10.13 Distrib 8.0.30, for Win64 (x86_64) +-- +-- Host: localhost Database: realizations-db +-- ------------------------------------------------------ +-- Server version 8.0.30 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `model-table` +-- + +DROP TABLE IF EXISTS `model-table`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model-table` ( + `id` int NOT NULL AUTO_INCREMENT, + `legatee` int DEFAULT NULL, + `data` varchar(64) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `id_UNIQUE` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `model-table` +-- + +LOCK TABLES `model-table` WRITE; +/*!40000 ALTER TABLE `model-table` DISABLE KEYS */; +INSERT INTO `model-table` VALUES (1,NULL,'RRT'),(2,1,'RRTm'),(3,1,'qwe'),(4,3,'qwe1'),(5,3,'qwe2'),(6,NULL,'ert'); +/*!40000 ALTER TABLE `model-table` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2023-03-12 1:17:10