За последние 24 часа нас посетили 17566 программистов и 1719 роботов. Сейчас ищут 1776 программистов ...

Как сделать "хлебные крошки" (breadcrumbs)

Тема в разделе "PHP для новичков", создана пользователем krolik, 17 мар 2010.

Статус темы:
Закрыта.
  1. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Что правильно? Понял что делать нужно? :)

    Nested Sets, Adjacency List, Matherialized Path
     
  2. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    Есть еще вот такой кривой вариант.
    Как раз до третьей вложенности
    PHP:
    1.  
    2. <?php
    3. function get_link($parent_id)
    4.   {
    5.     $rarr="&mdash;";
    6.     //$line="&raquo;";
    7.     $query = "SELECT * FROM menu WHERE page='$parent_id' and shw='1' order by page asc";
    8.     $result = mysql_query($query);
    9.    
    10.     while ($row = mysql_fetch_array($result))
    11.     {
    12.     if ($_GET["page"]==$row['id'] OR $row['id']==$parent_id/* OR $row['page']==$_GET["page"]*/)
    13.         {
    14.         if ($_GET["page"]=='1')
    15.                 {
    16.                 echo "";
    17.                 }
    18.                 else
    19.                 {
    20.                 if ($parent_id)
    21.                 {
    22.                 echo "<span class='link'>&nbsp;".$rarr."&nbsp;<a href=/index.php?page=".$parent_id.">".$row['parent_name']."</a></span><span class='link'>&nbsp;".$rarr."&nbsp;<a href=/index.php?page=".$row['id'].">".$row['name']."</a></span>";
    23.                 }
    24.                 else
    25.                 {
    26.                 echo "<span class='link'>&nbsp;".$rarr."&nbsp;<a href=/index.php?page=".$row['id'].">".$row['name']."</a></span>";
    27.                 }
    28.                 }
    29.         }
    30.         get_link($row['id']);
    31.      }
    32.     }
    33. ?>
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Абсолютно ни о чем не говорит.

    Структуру таблицы и стаб на 5-10 записей из меню.
     
  4. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    Ничего из выше перечисленного, если конечно что-то из этого не называется рекурсией[/quote]
     
  5. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    [​IMG]
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    А теперь вопрос, начиная с какой ссылки меню, ты строишь дерево?
    С корня (Главная) или с конца ветви? :)

    Кстати, рекомендую
    http://dev.mysql.com/tech-resources/art ... -data.html
    там ты узнаешь что твой способ хранения это не рекурсия :)
     
  7. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    С (Главная)
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Тогда как ты надеешься извлечь ветку?

    У тебя есть два варианта

    1. рекурсивно извлекать меню с конца (работает для произвольной вложенности)
    2. Зная глубину вложенности, извлечь всю ветку 1м запросом при помощи JOIN (ограничение 60 с чем-то уровней вложенности)
     
  9. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    Надеялся, что здесь подскажут.

    Что за произвольная вложенность?
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Уже подсказали - извлекай с конца. Т.е. сначала текущую страницу, затем ее родителя, затем родителя родителя и так пока не дойдешь до Главной.

    Пунктов меню естественно.
     
  11. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    Ок, спасибо, буду пробовать
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    По-идее сработать должна твоя же рекурсия, только несколько измененная.
     
  13. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    эххх мне оказывается тоже эта штука нужна... будем разбираться)
     
  14. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    Сделал иначе, если кому-то нужно, то вот рабочий скрипт
    PHP:
    1. <?function get_crumbs($this_cat_id, $flarn, $keep_cat_id) {
    2. $rarr="&mdash;";
    3. $link_to_page=$_SERVER['PHP_SELF'];
    4. if (!isset($this_cat_id)) {
    5.  
    6. $this_cat_id =$_GET["page"];
    7. //echo "Главная >> ";
    8. }
    9.  
    10. $sql = "SELECT id, page, name from menu ";
    11. $sql .="where id = $this_cat_id";
    12.  
    13. $show_crumb_trail = mysql_query($sql);
    14. //echo('['.mysql_errno().'] ['.mysql_error().']'); exit;
    15. $num_crumbs = mysql_num_rows($show_crumb_trail);
    16.  
    17. if ($num_crumbs > 0) {
    18. list($cat_id, $cat_parent, $cat_name) = mysql_fetch_row($show_crumb_trail);
    19. $cat_id_array[$flarn] = $cat_id;
    20. $cat_parent_id_array[$flarn] = $cat_parent;
    21. $cat_name_array[$flarn] = $cat_name;
    22. if ($cat_id_array[$flarn] > 0) {
    23. mysql_free_result($show_crumb_trail);
    24.  
    25. $next = $flarn+1;
    26. if ($flarn == 0 ) {
    27. //echo "Главная >> ";
    28. }
    29.  
    30. get_crumbs($cat_parent_id_array[$flarn], $next, $keep_cat_id);
    31.  
    32. //if ($keep_cat_id==$cat_id_array[$flarn]) { echo $cat_name_array[$flarn]; } else {
    33.  
    34. if ($cat_parent==0)
    35. {
    36. echo "<a href=/".$cat_id.".htm>$cat_name_array[$flarn]</a>";
    37. }
    38. else
    39. {
    40. echo " $rarr <a href=/".$cat_id.".htm>$cat_name_array[$flarn]</a>";
    41. }
    42. }
    43. }
    44. }
    45. //}?>
    забыл добавить вывод скрипта.
    вставить туда где должны быть хлебные крошки
    вот это:
    PHP:
    1. <?get_crumbs($_REQUEST['cat_id'], "0", $_REQUEST['cat_id']);?>
     
  15. maga

    maga Активный пользователь

    С нами с:
    26 май 2010
    Сообщения:
    39
    Симпатии:
    0
    скажите пожалуйста, как настроить этот скрипт? у меня с базой не подключается...
     
  16. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    В начале файла со скриптом вставь свой файл подключения к базе
    пример:
    PHP:
    1. <? include ("db.php");?>
    где db.php подключение к базе данных

    Забыл, еще проверь в строке 10 этого скрипта
    PHP:
    1. $sql = "SELECT id, page, name from menu ";
    , что бы from menu было изменено на твое название таблицы
     
  17. maga

    maga Активный пользователь

    С нами с:
    26 май 2010
    Сообщения:
    39
    Симпатии:
    0
    да, да. я изменил. смотрите где у меня ошибка, очень подоже что программа не сможет соедин с базой, хотя у меня другие элементы выводятся из базы.


    PHP:
    1.  
    2. <?php include("block/bd.php");
    3. if (isset($_GET['cat'])) {$cat = $_GET['cat']; }
    4. if (!isset($cat)) {$cat = 1;}
    5. if (!preg_match("|^[\d]+$|", $cat)) {
    6. exit ("<p>Неверный формат запроса! Проверьте URL!");
    7. }
    8. $result = mysql_query("SELECT * FROM categories WHERE id='$cat'",$db);
    9. if (!$result)
    10. {
    11. echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору admin@<br> <strong>Код ошибки:</strong></p>";
    12. }
    13. if (mysql_num_rows($result) > 0)
    14. {
    15. $myrow = mysql_fetch_array($result);
    16. }
    17. else
    18. {
    19. echo "<p>Информация по запросу не может быть извлечена в таблице нет записей.</p>";
    20. exit();
    21. }
    22. ?>
    23. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    24. <html>
    25. <head>
    26. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    27. <title><?php echo $myrow["meta_d"];?></title>
    28. <link href="style.css" rel="stylesheet" type="text/css">
    29. <link href="style2.css" rel="stylesheet" type="text/css">
    30. <link rel="icon" href="http://localhost/engelz.ru/favicon.ico" type="image/x-icon">
    31. <link rel="shortcut icon" href="http://localhost/engelz.ru/favicon.ico" type="image/x-icon">
    32. <meta name="keywords" content="<?php echo $myrow["meta_k"];?>">
    33. <meta name="description" content="<?php echo $myrow["meta_d"];?>">
    34. <script type="text/javascript" src="js/swfobject.js"></script>
    35. </head>
    36.  
    37. <body>
    38.  
    39. <?php
    40.  function get_crumbs($this_cat_id, $flarn, $keep_cat_id) {
    41.  $rarr="&mdash;";
    42.  $link_to_page=$_SERVER['PHP_SELF'];
    43.  if (!isset($this_cat_id)) {
    44.  
    45.  $this_cat_id =$_GET["page"];
    46.  
    47.  }
    48.  
    49.  $sql = "SELECT id, page, title FROM categories";
    50.  $sql ="where id = $this_cat_id";
    51.  
    52.  $show_crumb_trail = mysql_query($sql);
    53.  //echo('['.mysql_errno().'] ['.mysql_error().']'); exit;
    54.  $num_crumbs = mysql_num_rows($show_crumb_trail);
    55.  
    56.  if ($num_crumbs > 0) {
    57.  list($cat_id, $cat_parent, $cat_name) = mysql_fetch_row($show_crumb_trail);
    58.  $cat_id_array[$flarn] = $cat_id;
    59.  $cat_parent_id_array[$flarn] = $cat_parent;
    60.  $cat_name_array[$flarn] = $cat_name;
    61.  if ($cat_id_array[$flarn] > 0) {
    62.  mysql_free_result($show_crumb_trail);
    63.  
    64.  $next = $flarn+1;
    65.  if ($flarn == 0 ) {
    66.  //echo "Главная >> ";
    67.  }
    68.  
    69.  get_crumbs($cat_parent_id_array[$flarn], $next, $keep_cat_id);
    70.  
    71.  //if ($keep_cat_id==$cat_id_array[$flarn]) { echo $cat_name_array[$flarn]; } else {
    72.  
    73.  if ($cat_parent==0)
    74.  {
    75.  echo "<a href=/".$cat_id.".htm>$cat_name_array[$flarn]</a>";
    76.  }
    77.  else
    78.  {
    79.  echo " $rarr <a href=/".$cat_id.".htm>$cat_name_array[$flarn]</a>";
    80.  }
    81.  }
    82.  }
    83.  }
    84.  //}?>
    85.  
    86. <?php $php_thoughts = $myrow['title']; include("block/header.php"); ?>
    87.      
    88. <table valign="top" width="100%" border="0" cellspacing="0" cellpadding="0">
    89.   <tr>
    90.   <?php include("block/left_td.php"); ?>  
    91.    
    92.     </td>
    93.     <td valign="top"><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="main_table">
    94.       <tr>
    95.         <td valign="top">
    96.         <?php get_crumbs($_REQUEST['cat_id'], "0", $_REQUEST['cat_id']);?>
    97.         <?php echo $myrow["text"];
    98.        
    99.        
    100.        
    101. $result77 = mysql_query("SELECT str FROM options", $db);
    102. $myrow77 = mysql_fetch_array($result77);
    103. $num = $myrow77["str"];
    104. // Извлекаем из URL текущую страницу
    105. @$page = $_GET['page'];
    106. // Определяем общее число сообщений в базе данных
    107. $result00 = mysql_query("SELECT COUNT(*) FROM data WHERE cat='$cat'");
    108. $temp = mysql_fetch_array($result00);
    109. $posts = $temp[0];
    110. // Находим общее число страниц
    111. $total = (($posts - 1) / $num) + 1;
    112. $total =  intval($total);
    113. // Определяем начало сообщений для текущей страницы
    114. $page = intval($page);
    115. // Если значение $page меньше единицы или отрицательно
    116. // переходим на первую страницу
    117. // А если слишком большое, то переходим на последнюю
    118. if(empty($page) or $page < 0) $page = 1;
    119.   if($page > $total) $page = $total;
    120. // Вычисляем начиная с какого номера
    121. // следует выводить сообщения
    122. $start = $page * $num - $num;
    123. // Выбираем $num сообщений начиная с номера $start      
    124.        
    125.        
    126.        
    127.        
    128.        
    129. $result1 = mysql_query("SELECT id,title,description,date,author,mini_img,view FROM data WHERE cat='$cat' ORDER BY id LIMIT $start, $num",$db);
    130. if (!$result1)
    131. {
    132. echo "<p>Запрос на выборку данных из базы не прошел.</strong></p>";
    133. }
    134. if (mysql_num_rows($result1) > 0)
    135. {
    136. $myrow1 = mysql_fetch_array($result1);
    137. do
    138. {
    139.    
    140. printf ("<div class='content3'>
    141. <a href='lesson.php?id=%s'><img src='%s' class='mini_img' align='left' alt='*'></a>
    142. <p class='h4'><a href='lesson.php?id=%s'>%s</a></p>
    143. <p class='comment'>Добавил: %s<br>Сложность: %s</p><br clear='left'>
    144. <div class='description'>%s</div>
    145. <div class='info'>
    146. <div  class='raiting_star'>
    147. <div  class='raiting'>
    148. <div  class='raiting_blank'></div>
    149. <div  class='raiting_hover'></div>
    150. <div id='im'></div></div>
    151. <span class='comment'>Создан: %s</span>
    152. <span class='comment'>Просмотров: %s</span></div></div><br>",$myrow1["id"],$myrow1["mini_img"],$myrow1["id"],$myrow1["title"],$myrow1["author"],$myrow1["slog"],$myrow1["description"],$myrow1["img"],$myrow1["view"],$myrow1["date"]);
    153. }
    154. while ($myrow1 = mysql_fetch_array($result1));
    155. ?>
    156. <br>
    157. <?php
    158. // Проверяем нужны ли стрелки назад
    159. if ($page != 1) $pervpage = '<a href=categories.php?cat='.$cat.'&page=1></a> <a href=categories.php?cat='.$cat.'&page='. ($page - 1) .'></a>  ';
    160. // Проверяем нужны ли стрелки вперед
    161. if ($page != $total) $nextpage = '  <a href=categories.php?cat='.$cat.'&page='. ($page + 1) .'></a> | <a href=categories.php?cat='.$cat.'&page=' .$total. '>Последняя</a>';
    162.  
    163. // Находим две ближайшие станицы с обоих краев, если они есть
    164. if($page - 5 > 0) $page5left = ' <a href=categories.php?cat='.$cat.'&page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
    165. if($page - 4 > 0) $page4left = ' <a href=categories.php?cat='.$cat.'&page='. ($page - 4) .'>'. ($page - 4) .'</a> | ';
    166. if($page - 3 > 0) $page3left = ' <a href=categories.php?cat='.$cat.'&page='. ($page - 3) .'>'. ($page - 3) .'</a> | ';
    167. if($page - 2 > 0) $page2left = ' <a href=categories.php?cat='.$cat.'&page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
    168. if($page - 1 > 0) $page1left = ' <a href=categories.php?cat='.$cat.'&page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
    169.  
    170. if($page + 5 <= $total) $page5right = ' | <a href=categories.php?cat='.$cat.'&page='. ($page + 5) .'>'. ($page + 5) .'</a>';
    171. if($page + 4 <= $total) $page4right = ' | <a href=categories.php?cat='.$cat.'&page='. ($page + 4) .'>'. ($page + 4) .'</a>';
    172. if($page + 3 <= $total) $page3right = ' | <a href=categories.php?cat='.$cat.'&page='. ($page + 3) .'>'. ($page + 3) .'</a>';
    173. if($page + 2 <= $total) $page2right = ' | <a href=categories.php?cat='.$cat.'&page='. ($page + 2) .'>'. ($page + 2) .'</a>';
    174. if($page + 1 <= $total) $page1right = ' | <a href=categories.php?cat='.$cat.'&page='. ($page + 1) .'>'. ($page + 1) .'</a>';
    175.  
    176. // Вывод меню если страниц больше одной
    177.  
    178. if ($total > 1)
    179. {
    180. Error_Reporting(E_ALL & ~E_NOTICE);
    181. echo "<div class=\"pstrnav\">";
    182. echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage;
    183. echo "</div>";
    184. }
    185. }        
    186. ?>
    187.         </td>
    188.       </tr>
    189.     </table>
    190.    
    191.  
    192.    
    193.     </td>
    194. <?php include("block/right_td.php"); ?>
    195. </td>
    196.   </tr>
    197. </table>      
    198. <?php include("block/footer.php"); ?>
    199.  
    200. </body>
    201. </html>
    202.  
     
  18. maga

    maga Активный пользователь

    С нами с:
    26 май 2010
    Сообщения:
    39
    Симпатии:
    0
    вот такая ошибка выдает:
    Код (Text):
    1. Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in S:\home\localhost\www\engelz.com\categories.php on line 54
    [/code]
     
  19. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    ничего не настораживает?
     
  20. maga

    maga Активный пользователь

    С нами с:
    26 май 2010
    Сообщения:
    39
    Симпатии:
    0
    нет. я не очень то и спец по php. если нашли ошибку, прошу исправить
     
  21. maga

    maga Активный пользователь

    С нами с:
    26 май 2010
    Сообщения:
    39
    Симпатии:
    0
    Помогите люди, очень помощь нужна
     
  22. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    попробуй вот так
    PHP:
    1. $sql = "SELECT id, page, title FROM [b]`categories`[/b]";
    2. $sql ="where id = $this_cat_id";
    если не поможет, то в строке 54 напиши вот так
    PHP:
     
  23. maga

    maga Активный пользователь

    С нами с:
    26 май 2010
    Сообщения:
    39
    Симпатии:
    0
    это перемен.???? или....???? и где это заменить если вам не трудно напишите.
     
  24. maga

    maga Активный пользователь

    С нами с:
    26 май 2010
    Сообщения:
    39
    Симпатии:
    0
    итак тоже самое пишет.

     
  25. krolik

    krolik Активный пользователь

    С нами с:
    17 мар 2010
    Сообщения:
    26
    Симпатии:
    0
    в таблице categories есть строки(данные)???

    в твоем посте это 54 строка.
    найди эту строку
    PHP:
    1. $num_crumbs = mysql_num_rows($show_crumb_trail);
    и поставь @ перед myscl_num_rows
    PHP:
    1. $num_crumbs = @mysql_num_rows($show_crumb_trail);
    это избавит от ошибки, но не решит проблему
     
Статус темы:
Закрыта.