Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как лучше осуществить многоуровневый каталог...
 
 автор: Spyder   (31.05.2006 в 09:04)   письмо автору
 
 

Есть две 2 таблицы в первой категории, в другой продукт.
Код вывода подкатегорий и товара.

  <?php
//соединение с БД
require_once("config.php");
?>

<table align='center' border='1' cellpadding='4' cellspacing='0' bordercolordark='white' bordercolorlight='gray' width='98%' style='margin:0; padding:0;'>
  <tr>
   <th>Название</th><th>Описание</th><th>Поз.</th><th>Действия</th>
<?php
//вывод все подкатегории данной категории
$query "SELECT * FROM catalog WHERE id_parent=".$_GET['id_catalog']." ORDER BY pos";
  if(!
$result mysql_query($query)) echo "Неправильно".mysql_error();
   while(
$podcat mysql_fetch_array($result))
    {
     echo 
"<tr>
            <td bgcolor=#DDCCFF><a href=show_cat.php?id_catalog="
.$podcat['id_catalog'].">".$podcat['name']."</a></td>
            <td bgcolor=#DDCCFF>"
.$podcat['description']."</td>
            <td bgcolor=#DDCCFF>"
.$podcat['pos']."</tr>";
       
//вывод товара данной подкатегории
        
$query2 "SELECT * FROM product WHERE id_catalog=".$podcat['id_catalog']." ORDER BY pos";
         if(!
$result1 mysql_query($query2)) echo "Неправильно".mysql_error();
          while(
$prod mysql_fetch_array($result1))
           {
            echo 
"<tr>
                   <td bgcolor=#DDCCDD><a href=show_prod.php?id_catalog="
.$prod['id_catalog'].">".$prod['name']."</a></td>
                   <td bgcolor=#DDCCDD>"
.$prod['note']."</td>
                   <td bgcolor=#DDCCDD>"
.$prod['pos']."</tr>";


           }

    }

?>

если есть в подкатегории, другая подкатегория то нужно сначало нажать на ссылку и только потом выводится подкатегория 3 уровня. Только уровень вложенности может быть и больше.
Как осуществить чтоб все подкатегории и товар выводились сразу, а не по ссылки переходить?
Заранее спасибо!!!

   
 
 автор: Trianon   (31.05.2006 в 09:36)   письмо автору
 
   для: Spyder   (31.05.2006 в 09:04)
 

А какие данные подаются на вход скрипту?

   
 
 автор: spyder   (31.05.2006 в 10:45)   письмо автору
 
   для: Trianon   (31.05.2006 в 09:36)
 

show_cat.php?id_catalog=1

   
 
 автор: Trianon   (31.05.2006 в 11:02)   письмо автору
 
   для: spyder   (31.05.2006 в 10:45)
 

И Вы хотите получить все продукты в этом разделе?
И еще неплохо было бы структуру таблиц показать.

   
 
 автор: Spyder   (31.05.2006 в 11:10)   письмо автору
 
   для: Trianon   (31.05.2006 в 11:02)
 

>И Вы хотите получить все продукты в этом разделе?
продукты у меня выводятся. Вопрос в том чтоб выводить не только продукты, но и категории. Есть подкатегория и в ней может ещё находится подкатегории, мне нужно вывести все подкатегории, другой подкатегории.

Подкатегория уровень1
      Подкатегория уровень 2
         Товар 
          Товар
      Подкатегория уровень 2
      Подкатегория уровень 2  
               Подкатегория уровень 3
                   Товар 
                    Товар

Вот так мне нужно.

   
 
 автор: Trianon   (31.05.2006 в 11:23)   письмо автору
 
   для: spyder   (31.05.2006 в 10:45)
 

Глубина вложенности каталога как-нибудь ограничена?
И каков его приблизительный объем?

Исправьте свое последнее сообщение.
Эскиз вывода возьмите в теги code. А то лесенки не видно.

   
 
 автор: Spyder   (31.05.2006 в 11:31)   письмо автору
 
   для: Trianon   (31.05.2006 в 11:23)
 

