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]   

> Без описания
Andrey
Отправлено: 11 Июля, 2007 - 11:56:27
Post Id


Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Май 2007  


Помог: -1 раз(а)




Подскажите каким образом реализовать каталог товара как на http://www.3-porosenka.ru/?
Я так, понимаю, что все серии и подсерии можно разместить в одной таблице, но не совсем понятны запросы.
 
 Top
evgenijj
Отправлено: 11 Июля, 2007 - 12:12:55
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


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




Итак, каталог продукции некоторой фирмы. Для хранения информации о товарах и категориях используем две таблицы: CATEGORIES и PRODUCTS. Категория может содержать вложенные категории и/или товары. Проводя аналогию с файловой системой, директория может содержать вложенные директории и/или файлы. Каждый элемент таблиц CATEGORIES и PRODUCTS содержит ссылку на родительский элемент - id_parent.

Таблица CATEGORIES:
id_ctg - уникальный идентификатор категории
id_parent - ссылка на родительский элемент
title - название категории
sortorder - порядок сортировки
Таблица PRODUCTS:
id_prd - уникальный идентификатор товарной позиции
id_ctg - ссылка на родительский элемент
title - наименование товарной позиции
description - описание товара
sortorder - порядок сортировки

PHP:
скопировать код в буфер обмена
  1.  
  2.  Таблица CATEGORIES:
  3.  
  4.  1;0;Извещатели охранные;1
  5.  2;0;Извещатели пожарные;2
  6.  3;0;Приборы приемно-контрольные;3
  7.  6;1;Извещатели охранные магнитоконтактные;1
  8.  7;1;Извещатели охранные электроконтактные;2
  9.  8;1;Извещатели охранные ударноконтактные;3
  10.  9;2;Извещатели пожарные тепловые;1
  11.  10;2;Извещатели пожарные дымовые;2
  12.  11;2;Извещатели пожарные комбинированные;3
  13.  17;3;Приборы приемно-контрольные охранные;1
  14.  18;3;Приборы приемно-контрольные пожарные;2
  15.  19;3;Приборы приемно-контрольные охранно-пожарные;3
  16.  
  17.  Таблица PRODUCTS:
  18.  
  19.  1;6;Извещатель охранный магнитоконтактный ИО 102-2;Технические характеристики ИО 102-2;1
  20.  2;6;Извещатель охранный магнитоконтактный ИО 102-4;Технические характеристики ИО 102-4;2
  21.  3;6;Извещатель охранный магнитоконтактный ИО 102-14;Технические характеристики ИО 102-14;3
  22.  4;7;Извещатель охранный электроконтактный ИО 201-1;Технические характеристики ИО 201-1;1
  23.  5;7;Извещатель охранный электроконтактный ВПК 2112;Технические характеристики ВПК 2112;2
  24.  6;8;Извещатель охранный ударноконтактный "Окно-4";Технические характеристики "Окно-4";1
  25.  7;8;Извещатель охранный ударноконтактный "Окно-5";Технические характеристики "Окно-5";2
  26.  8;8;Извещатель охранный ударноконтактный "Окно-6";Технические характеристики "Окно-6";3
  27.  9;9;Извещатель пожарный тепловой ИП 114-01;Технические характеристики ИП 114-01;1
  28.  10;9;Извещатель пожарный тепловой ИП 101-1A;Технические характеристики ИП 101-1A;2
  29.  11;9;Извещатель пожарный тепловой ИП 101-30;Технические характеристики ИП 101-30;3
  30.  12;10;Извещатель пожарный дымовой ИП 212-3СМ;Технические характеристики ИП 212-3СМ;1
  31.  13;10;Извещатель пожарный дымовой ИП 212-18СИ;Технические характеристики ИП 212-18СИ;2
  32.  14;11;Извещатель пожарный комбинированный ИП 212/101-78-А1;Технические характеристики ИП 212/101-78-А1;1
  33.  15;11;Извещатель пожарный комбинированный ИП 212/101-18 А3R1;Технические характеристики ИП 212/101-18 А3R1;2
  34.  и т.д.
  35.  
  36.  Запрос на выборку корневых категорий:
  37.  SELECT id_ctg, title FROM categories WHERE id_parent=0 ORDER BY sortorder;
  38.  Получим записи  
  39.  id_ctg=1 title="Извещатели охранные"
  40.  id_ctg=2 title="Извещатели пожарные"
  41.  id_ctg=3 title="Приборы приемно-контрольные"
  42.  
  43.  Запрос на выборку подкатегорий категории id_ctg=1 title="Извещатели охранные":
  44.  SELECT id_ctg, title FROM categories WHERE id_parent=1 ORDER BY sortorder;
  45.  Получим записи  
  46.  id_ctg=6 title="Извещатели охранные магнитоконтактные"
  47.  id_ctg=7 title="Извещатели охранные электроконтактные"
  48.  id_ctg=8 title="Извещатели охранные ударноконтактные"
  49.  
  50.  Запрос на выборку товарных позиций категории id_ctg=6 title="Извещатели охранные магнитоконтактные":
  51.  SELECT id_prd, title FROM products WHERE id_ctg=6 ORDER BY sortorder;
  52.  Получим записи
  53.  id_prd=1 title="Извещатель охранный магнитоконтактный ИО 102-2"
  54.  id_prd=2 title="Извещатель охранный магнитоконтактный ИО 102-4"
  55.  id_prd=3 title="Извещатель охранный магнитоконтактный ИО 102-14"
  56.  
 
 Top
