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

Форум PHP

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

 

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

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

тема: Как такое меню сделать?
 
 автор: Boris   (25.01.2007 в 15:25)   письмо автору
 
 

http://www.ntv.ru/corp/about/
Имею в виду логику работы.

Чтобы пункты страниц брались из БД.

Буду очень признателен за ответ!

Борис.

   
 
 автор: Boris   (26.01.2007 в 08:41)   письмо автору
 
   для: Boris   (25.01.2007 в 15:25)
 

???
Неужели нет ни у кого?!

   
 
 автор: minas   (26.01.2007 в 08:57)   письмо автору
 
   для: Boris   (25.01.2007 в 15:25)
 

В БД забиваются URL'ы и выдираются оттуда обычным SELECT запросом.

   
 
 автор: Boris   (26.01.2007 в 09:12)   письмо автору
 
   для: minas   (26.01.2007 в 08:57)
 

:) это я знаю. Но логика какая? Какие поля должна иметь таблица этой БД?

   
 
 автор: Boris   (26.01.2007 в 13:02)   письмо автору
 
   для: Boris   (26.01.2007 в 09:12)
 

чО всем пофиг на мой вопрос?

   
 
 автор: Loki   (26.01.2007 в 13:31)   письмо автору
 
   для: Boris   (26.01.2007 в 13:02)
 

Может его просто никто не понимает?

   
 
 автор: Boris   (26.01.2007 в 14:47)   письмо автору
 
   для: Loki   (26.01.2007 в 13:31)
 

:)
Попробую по-другому объснить, только скажите понятно я изложил или нет.
Хочу меню чтобы оно работало следующим образом:

1). Выводятся главные пункты в столбик:

О компании
Производство
Товары
Контакты


2). Я щелкаю например на "Товары", если в этой категории есть зависимые пункты, то они выводятся меджу "Товары" и "Контакты":

О компании
Производство
Товары
 -пылесосы
 -унитазы
Контакты


3). Если я щелкаю на "пылесосы", то, при наличии соответствующих пунктов, для которых "пылесосы" - пункт-родитель, выводятся они:

О компании
Производство
Товары
 -пылесосы
    -комета
    -тайфун
 -унитазы
Контакты

И так далее...

4). Щелкаю снова на "Товары", все сворачивается и выглядит как в 2).

Меню формируется средствами PHP из базы Mysql.
Админ сайта должен иметь возможность добавлять пункты меню, заполняя форму с полями:

"Новый пункт" и "Страница-родитель"

Страница-родитель выбирается из раскрывающегося списка, ну как тут на форуме происходит выбор форума.

Вопросы

1). Сколько и какие должны быть поля у таблицы для хранения этой информации в БД?
(ну типа: id_page, name, id_parent_page ....)
Может одной таблицы мало будет?

2). Какай алгоритм скрипта, который все это меню выводит
(ну типа:
- делаем выборку id_page, где id_parent_page равно 0.
-выводим name в цикле wile
-....)

Это же не уникальный случай, можек кто подобное делал? :-|
Ну не могу я сам догадатья уже третий день!

Простите за мои эмоции.

   
 
 автор: vbps   (26.01.2007 в 14:29)   письмо автору
 
   для: Boris   (25.01.2007 в 15:25)
 

Просто. Категории и под категории.

Допустим основная категория имеет какойто id и parent = 0, а подкатегория parent = 1 где 1 id основной категории или чейто подкатегории.

вот и вся логика.

   
 
 автор: Boris   (26.01.2007 в 14:56)   письмо автору
 
   для: vbps   (26.01.2007 в 14:29)
 

Я так и делаю, а у меня получается, что "дети" выводятся везде!


Вот функция, а результат во вложении.
<? include ('config.php');
  
   
  function 
tree($ids)
   { 
    
$query "SELECT * FROM menu WHERE id_parent_page = ".$ids." ORDER BY id_page ASC";
    
$result mysql_query($query);
     
    echo 
"<ul>";
    
    
//Цикл, пока не исчерпается массив 
    
while ( $print mysql_fetch_array($result))
     {
      
//Выбираем сраницу с id_page,
      //выводим ее ссылку 
      
$ide $print['id_page']; 
      echo 
"<li>"
      echo 
"<a href=?id_page=".$ide.">".$print['name']."</a>";
      
      
// Если установлено значение id_page... 
      
if(isset($_GET['id_page']))
       {
        
//echo $_GET['id_page'];
        
$a $_GET['id_page'];
        
$query2 "SELECT * FROM menu WHERE id_parent_page = ".$a." ORDER BY id_page ASC";
        
$result2 mysql_query($query2);
        while ( 
$print2 mysql_fetch_array($result2))
        {
         
$b $print2['id_page']; 
         echo 
"<li>"
         echo 
"<a href=?id_page=".$b.">".$print2['name']."</a>";
        }
       } 
    echo 
"</ul>"
     }
   }   
   