>Глубина вложенности каталога как-нибудь ограничена?
нет не ограничена

>И каков его приблизительный объем?
не понял какой объем?

   
 
 автор: Trianon   (31.05.2006 в 11:36)   письмо автору
 
   для: Spyder   (31.05.2006 в 11:31)
 

Что - совершенно неограничена? Так не бывает.
Пользователь на глубину больше десятка не полезет.
Администратор не полезет глубже трех десятков.

Касательно объема - сколько примерно разделов в каталоге?
Сто?
Десять тысяч?
Миллион?

   
 
 автор: Spyder   (31.05.2006 в 11:44)   письмо автору
 
   для: Trianon   (31.05.2006 в 11:36)
 

>Что - совершенно неограничена? Так не бывает.
>Пользователь на глубину больше десятка не полезет.
>Администратор не полезет глубже трех десятков.
Вы меня не так понял, естественно что больше десятка уровней не будет. Но если даже и будет у меня вывод будет подругому.
Напр-р:

 Категор Компьютеры 
         Подкатег            Компы Compaq
                 в неё входят ещё подкатегории Сервера 
                                                                                   HP сервер
                                                                                           И сдесь товар

У меня будет две страницы одна будет отображать категории, а другая все подкатегории и товар, выбранной категории. Т.е бегать по ссылкам не надо.
>Касательно объема - сколько примерно разделов в каталоге?
Категорий около 20, потом может и больше будет.

   
 
 автор: spyder   (31.05.2006 в 14:37)   письмо автору
 
   для: Spyder   (31.05.2006 в 11:44)
 

поднимаю тему

   
 
 автор: Trianon   (31.05.2006 в 17:49)   письмо автору
 
   для: spyder   (31.05.2006 в 14:37)
 


<?
include 'config.inc.php';

function 
readalltree($tab$id$parent$filter='')
{
    
$sql "SELECT $id$parent FROM $tab $filter";
    
$res mysql_query($sql);
    if(!
$res)
    {
      echo 
"SQL error in ".nl2br($sql)." : <br>".mysql_error();
      return 
false;
    }
    
$tree = array();
    while(
$row mysql_fetch_row($res))
    {
        
$id intval($row[0]); $pid intval($row[1]);
        
$pars  = isset($tree[$pid]) ? $tree[$pid] : array();
        
$pars[] = $id;
        
$tree[$pid] = $pars;
    }
    return 
$tree;
}

function 
selectnodes(&$tree$pid$lev=0)
{
    
$s = array();
    
$s[$pid] = $lev;
    if(isset(
$tree[$pid]))
       foreach(
$tree[$pid] as $id)
          foreach(
selectnodes($tree$id$lev+1) as $k => $v)
            
$s[$k] = $v;
    return 
$s;
}

function 
printnodes(&$tree, &$catnames, &$catprods$id$lev 0)
{
    echo 
str_repeat(" . "$lev+1);
    
$nm $catnames[$id];
    echo 
"<a href=?cat=$id>[$nm]</a><br>\r\n";
    if(!empty(
$catprods[$id]))
        foreach(
$catprods[$id] as $pid => $pin)
        {
            echo 
str_repeat(" . "$lev+1);
            echo 
" : ";
            echo 
"<a href=productinfo.php?prod=$pid>$pin</a><br>\r\n";
        }
    if(!empty(
$tree[$id]))
        foreach(
$tree[$id] as $nid)
            
printnodes($tree$catnames$catprods$nid$lev+1);
}



    
$tree readalltree('catalog''id_catalog''id_parent');
    
$cat intval($_REQUEST['cat']);
    
$lev =  selectnodes($tree$cat);
    
$list implode(',',array_keys($lev));

    
$sql "SELECT id_catalog, name FROM catalog WHERE id_catalog IN($list)";
    if(!(
$res mysql_query($sql)))
         echo 
"SQL error in ".nl2br($sql)." : <br>".mysql_error();
    
$catnames = array();
    
$catprods = array();
    while(
$row mysql_fetch_row($res))
    {
       
$catnames[$row[0]] = $row[1];
       
$catprods[$row[0]] = array();
    }
    
