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]   

> Описание: замучался в попытках организовать хлебные крошки под интернет-магазин
Christian Galliano
Отправлено: 08 Августа, 2013 - 15:54:55
Post Id



Новичок


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


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




Добрый день. Я еще новичок, потихоньку изучаю PHP и недавно захотел разработать интернет-магазин, как бы применить текущие знания на практике и в будущем иметь под рукой заготовки каких-то отдельных "классических" блоков интернет магазина.
Начал написание магазина не посредственно с разработки страницы отображения категорий и товаров и почти сразу наткнулся на проблему, на которой тщетно бьюсь вот уже второй день на пролет.
В общем начал я с того, что представил как должен работать файл отображающий категории и товары, с этим справился достаточно быстро, хотя скрипт наверное нубский. Радость
В общем логика файла такова:
Мы имеем MySQL БД, в которой находятся таблица хранения категорий и таблица хранения товаров.
categories
Цитата:
id | title | alias | description | img | parent

в столбце "alias" хранится название категории на транслисте
в столбце "parent" хранится название родительской категории на транслисте (знаю, что можно использовать родительское id, но подумал, что так будет "визуально-легче-восприниматся", если идея глупая, то сделаю по id Радость )

Собственно таблица товаров организован по классике и содержит поле parent, в котором указано имя категории в которой должен выводится данный товар.

Файл shop.php организован просто:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['cutName'])) {$cutName= $_GET['cutName'];}
  2. if (!isset($cutName)) { //проверяем обратились ли мы к файлу с иминем родительской категории, подкатегории которой нужно вывести. Если нет то исполняем следующий код:
  3.  
  4. $result = mysql_query("SELECT * FROM categories WHERE parent=''",$db);
  5. //то есть выбираем категории которые не имеют родителя, следовательно категории 0-го уровня (или первого =D, как там правильно..) и дальше выводим их
  6. //ссылка каждой категории в итого выглядит так:
  7. <a href="shop.php?cutName=Вытянутое из таблце поле "alias" данной категории">Название категории</a>    
  8. }
  9. //собственно если поле $cutName существует, то мы обратились к файлу пройдя уровень нулевых категорий и уже по логике находимся в подкатегориях, так что выводим следующий код
  10. $result = mysql_query("SELECT * FROM categories WHERE parent='$cutName'",$db);
  11. //мы получили дочерние поля категории имя которой содержится в переменной $cutName и можем, проверив не пустой ли запрос с ними работать
  12. //ссылки на каждую категорию работают по той же модели
  13. <a href="shop.php?cutName=Вытянутое из таблце поле "alias" данной категории">Название категории</a>    
  14.  
  15. //повторяем такой же запрос для товаров
  16. $result = mysql_query("SELECT * FROM product WHERE parent='$cutName'",$db);

Таким образом легко получаем файл в котором можем без проблем создавать многоуровневые категории с возможностью публикаций товаров, это удобно и часто востребовано (когда я работал менеджером в интернет магазине у нас использовалось структура в которой обязательно нужны данные возможности)
На пример структура "главная/музыкальные инструменты/гитары/акустические гитары".
И тут нам для удобства юзера было бы здорово выгрузить все "акустические гитары", но над ними выгрузить еще категории "струны для акустических гитар", "аксессуары для акустических гитар и тд

Но в общем проблема в том, что я совершенно не догоняю, как правильно теперь сделать хлебные крошки для такой модели сайта... уровень знаний еще не тот наверно, а подходящего решения уже второй день не могу найти..
Помогите плиз Огорчение
(Добавление)
Оу... не в ту категорию написал... хотел в "Вопросы новичков" А?!
 
 Top
imya
Отправлено: 08 Августа, 2013 - 15:57:56
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


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




2 дня не можете пнуть гугл в нужную сторону??

http://stackoverflow[dot]com/questio[dot][dot][dot]namic-breadcrumb


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
Christian Galliano
Отправлено: 08 Августа, 2013 - 16:11:42
Post Id



Новичок


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


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




imya пишет:
2 дня не можете пнуть гугл в нужную сторону??

http://stackoverflow.com/questions/2594211/php-simple-dynamic-breadcrumb