tree(00); 
?>

   
 
 автор: Boris   (26.01.2007 в 15:00)   письмо автору
 
   для: Boris   (26.01.2007 в 14:56)
 

Мне уже пора, но завтра я обязательно продолжу!
Вы спрашивайте, я просто столько листов исписал, даже не знаю как еще обьяснить что я делал и что пулучаось.

   
 
 автор: vbps   (26.01.2007 в 16:05)   письмо автору
 
   для: Boris   (26.01.2007 в 14:56)
 

Может я туплю, но зачем:


WHERE id_parent_page = ".$ids."


переходя в подкатегорию не будет видно основных категорий.
что бы видеть только основные


WHERE id_parent_page = 0


затем уже перебираеш выбраные подкатегории как по коду ниже.

   
 
 автор: куч1963   (27.01.2007 в 04:45)   письмо автору
 
   для: vbps   (26.01.2007 в 16:05)
 

Может тебе подойдет такое решение.
Структура таблицы:
группа id_page = 0
подгруппа id_page = id_article(группы)
CREATE TABLE `names` (
`id_article` int(10) unsigned NOT NULL auto_increment,
`name` tinytext NOT NULL,
`pos` mediumint(9) NOT NULL default '0',
`hide` enum('show','hide') NOT NULL default 'show',
`id_page` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`id_article`),
KEY `id_page` (`id_page`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Функции меню:

function categoryIndexInArray(&$list, $id)
{
    $j = 0;
    while ($j<count($list) && $list[$j]['id_article']!=$id) $j++;
    if ($j == count($list)) return 0;
    else return $j;

function calculatePath(&$categories, $id_page)
{
    $path = array();
    $i = $id_page;
    if ($i) do
    {
        $c = categoryIndexInArray($categories,$i);
        $path[] = $categories[$c]['id_article'];
        $i = $categories[$c]['id_page'];
    } while ($i);

    $path[]=0;
    $path = array_reverse($path); 
return $path;

function processCategories(&$list, $level, $path, $sel,$out) 
{
    for ($i=0; $i<count($list); $i++)
    {

        if ($list[$i]['id_page'] == $path[$level])
        {
            $out .= "<tr><td>";    
            for ($j=0; $j<$level; $j++) $class= ' style="padding-left:5px; color:#9c3c27">';

            if ($list[$i]['id_article'] == $sel) 
            { 
            if(!isset($class)) $class= 'style="padding-left:0px; color:#9c3c27">&#187;&nbsp;';
            $out .= "<p $class<nobr>".$list[$i]['name']."</nobr></p>";
                $out .= '</td></tr>';
                }            
                else     { 
$out .="";
                if ($level) $out .="<p style='padding-left:5px;'><a href='http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?id_article=".$list[$i]['id_article']."' class='lightstandard'>".$list[$i]['name']."</a></p></td></tr>";
                else $out .= "<a href='http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?id_article=".$list[$i]['id_article']."'>".$list[$i]['name']."</a></td></tr>";
                }    
             } 
              if ($level+1<count($path) && $list[$i][0] == $path[$level+1])
            $out = processCategories($list,$level+1,$path,$sel,$out);
              
            }                 
return $out;     
}
function echo_menu($id_page,$cats,$path){
    if (!isset($id_page)) $id_page = 0;        
    echo processCategories($cats,0,$path,&$id_page,""); 
    }

На странице:
собираю в массив



$query ="SELECT * FROM names where id_article<>0 AND hide='show' ORDER BY pos ";
     $res = mysql_query($query);    
for ($cats=array(); $row=mysql_fetch_array($res); $cats[]=$row);
    $path = calculatePath($cats, $_GET['id_article']);
    $t = categoryIndexInArray($cats, $_GET['id_article']);


В блоке меню вывожу:

echo_menu(@$_GET['id_article'],$cats,$path);

   
 
 автор: Boris   (29.01.2007 в 07:22)   письмо автору
 
   для: куч1963   (27.01.2007 в 04:45)
 

О! Спасибо! Это совсем чуть-чуть не совсем что надо :))), но я все равно такого не придумал!
Только что пришел до компа и первым делом сюда. В коде пока не разбирался, но таблицу создал - все работает!

Еще раз спасибо.

   
Rambler's Top100
вверх

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