Andrey
Отправлено: 11 Июля, 2007 - 22:28:43
Post Id


Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Май 2007  


Помог: -1 раз(а)




Нет, это всё понятно. Непонятно вот что:
Допустим, из твоего примера каталог товара сначала выглядит так:

Извещатели охранные
Извещатели пожарные
Приборы приемно-контрольные

Каким образом сделать, чтобы при нажатии на "Извещатели охранные"
каталог выглядел так:

Извещатели охранные
--- Извещатели охранные магнитоконтактные
--- Извещатели охранные электроконтактные
--- Извещатели охранные ударноконтактные
Извещатели пожарные
Приборы приемно-контрольные

То есть как я понимаю,

class.eshop.php

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class EshopDB {
  4.         private $conn;
  5.                      
  6.    function __construct() {
  7.         include('config.inc.php');     
  8.      $this->conn=new mysqli($DB_HOST,$DB_LOGIN, $DB_PASSW, $DB_DATABASE);
  9.      $this->conn->query ("set character_set_client='cp1251'");
  10.      $this->conn->query ("set character_set_results='cp1251'");
  11.      $this->conn->query ("set collation_connection='cp1251_general_ci'");
  12.                     }
  13.                                                                  
  14.     function get_categories() {
  15.  
  16.     $sql="SELECT id_ctg, title FROM categories WHERE id_parent=0 ORDER BY sortorder";
  17.     $res=$this->conn->query($sql);
  18.     if (!$res)
  19.        return false;
  20.        $num_cats=$res->num_rows;
  21.        if ($num_cats==0)
  22.        return false;
  23.        $res=$this->db_result_to_array($res);
  24.        return $res;
  25.         }
  26.                                
  27.      function db_result_to_array($res) {
  28.                
  29.       $res_array=array();
  30.       for ($count=0; $row= $res->fetch_assoc(); $count++)
  31.       $res_array[$count] = $row;
  32.        return $res_array;
  33.         }
  34.  
  35.       function do_html_URL($url, $name){
  36.    ?>
  37.   <a href="<?PHP echo $url; ?>"><?PHP echo $name; ?></a><?PHP
  38. }
  39.        
  40.       function display_categories($cat_array) {        
  41.                
  42.        if(!is_array($cat_array)) {
  43.          echo 'В настоящий момент нет доступных категорий<br>';
  44.        return;}
  45.        foreach ($cat_array as $row)
  46.                 {
  47.      $url='show_cat.php?id_ctg='.($row['id_ctg']);
  48.      $title=$row['title'];
  49.      $this->do_html_URL($url, $title);
  50.                         }
  51.                 }
  52.  


show_cat.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. include('class.eshop.php');
  4. $eshop=new EshopDB();
  5.  $cat_array=$eshop->get_categories();
  6.  $eshop->display_categories($cat_array);
  7. ?>
  8.  


выдаст:

Извещатели охранные
Извещатели пожарные
Приборы приемно-контрольные




 
 Top
valenok Модератор
Отправлено: 11 Июля, 2007 - 22:42:10
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




В общих словах так:

PHP:
скопировать код в буфер обмена
  1.  <?
  2.  function get_categories($category) {
  3.      $sql="SELECT id_ctg, title FROM categories WHERE id_parent=".$category." ORDER BY sortorder";
  4.      $res=$this->conn->query($sql);
  5.      if (!$res)
  6.         return false;
  7.         $num_cats=$res->num_rows;
  8.         if ($num_cats==0)
  9.         return false;
  10.         $res=$this->db_result_to_array($res);
  11.         return $res;
  12.         }
  13.  


PHP:
скопировать код в буфер обмена
  1.  
  2.  <?PHP
  3.  include('class.eshop.php');
  4.  $eshop=new EshopDB();  
  5.   $cat_array=$eshop->get_categories('0');
  6.   $eshop->display_categories($cat_array);
  7.   if(isset($_GET['id_ctg'])) {  
  8.      $cat_array=$eshop->get_categories($_GET['id_ctg']);
  9.      $eshop->display_categories($cat_array);
  10.  }
  11.  ?>
  12.  


-----
Truly yours, Sasha.
 
My status
 Top
evgenijj
Отправлено: 12 Июля, 2007 - 09:07:46
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


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




Andrey пишет:
Нет, это всё понятно. Непонятно вот что:
Допустим, из твоего примера каталог товара сначала выглядит так:

Извещатели охранные
Извещатели пожарные
Приборы приемно-контрольные

Каким образом сделать, чтобы при нажатии на "Извещатели охранные"
каталог выглядел так:

Извещатели охранные
--- Извещатели охранные магнитоконтактные
--- Извещатели охранные электроконтактные
--- Извещатели охранные ударноконтактные
Извещатели пожарные
Приборы приемно-контрольные


PHP:
скопировать код в буфер обмена
  1.  
  2. // Путь до выбранной категории
  3. $path = category_path( $id_ctg );
  4. $out = processCategories(0, $path, $id_ctg);
  5. foreach ( $out as $ctg )
  6. {
  7.     // выводим категории
  8.     // $ctg[0] - ID категории
  9.     // $ctg[1] - название категории
  10.     // $ctg[2] - уровень вложенности (чтобы делать отступы слева )
  11. }
  12.  
  13. // Функция возвращает массив категорий с уровнями вложенности для построения
  14. // навигационной панели слева
  15. function processCategories($level, $path, $id_ctg)
  16. {
  17.         //$level - текущий уровень: 0 для корня каталога, 1 для его подкатегорий, и т.д.
  18.         //$path - путь от корня каталога до выбранной категории
  19.         //$id_ctg - ID выбранной категории
  20.  
  21.         $out = array();
  22.         $cnt = 0;
  23.  
  24.         $query = "SELECT id_ctg, title FROM ".TABLE_CATEGORIES." WHERE id_parent=".$path[$level]." ORDER BY sortorder";
  25.         $res = db_query( $query );
  26.         while ($row = db_fetch_row($res))
  27.         {
  28.                 $out[$cnt][0] = $row[0];   // category ID
  29.                 $out[$cnt][1] = $row[1];   // category name
  30.                 $out[$cnt][2] = $level;     // catagory level
  31.                 $cnt++;
  32.  
  33.                 // получить подкатегории?
  34.                 if ($level+1<count($path) && $row[0] == $path[$level+1])
  35.                 {
  36.                         // рекурсивный вызов функции processCategories
  37.                         $sub_out = processCategories($level+1, $path,  $id_ctg);
  38.                         //добавляем подкатегории в конец массива $out
  39.                         for ($j=0; $j<count($sub_out); $j++)
  40.                         {
  41.                                 $out[] = $sub_out[$j];
  42.                                 $cnt++;
  43.                         }
  44.                 }
  45.         }
  46.         return $out;
  47.  
  48. }
  49.  
  50. // Функция возвращает путь до текущей категории
  51. // Возвращает массив $path, содержащий categoryID от корня до текущей категории
  52. // $path[0]=0, $path[1]=5, $path[2]=$currentCategoryID
  53. function category_path( $id_ctg )
  54. {
  55.         // строим путь до категории (каталога)
  56.         $path = array();
  57.         $path[] = $id_ctg;
  58.         $curr = $id_ctg;
  59.         while ($curr)
  60.         {
  61.                 $q = db_query("SELECT id_parent FROM ".TABLE_CATEGORIES." WHERE id_ctg=".$curr );
  62.                 $row = db_fetch_row($q);
  63.                 $curr = $row[0];
  64.                 $path[] = $curr;
  65.         };
  66.  
  67.         //now reverse $path
  68.         $path = array_reverse($path);
  69.  
  70.         return $path;
  71. }
  72.  

Прикреплено изображение (Нажмите для увеличения)
att-4695c532a0a74alog.gif
 
 Top
InFAnT
Отправлено: 10 Ноября, 2009 - 16:09:09
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2009  


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




Народ, почему из-под класса не работает эта функция? Я пытаюсь просто вывести структуру каталогов в массив, используя рекурсивный вызов.. без представления, т.е. в виде списка ... , это будет выполненно в последствии при подключении дизайна, система работает по принципу модель-контроллер-представление!

Выдает ошибку: Fatal error: Call to undefined function getCategoriesList() in Z:\home\...\www\models\catalog.class.php on line 145

Пните в нужном направлении...))) Заранее, спс за помощь...