Простите, забыл написать, что техническим "вебдевелоперским" английским тоже еще не блистаю... что то понимаю уже, а чего то еще нет и от больших статей с терминами мозги через уши текут Радость
Пробовал воспользоваться гугл переводчиком, но от перевода ужаснулся еще больше чем от своего и попробовал искать решение на русских просторах Растерялся
 
 Top
imya
Отправлено: 08 Августа, 2013 - 16:24:08
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


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






-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
Christian Galliano
Отправлено: 08 Августа, 2013 - 17:11:52
Post Id



Новичок


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


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






Эти примеры (кроме одного) находил в интернете, но в одном для вордпресс, я так понимаю там своя CMS заморочина, у одного парня вообще простой вариант, а вот третье , на "#ХешКоде" действительно работает, вот только там необходимо в массив выводить имена и ссылки на сами крошки, а я как раз это не могу сообразить
вот так там:
PHP:
скопировать код в буфер обмена
  1. echo navigation(
  2.     array('/', 'Главная'),
  3.     array('/old', 'Чуток ниже'),
  4.     array('/old-s', 'И еще чуток ниже')
  5. );
  6.  


Хм.. рекурсия... знаю что это, в теории, а вот как на практике применить.. знаний не хватает.
У меня была одна идея... но это страшная кракозябра наверное Радость
Принцип идеи такой:
допустим мы находимся в категории "планшеты Samsung" а путь до нее такой
главная - электроника - планшеты и телефоны - планшеты - планшеты Samsung
Тогда, в теории можно вывести крошки следующим способом:
PHP:
скопировать код в буфер обмена
  1. //в переменной $cutName находится имя категории, в которой мы сейчас находимся
  2. $result = mysql_query("SELECT title, parent FROM categories WHERE parent='$cutName",$db);
  3. $myrow = mysql_fetch_array($result);
  4. //получили имя текущей категории и имя категории-родителя
  5. //выводим имя текущей категории в крошки (по идее это "планшеты Samsung")
  6. if ($myrow['parent'] != '') {
  7.  
  8. //знаем, что наша категория не 0-вого уровня, и имеет родителя
  9. $pCutName = $myrow['parent']; //для удобства
  10. $result = mysql_query("SELECT title, alias, parent FROM categories WHERE parent='$pCutName",$db);
  11. $myrow = mysql_fetch_array($result );
  12. //получили имя родительской категории, псевдоним и имя ее категории-родителя
  13. //дальше делаем ссылку для крошек, ну условно это:
  14. echo '
  15. <a href="shop.php?cutName='.$myrow[alias].'>'.$myrow[title].'</a>"
  16. ';
  17. //по идее получаем ссылку с именем "Планшеты"
  18.  
  19. //кроме ссылки у нас осталось еще значение имени родительской категории "планшетов
  20. if ($myrow['parent'] != '') {
  21.  
  22. //знаем, что наша категория не 0-вого уровня, и имеет родителя
  23. //далее повторяем ту же модель и получаем ссылку "Планшеты и телефоны" и имя родительской категории планшетов и телефонов
  24. }
  25. }
  26.  


таких "многоуровневых if'ов можно нахреначить штук 30 (вряд ли у кого то будеть больше 30 подкатегорий) .... но это наверное кракозябра страшнейшея... может есть способ провести то же самое, но проще визуально и с меньшим количеством запросов?

(Отредактировано автором: 08 Августа, 2013 - 17:14:42)

 
 Top
DeepVarvar Супермодератор
Отправлено: 08 Августа, 2013 - 21:16:46
Post Id



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


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


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




 
 Top
Christian Galliano
Отправлено: 08 Августа, 2013 - 21:31:26
Post Id



Новичок


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


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





видел, но как быть с "mySQLi", ведь обычно хостах установлен mySQL..
Я так понял "mySQLi" это улучшенная версия mySQL?
Или можно использовать "mySQLi" при установленной на хосте mySQL?
 
 Top
DeepVarvar Супермодератор
Отправлено: 08 Августа, 2013 - 21:40:03
Post Id



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


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


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




PHP:
скопировать код в буфер обмена
  1. if (function_exists("mysqli_connect")) echo "Ура! Mysqli установлена!";
 
 Top
Christian Galliano
Отправлено: 08 Августа, 2013 - 23:14:21
Post Id



Новичок


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


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




DeepVarvar пишет:
PHP:
скопировать код в буфер обмена
  1. if (function_exists("mysqli_connect")) echo "Ура! Mysqli установлена!";