$sql "SELECT id_product, id_catalog, name FROM product WHERE id_catalog IN($list)";
    if(!(
$res mysql_query($sql)))
         echo 
"SQL error in ".nl2br($sql)." : <br>".mysql_error();
    while(
$row mysql_fetch_row($res))
        
$catprods[$row[1]][$row[0]] = $row[2];

    
printnodes($tree$catnames$catprods$cat);


?>


Эх... была идея сделать без лишних массивов, с последовательным выводом из базы.
Но Вы же так торопитесь. ...
Впрочем базовый инструментарий здесь есть, так что дальше можно развить.
Более того можно сделать даже для таких баз, содержимое которых не ограничивается памятью php.

   
 
 автор: Spyder   (01.06.2006 в 12:06)   письмо автору
 
   для: Trianon   (31.05.2006 в 17:49)
 

вау клево. Спасибо большое то что надо.
Не могли бы подсказать как осуществляют такую фичу.
У меня иногда бывает что товар может находится в разных категориях(подкатегориях).
Как можно сделать чтобы при добавлении товара можно было отмечать в каких категория будет видно этот товар. Можно ли вообще как нибудь осуществить?
Подскажите пожалуйста!!!

   
 
 автор: Trianon   (01.06.2006 в 13:10)   письмо автору
 
   для: Spyder   (01.06.2006 в 12:06)
 

Для этого в Вашей структуре вроде даже поле есть.
hide ENUM('show','hide') NOT NULL DEFAULT 'show',
в таблице product

   
 
 автор: Spyder   (01.06.2006 в 13:42)   письмо автору
 
   для: Trianon   (01.06.2006 в 13:10)
 

не этот столбец отвечает показать или непоказывать товар вообще. А мне нужно чтоб можно было отметить в каких подкатегориях показывать. Сейчас у меня получается что к товару прикрепляется id опрделенного подкаталога, а я хочу чтоб можно было выбрать несколько подкатегорий к которой товар относился.
Может кто сталкевался с такой задачей.
Надеюсь понятно объяснил.

   
 
 автор: Trianon   (01.06.2006 в 14:01)   письмо автору
 
   для: Spyder   (01.06.2006 в 13:42)
 

Построить отношение "многие ко многим". Оно разбивается на два отношения "Многие к одному" и "один ко многим" .
создаем таблицу loc_prod_cat "место товара в каталоге" с полями (id_loc, id_product, id_cataog) и набиваем её записями о размещении товаров по разделам каталога.
После этого поле id_catalog из таблицы товаров удаляем.

   
 
 автор: Spyder   (01.06.2006 в 14:16)   письмо автору
 
   для: Trianon   (01.06.2006 в 14:01)
 

Спасибо за таблицу.
Мне не очень понятно каким образом будет определятся(выбиратся) к каким категориям отнести товар.

   
 
 автор: Trianon   (01.06.2006 в 14:23)   письмо автору
 
   для: Spyder   (01.06.2006 в 14:16)
 

а каким образом это делается сейчас?

   
 
 автор: Spyder   (01.06.2006 в 14:26)   письмо автору
 
   для: Trianon   (01.06.2006 в 14:23)
 

>а каким образом это делается сейчас?
Сейчас ни как.

   
 
 автор: Trianon   (01.06.2006 в 14:29)   письмо автору
 
   для: Spyder   (01.06.2006 в 14:26)
 

Перефразирую.
Покажите фрагмент кода, который не работает.

   
 
 автор: Spyder   (01.06.2006 в 14:34)   письмо автору
 
   для: Trianon   (01.06.2006 в 14:29)
 

Я пока код не писал. Потому что я не пойму каким образом делают отмемтку отношения товара к разным категория.

   
 
 автор: Trianon   (01.06.2006 в 14:50)   письмо автору
 
   для: Spyder   (01.06.2006 в 14:34)
 

Для каждого товара добавляют в таблицу размещения столько строк, в скольких разделах он должен отображаться.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования