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
Форумы портала PHP.SU :: Версия для печати :: Вложенность категорий
Форумы портала PHP.SU » » Вопросы новичков » Вложенность категорий

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

1. RedEclipse - 08 Апреля, 2019 - 12:16:19 - перейти к сообщению
Всем привет! Недавно создал свой первый микро 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
2. RedEclipse - 08 Апреля, 2019 - 15:22:23 - перейти к сообщению
Не уверен, насколько решение корректно, но пока сделал так:

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>
3. LIME - 10 Апреля, 2019 - 17:48:32 - перейти к сообщению
RedEclipse в целях обучения гугли matherialized path
есть и другие способы хранения иерархических структур в реляционной бд
nested sets например
4. RedEclipse - 16 Мая, 2019 - 15:56:19 - перейти к сообщению
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. Можете подсказать, в чем проблема?
5. LIME - 16 Мая, 2019 - 16:15:33 - перейти к сообщению
RedEclipse пишет:
и как нормально вывести полный путь каждой категории
чтобы без цикла запросов это matherialized path или nested sets как писал выше
у тебя простейший способ - списки смежных вершин
RedEclipse пишет:
Too many connections. Можете подсказать, в чем проблема?
не надо на каждый запрос создавать соединение
$db = Db::getConnection(); пусть хотя бы сохраняет соединение в приватное свойство и если оно уже установлено возвращает его вместо создания нового
6. RedEclipse - 22 Мая, 2019 - 15:06:10 - перейти к сообщению
Я попытался сделать как ты сказал, модифицировал класс 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)". Нужно ли увеличить память у сервера или я опять сделал что-то не так?
7. LIME - 22 Мая, 2019 - 15:19:14 - перейти к сообщению
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]) убери из категорий

 

Powered by ExBB FM 1.0 RC1