о! действительно так просто! спасибо!
подскажите пожалуйста еще, как пихать код из этой статьи?
когда пихаю его в пхп файл куча ошибок лезет..
CODE (SQL):
скопировать код в буфер обмена
  1.     DELIMITER $$
  2.      
  3.     DROP PROCEDURE IF EXISTS get_breadcrumbs$$
  4.     CREATE PROCEDURE get_breadcrumbs(IN current_id BIGINT(20), show_home TINYINT(1))
  5.      
  6.         READS SQL DATA
  7.      
  8.         BEGIN
  9.      
  10.             DECLARE buff_id BIGINT(20);
  11.             DECLARE buff_parent_id BIGINT(20);
  12.      
  13.             DECLARE done_search TINYINT(1);
  14.             DECLARE current_depth BIGINT(20);
  15.      
  16.             SET done_search = 0;
  17.             SET current_depth = 0;
  18.             SET buff_id = NULL;
  19.      
  20.             CREATE TEMPORARY TABLE breadcrumbs (id BIGINT(20), depth BIGINT(20)) ENGINE = MEMORY;
  21.      
  22.             findloop : WHILE done_search = 0 DO
  23.      
  24.                 SELECT id, parent_id INTO buff_id, buff_parent_id FROM documents WHERE id = current_id;
  25.      
  26.                 IF buff_id IS NULL THEN
  27.      
  28.                     IF show_home != 0 THEN
  29.      
  30.                         SELECT id, parent_id INTO buff_id, buff_parent_id FROM documents WHERE alias = '/';
  31.                         IF buff_id IS NOT NULL THEN
  32.                             INSERT INTO breadcrumbs (id, depth) VALUES(buff_id, current_depth);
  33.                         END IF;
  34.      
  35.                     END IF;
  36.      
  37.                     SET done_search = 1;
  38.                     LEAVE findloop;
  39.      
  40.                 END IF;
  41.      
  42.                 INSERT INTO breadcrumbs (id, depth) VALUES(buff_id, current_depth);
  43.      
  44.                 SET current_id = buff_parent_id;
  45.                 SET current_depth = current_depth + 1;
  46.                 SET buff_id = NULL;
  47.      
  48.             END WHILE findloop;
  49.      
  50.             SELECT
  51.      
  52.                 d.id,
  53.                 d.parent_id,
  54.                 d.name,
  55.                 d.alias,
  56.                 b.depth
  57.      
  58.             FROM breadcrumbs b
  59.             INNER JOIN documents d ON d.id = b.id
  60.             ORDER BY b.depth DESC;
  61.      
  62.         END$$
  63.      
  64.     DELIMITER ;
 
 Top
caballero
Отправлено: 08 Августа, 2013 - 23:32:53
Post Id


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


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




хранимые процедуры для хлебных крошек? Мде..

а может отдельный выделенный сервер? один для крошек другой для вывода меню и т.д.
гулять так гулять


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Christian Galliano
Отправлено: 08 Августа, 2013 - 23:48:41
Post Id



Новичок


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


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




caballero пишет:
хранимые процедуры для хлебных крошек? Мде..

а может отдельный выделенный сервер? один для крошек другой для вывода меню и т.д.
гулять так гулять


Радость
ну решение не мое... но вроде единственное не монстроподобное, если судить по описанию автора Растерялся
 
 Top
caballero
Отправлено: 08 Августа, 2013 - 23:59:15
Post Id


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


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




Цитата:
но вроде единственное не монстроподобное,

если хранимая процедура в полсотни строк не монстроподобное то даже не заню что тогда монстроподобное

при нормальной организации данных в бд достаточно просто SQL запроса


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Christian Galliano
Отправлено: 09 Августа, 2013 - 00:05:46
Post Id



Новичок


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


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




caballero пишет:
Цитата:
но вроде единственное не монстроподобное,

если хранимая процедура в полсотни строк не монстроподобное то даже не заню что тогда монстроподобное

при нормальной организации данных в бд достаточно просто SQL запроса

Радость да, действительно странно как то

вот не могу понять как правильно сделать что бы запрос 1 и дальше обработать все... единственное, что пришло в голову не менее чудовищно, чем хранимая процедура на 50 строк... поэтому решением ее не считаю =)
 
 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