Вывод каталогов деревом

Вывод каталогов деревом
для работы надо переопределить метод елемента
  1. $config = array(
  2.     'host' => 'localhost',
  3.     'name' => 'test',
  4.     'user' => 'root',
  5.     'pass' => '',
  6. );
  7.  
  8. $pdo = new \PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['name'], $config['user'], $config['pass'],
  9.     [
  10.         \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
  11.         \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
  12.         \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
  13.         \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,
  14.     ]
  15. );
  1. $res = $pdo->query('select * from `products` order by `parent_id` asc');
  2.  
  3. $cats = [];
  4. $structure = [];
  5.  
  6. while ($row = $res->fetch()) {
  7.     $cats[$row['id']] = $row;
  8.     $structure[$row['parent_id']][] = $row['id'];
  9. }
  10.  
  11. echo(new Printer($cats, $structure));
  1. class Printer
  2. {
  3.     private $cats = [];
  4.     private $structure = [];
  5.  
  6.     public function __construct(array $cats, array $structure)
  7.     {
  8.         $this->setCats($cats);
  9.         $this->setStructure($structure);
  10.     }
  11.  
  12.     private function setCats(array $cats): void
  13.     {
  14.         $this->cats = $cats;
  15.     }
  16.  
  17.     private function setStructure(array $structure): void
  18.     {
  19.         $this->structure = $structure;
  20.     }
  21.  
  22.     protected function element(int $element): string
  23.     {
  24.         return '<a href="' . $this->cats[$element]['id'] . '">' . $this->cats[$element]['name'] . '</a>';
  25.     }
  26.  
  27.     private function printElement(int $element, int $dept): string
  28.     {
  29.         $str = $this->element($element) . PHP_EOL;
  30.         if (is_array($this->structure[$element]) && count($this->structure[$element]) > 0) {
  31.             foreach ($this->structure[$element] as $id) {
  32.                 $str .= $this->print($id, $dept + 1);
  33.             }
  34.         }
  35.  
  36.         return $str;
  37.     }
  38.  
  39.     private function print(int $element, int $dept = 1): string
  40.     {
  41.         return '<ul><li>' . $this->printElement($element, $dept) . '</li></ul>' . PHP_EOL;
  42.     }
  43.  
  44.     private function run(): string
  45.     {
  46.         return $this->print(current(current($this->structure)));
  47.     }
  48.  
  49.     public function __toString(): string
  50.     {
  51.         return $this->run();
  52.     }
  53. }
  1. -- phpMyAdmin SQL Dump
  2. -- version 4.8.3
  3. -- https://www.phpmyadmin.net/
  4. --
  5. -- Хост: 127.0.0.1:3306
  6. -- Время создания: Фев 16 2019 г., 11:41
  7. -- Версия сервера: 8.0.12
  8. -- Версия PHP: 7.2.10
  9.  
  10. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  11. SET AUTOCOMMIT = 0;
  12. START TRANSACTION;
  13. SET time_zone = "+00:00";
  14.  
  15.  
  16. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  17. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  18. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  19. /*!40101 SET NAMES utf8mb4 */;
  20.  
  21. --
  22. -- База данных: `test`
  23. --
  24.  
  25. -- --------------------------------------------------------
  26.  
  27. --
  28. -- Структура таблицы `products`
  29. --
  30.  
  31. CREATE TABLE `products` (
  32.   `id` INT(11) NOT NULL,
  33.   `name` VARCHAR(255) COLLATE utf8mb4_general_ci NOT NULL,
  34.   `parent_id` INT(11) NOT NULL
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  36.  
  37. --
  38. -- Дамп данных таблицы `products`
  39. --
  40.  
  41. INSERT INTO `products` (`id`, `name`, `parent_id`) VALUES
  42. (1, 'Рыбалка', 0),
  43. (2, 'Удилища', 1),
  44. (4, 'Спининговые', 2),
  45. (5, 'Морские', 2),
  46. (6, 'Катушки', 1);
  47.  
  48. --
  49. -- Индексы сохранённых таблиц
  50. --
  51.  
  52. --
  53. -- Индексы таблицы `products`
  54. --
  55. ALTER TABLE `products`
  56.   ADD PRIMARY KEY (`id`);
  57.  
  58. --
  59. -- AUTO_INCREMENT для сохранённых таблиц
  60. --
  61.  
  62. --
  63. -- AUTO_INCREMENT для таблицы `products`
  64. --
  65. ALTER TABLE `products`
  66.   MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
  67. COMMIT;
  68.  
  69. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  70. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  71. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Реклама

Мы в соцсетях

tw tg yt gt