PHP:
скопировать код в буфер обмена
  1. function getCategoriesList ($parent_id, $level) {
  2.                 global $level;
  3.                 $level++;
  4.         $sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM catalog WHERE id_parent = ".$parent_id."
  5.                         ORDER BY sort ASC';
  6.                 $rows = mysql_query($sql);
  7.                 if (!$rows) trigger_error(mysql_error(), E_USER_ERROR);
  8.                 $countRows = getRowsCount('SELECT FOUND_ROWS() as rowsCount');
  9.  
  10.                 if ($countRows > 0) {
  11.                 $list = array();
  12.         while ( $row = mysql_fetch_assoc($rows) ) {
  13.         $parent_id = $row["id_catalog"];
  14.         getCategoriesList ($parent_id, $level);
  15.         $level--;
  16.         $list[] = $row;
  17.         }
  18.         }
  19.                
  20.                 return array($list, $countRows);
  21.         }

(Отредактировано автором: 10 Ноября, 2009 - 16:10:23)

 
 Top
JustUserR
Отправлено: 10 Ноября, 2009 - 16:18:17
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




InFAnT пишет:
Выдает ошибку: Fatal error: Call to undefined function getCategoriesList() in Z:\home\...\www\models\catalog.class.php on line 145
А туки к подключаемому файлу правильно прописаны?


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
InFAnT
Отправлено: 10 Ноября, 2009 - 16:24:33
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2009  


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




Да..., когда закомментировал строку:
PHP:
скопировать код в буфер обмена
  1. getCategoriesList ($parent_id, $level);

Заработало, но вывело категории первого уровня, что и естественно, потому что функция рекурсивно не запустилась, вот в этом и вопрос как ее запустить?) Может параметры не принимает, я хз..., уже не знаю, что думать...
 
 Top
JustUserR
Отправлено: 10 Ноября, 2009 - 17:51:56
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




InFAnT Да параметры вроде бы нипричем - ведь в ошибке написано что идет вызов неопределенной функции
Может в рекурсивном шаге имя функции указано неверно?


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
InFAnT
Отправлено: 11 Ноября, 2009 - 10:52:33
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2009  


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




С вызовом неопределенной функции я уже разобрался, похерил переменную $this !)))
Теперь функция сама ся вызывает с новыми параметрами, но почему-то на $level--; в цикле не реагирует, получает id , переходит на начало выполнения самой себя, а там $level++; вот так она и зацикливается!))))
 
 Top
JustUserR
Отправлено: 11 Ноября, 2009 - 17:31:04
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




InFAnT Может $level надо по ссылке передавать если он изменяется в шаге рекурсии?


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB