Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вложенность категорий

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
RedEclipse
Отправлено: 08 Апреля, 2019 - 12:16:19
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2019  


Помог: 0 раз(а)




Всем привет! Недавно создал свой первый микро MVC для изучения PHP. Хотелось бы, по возможности, мне объяснить как дописать код. В общем, есть у меня категории блога. БД с структурой: id, title, slug, sub_category_id некоторые категории имеют вложенность в sub_category_id, по дефолту стоит 0. На данный момент код выглядит как

PHP:
скопировать код в буфер обмена
  1.     public static function getCategoryList()
  2.     {
  3.  
  4.         $db = Db::getConnection();
  5.  
  6.         $lang = self::Language();
  7.  
  8.         $categoryList = [];
  9.  
  10.         $result = $db->query("SELECT id, title$lang,slug$lang, sub_category_id FROM blog_category WHERE status='1' ORDER BY sort_order ASC");
  11.  
  12.         foreach($result as $row){
  13.             $categoryList[] = [
  14.                 'id' => $row[0],
  15.                 'title' => $row[1],
  16.                 'slug' => $row[2]
  17.             ];
  18.         }
  19.         return $categoryList;
  20.  
  21.  
  22.     }


В HTML:

CODE (html):
скопировать код в буфер обмена
  1.  
  2.    <h2>Categoies</h2>
  3.     <?php foreach ($category as $categoryItem): ?>
  4.         <h4><a href="/blog/<?php echo $categoryItem['slug']; ?>"><?php echo $categoryItem['title']; ?></a></h4>
  5.         <p><?php echo $categoryItem['id']; ?></p>
  6.     <?php endforeach; ?>


На данный момент код просто выводит список категорий. Не подскажите, как реализовать вывод полного пути, в зависимости от глубины подкатегорий? К примеру /blog/category1/category2/catego ry/article
 
 Top
RedEclipse
Отправлено: 08 Апреля, 2019 - 15:22:23
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2019  


Помог: 0 раз(а)




Не уверен, насколько решение корректно, но пока сделал так:

PHP:
скопировать код в буфер обмена
  1. $result = $db->query("SELECT content.id, content.title$lang,content.slug$lang, content.sub_category_id, category.slug$lang FROM blog_category AS content LEFT JOIN portal_blog AS category ON content.sub_category_id = category.id WHERE content.status='1' ORDER BY content.sort_order ASC");


А в самом шаблоне прописал

PHP:
скопировать код в буфер обмена
  1. <a href="/blog/<?PHP if ($categoryItem['sub_category']) echo $categoryItem['sub_category'] . '/'; ?><?PHP echo $categoryItem['slug']; ?>"><?PHP echo $categoryItem['title']; ?></a>

(Отредактировано автором: 08 Апреля, 2019 - 15:22:41)

 
 Top
LIME
Отправлено: 10 Апреля, 2019 - 17:48:32
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




RedEclipse в целях обучения гугли matherialized path
есть и другие способы хранения иерархических структур в реляционной бд
nested sets например
 
 Top
RedEclipse
Отправлено: 16 Мая, 2019 - 15:56:19
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2019  


Помог: 0 раз(а)




LIME спасибо, обязательно посмотрю.

Пока получилось у меня сделать полную иерархию так:

PHP:
скопировать код в буфер обмена
  1. public static function getTree($output=null, $parent=0, $indent=null)
  2.     {
  3.  
  4.         $db = Db::getConnection();
  5.  
  6.         $lang = self::Language();
  7.  
  8.         $query = $db->prepare("SELECT id, title$lang, slug$lang FROM portal_category WHERE parent_category_id = :parent_category_id ORDER BY sort_order ASC");
  9.         $query->bindParam(':parent_category_id', $parent, PDO::PARAM_INT);
  10.         $query->execute();
  11.  
  12.  
  13.             while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
  14.                 $row['slug'] = $row["slug".$lang];
  15.  
  16.                 $output .= $indent . $row['slug'];
  17.  
  18.                 //print_r($output);
  19.  
  20.                 if ($row['id'] != $parent) {
  21.                     self::GetTree($output, $row['id'],  "/");
  22.                 }
  23.  
  24.             }
  25.             return $output;
  26.     }

Но это меня не совсем устраивает, данные все получается в строке и как нормально вывести полный путь каждой категории не понял, чтобы потом уже в шаблоне все вывести в виде foreach.

PHP:
скопировать код в буфер обмена
  1. public static function getBreadcrumb($categoryId) {
  2.  
  3.         $categories = self::getCategories();
  4.  
  5.  
  6.         if (!isset($categories[$categoryId])) return array();
  7.  
  8.         $thisCat = $categories[$categoryId];
  9.  
  10.         if ($thisCat['par_category_id'] != 0)
  11.         {
  12.             return array_merge(self::getBreadcrumb($thisCat['par_category_id']), array($thisCat['slug']));
  13.         }
  14.         else
  15.         {
  16.             return array($thisCat['slug']);
  17.         }
  18.     }
  19.  
  20.  
  21.     public static function getCategories()
  22.     {
  23.  
  24.         $db = Db::getConnection();
  25.  
  26.         $lang = self::Language();
  27.  
  28.         $query = $db->query("SELECT id, title$lang, slug$lang, parent_category_id FROM portal_category ORDER BY sort_order ASC");
  29.  
  30.  
  31.  
  32.         while ($row = $query->fetch(PDO::FETCH_NUM)) {
  33.                 $categories[] = [
  34.                     'id' => $row[0],
  35.                     'title' => $row[1],
  36.                     'slug' => $row[2],
  37.                     'sub_category' => $row[3],
  38.                     'breadcrumb' => self::getBreadcrumb($row[3])
  39.                 ];
  40.  
  41.     }
  42.     print_r($categories);
  43.  
  44.  
  45.         return $categories;
  46.     }

Решил попробовать сделать с помощью вывода в массиве, но проблема, при вызове функции " 'breadcrumb' => self::getBreadcrumb($row[3])" я получаю ошибку Too many connections. Можете подсказать, в чем проблема?

(Отредактировано автором: 16 Мая, 2019 - 15:59:32)

 
 Top
LIME
Отправлено: 16 Мая, 2019 - 16:15:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




RedEclipse пишет:
и как нормально вывести полный путь каждой категории
чтобы без цикла запросов это matherialized path или nested sets как писал выше
у тебя простейший способ - списки смежных вершин
RedEclipse пишет:
Too many connections. Можете подсказать, в чем проблема?
не надо на каждый запрос создавать соединение
$db = Db::getConnection(); пусть хотя бы сохраняет соединение в приватное свойство и если оно уже установлено возвращает его вместо создания нового
 
 Top
RedEclipse
Отправлено: 22 Мая, 2019 - 15:06:10
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Апр. 2019  


Помог: 0 раз(а)




Я попытался сделать как ты сказал, модифицировал класс Db
PHP:
скопировать код в буфер обмена
  1. class Db
  2. {
  3.    
  4.     private static $connect;
  5.    
  6.     private function __construct(){}
  7.    
  8.     public static function getConnection(){
  9.        
  10.         if(!empty(self::$connect)){
  11.             return self::$connect;
  12.         }
  13.  
  14.         try {
  15.             $paramsPath = ROOT . '/configuration/config.php';
  16.  
  17.             $params = include ($paramsPath);
  18.  
  19.             $dsn = "mysql:host={$params['database']['host']};dbname={$params['database']['dbname']}; charset={$params['database']['charset']}";
  20.             $db = new PDO($dsn, $params['database']['user'], $params['database']['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
  21.            
  22.             self::$connect = $db;
  23.            
  24.             return $db;
  25.  
  26.         } catch (PDOException $error) {
  27.             print "Error: " . $error->getMessage();
  28.             die();
  29.         }
  30.  
  31.     }
  32.  
  33. }


Но теперь сервер при попытке выдать древо пишет
"Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16384 bytes)". Нужно ли увеличить память у сервера или я опять сделал что-то не так?
 
 Top
LIME
Отправлено: 22 Мая, 2019 - 15:19:14
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




http://jbzoo[dot]ru/docs/fatal-error[dot][dot][dot]owed-memory-size
getBreadcrumb() и getCategories() у тебя зациклены друг на друга
вообще полная каша ежели по чесноку
$categories[$categoryId] у тебя быть не может
тогда уж
PHP:
скопировать код в буфер обмена
  1. $categories[$row[0]] = [
  2.                     'id' => $row[0],
  3.                     'title' => $row[1],
  4.                     'slug' => $row[2],
  5.                     'sub_category' => $row[3],
  6.                     'breadcrumb' => self::getBreadcrumb($row[3])
  7.                 ];

'breadcrumb' => self::getBreadcrumb($row[3]) убери из категорий

(Отредактировано автором: 22 Мая, 2019 - 15:19:39)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB