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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
event
Отправлено: 01 Мая, 2014 - 11:36:06
Post Id


Частый посетитель


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


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




Всем привет.

Есть такая таблица MYSQL:

-- phpMyAdmin SQL Dump
-- version 3.4.8
-- http://www.phpmyadmin[dot]net
--
-- Хост: localhost
-- Время создания: Май 01 2014 г., 11:33
-- Версия сервера: 5.1.52
-- Версия PHP: 5.3.3

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- База данных: `fldb`
--

-- -------------------------------- ------------------------

--
-- Структура таблицы `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`sort` int(10) NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=71 ;

--
-- Дамп данных таблицы `categories`
--

INSERT INTO `categories` (`id`, `sort`, `name`) VALUES
(1, 0, 'Администрирование'),
(2, 0, 'Айдентика/Полиграфия'),
(12, 1, 'Системное администрирование'),
(13, 1, 'Служба поддержки'),
(15, 2, 'Верстка/Допечатная подготовка'),
(16, 2, 'Дизайн продукции/упаковки');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Нужно из этой таблицы вывести запрос и сделать цикл (условие) чтобы построить этот список:

В итоге должно получится так:

Администрирование
--- Системное администрирование
--- Служба поддержки

Айдентика/Полиграфия
--- Верстка/Допечатная подготовка'
--- Дизайн продукции/упаковки

Какие будут предложения?
 
 Top
LIME
Отправлено: 01 Мая, 2014 - 12:49:48
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




event пишет:
Какие будут предложения?

предлагаю погуглить структуру хранения деревьев в реляционной бд
то что у тебя не есть дерево
 
 Top
event
Отправлено: 03 Мая, 2014 - 15:57:38
Post Id


Частый посетитель


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


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




Короче, сделано, но не совсем так как нужно:

PHP:
скопировать код в буфер обмена
  1. $result = $mysqli->query("SELECT * FROM categories");
  2. //Если в базе данных есть записи, формируем массив
  3. if   ($result->num_rows > 0){
  4.     $cats = array();
  5. //В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
  6.     while($cat =  $result->fetch_assoc()){
  7.         $cats_ID[$cat['id']][] = $cat;
  8.         $cats[$cat['parent_id']][$cat['id']] =  $cat;
  9.     }
  10. }
  11.  
  12. function build_tree($cats,$parent_id,$only_parent = false){
  13.     if(is_array($cats) and isset($cats[$parent_id])){
  14.         $tree = '<ul>';
  15.         if($only_parent==false){
  16.             foreach($cats[$parent_id] as $cat){
  17.                 $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
  18.                 $tree .=  build_tree($cats,$cat['id']);
  19.                 $tree .= '</li>';
  20.             }
  21.         }elseif(is_numeric($only_parent)){
  22.             $cat = $cats[$parent_id][$only_parent];
  23.             $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
  24.             $tree .=  build_tree($cats,$cat['id']);
  25.             $tree .= '</li>';
  26.         }
  27.         $tree .= '</ul>';
  28.     }
  29.     else return null;
  30.     return $tree;
  31. }
  32.  
  33. echo build_tree($cats,0);


В результате получаю список через <ul>, <li>. А как это переделать под выпадающий список (select, option)? А то пробую, но коряво получается.

Заранее спасибо.
 
 Top
Panoptik
Отправлено: 03 Мая, 2014 - 16:21:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




что вам мешает заменить ul на select, а li на option?


-----
Just do it
 
 Top
event
Отправлено: 03 Мая, 2014 - 16:26:12
Post Id


Частый посетитель


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


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




Panoptik, вы думаете я не пробовал? Радость

Пробовал, вот так:
PHP:
скопировать код в буфер обмена
  1. $result = $mysqli->query("SELECT * FROM categories_old");
  2. //Если в базе данных есть записи, формируем массив
  3. if   ($result->num_rows > 0){
  4.     $cats = array();
  5. //В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
  6.     while($cat =  $result->fetch_assoc()){
  7.         $cats_ID[$cat['id']][] = $cat;
  8.         $cats[$cat['parent_id']][$cat['id']] =  $cat;
  9.     }
  10. }
  11.  
  12. function build_tree($cats,$parent_id,$only_parent = false){
  13.     if(is_array($cats) and isset($cats[$parent_id])){
  14.         $tree = '<select>';
  15.         if($only_parent==false){
  16.             foreach($cats[$parent_id] as $cat){
  17.                 $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
  18.                 $tree .=  build_tree($cats,$cat['id']);
  19.                 $tree .= '</li>';
  20.             }
  21.         }elseif(is_numeric($only_parent)){
  22.             $cat = $cats[$parent_id][$only_parent];
  23.             $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  24.             $tree .=  build_tree($cats,$cat['id']);
  25.             $tree .= '</option>';
  26.         }
  27.         $tree .= '</select>';
  28.     }
  29.     else return null;
  30.     return $tree;
  31. }
  32.  
  33. echo build_tree($cats,0);


Результат, корявый:

 
 Top
Panoptik
Отправлено: 03 Мая, 2014 - 16:27:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




так у вас с 16 по 19 строк используются те же li
(Добавление)
вообще чтобы делать меньше глупостей - чаще заглядывайте в исходный код браузера, сразу увидите что не так


-----
Just do it
 
 Top
event
Отправлено: 03 Мая, 2014 - 18:03:39
Post Id


Частый посетитель


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


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




Panoptik, извините попутал, но и этот li заменил на option.

Вот такой код:
PHP:
скопировать код в буфер обмена
  1. $result = $mysqli->query("SELECT * FROM categories_old");
  2. //Если в базе данных есть записи, формируем массив
  3. if   ($result->num_rows > 0){
  4.     $cats = array();
  5. //В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
  6.     while($cat =  $result->fetch_assoc()){
  7.         $cats_ID[$cat['id']][] = $cat;
  8.         $cats[$cat['parent_id']][$cat['id']] =  $cat;
  9.     }
  10. }
  11.  
  12. function build_tree($cats,$parent_id,$only_parent = false){
  13.     if(is_array($cats) and isset($cats[$parent_id])){
  14.         $tree = '<select>';
  15.         if($only_parent==false){
  16.             foreach($cats[$parent_id] as $cat){
  17.                 $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  18.                 $tree .=  build_tree($cats,$cat['id']);
  19.                 $tree .= '</option>';
  20.             }
  21.         }elseif(is_numeric($only_parent)){
  22.             $cat = $cats[$parent_id][$only_parent];
  23.             $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  24.             $tree .=  build_tree($cats,$cat['id']);
  25.             $tree .= '</option>';
  26.         }
  27.         $tree .= '</select>';
  28.     }
  29.     else return null;
  30.     return $tree;
  31. }
  32.  
  33. echo build_tree($cats,0);


Вот такой результат:

А должно быть все в одном открывающем списке.
(Добавление)
Помогите пожалуйста. Ниндзя
 
 Top
Panoptik
Отправлено: 03 Мая, 2014 - 19:38:10
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




ну вынесите теги <select> за пределы функции, она же у вас вызывается рекурсивно и будет вам счастье
PHP:
скопировать код в буфер обмена
  1. function build_tree($cats,$parent_id,$only_parent = false){
  2.     if(is_array($cats) and isset($cats[$parent_id])){
  3.         $tree = '';
  4.         if($only_parent==false){
  5.             foreach($cats[$parent_id] as $cat){
  6.                 $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  7.                 $tree .=  build_tree($cats,$cat['id']);
  8.                 $tree .= '</option>';
  9.             }
  10.         }elseif(is_numeric($only_parent)){
  11.             $cat = $cats[$parent_id][$only_parent];
  12.             $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  13.             $tree .=  build_tree($cats,$cat['id']);
  14.             $tree .= '</option>';
  15.         }
  16.     }
  17.     else return null;
  18.     return $tree;
  19. }
  20. echo '<select>';
  21. echo build_tree($cats,0);
  22. echo '</select>';

решение конечно не сильно красивое, но должно работать


-----
Just do it
 
 Top
event
Отправлено: 03 Мая, 2014 - 19:50:51
Post Id


Частый посетитель


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


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




Panoptik, спасибо.

А как еще просить к option - style="font-weight: bold;", но только к тем у кого parent_id = 0

А то я пробую прописывать, а он всем подряд прописывает его.

Заранее спасибо!
 
 Top
Panoptik
Отправлено: 03 Мая, 2014 - 20:00:02
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




так нельзя
event пишет:
А как еще просить к option - style="font-weight: bold;", но только к тем у кого parent_id = 0

есть вариант добавить в список optgroup http://htmlbook[dot]ru/html/optgroup это в случае если у вас двухуровневый список (не более) и первый из уровней не сможет быть выбранным
в остальных случаях нужно отказываться от select и использовать кастомизацию списка при помощью сss и js (например застилить при помощи изначальных тегов ul(li))


-----
Just do it
 
 Top
event
Отправлено: 03 Мая, 2014 - 22:38:05
Post Id


Частый посетитель


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


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




Panoptik, как раз, то что мне надо, описано в первом случае. Как можно это по правильному сделать, а то у меня чего-то не получается, криво выходит.
(Добавление)
Пробую вот так:
PHP:
скопировать код в буфер обмена
  1.     function build_tree($cats,$parent_id,$only_parent = false){
  2.         if(is_array($cats) and isset($cats[$parent_id])){
  3.             $tree = '';
  4.             if($only_parent==false){
  5.                 foreach($cats[$parent_id] as $cat){
  6.                     $tree .= '<optgroup label="' . $cat['name'] .'"><option>'.$cat['name'];
  7.                     $tree .=  build_tree($cats,$cat['id']);
  8.                     $tree .= '</option>  </optgroup>';
  9.                 }
  10.             }elseif(is_numeric($only_parent)){
  11.                 $cat = $cats[$parent_id][$only_parent];
  12.                 $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  13.                 $tree .=  build_tree($cats,$cat['id']);
  14.                 $tree .= '</option>';
  15.             }
  16.         }
  17.         else return null;
  18.         return $tree;
  19.     }
  20.     echo '<select>';
  21.     echo build_tree($cats, 0);
  22.     echo '</select>';




Но как видите, коряво выходит... Однако Однако Однако
 
 Top
Panoptik
Отправлено: 04 Мая, 2014 - 00:23:33
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




нужно убрать опшн внутри оптгруп
PHP:
скопировать код в буфер обмена
  1. function build_tree($cats,$parent_id,$only_parent = false){
  2.         if(is_array($cats) and isset($cats[$parent_id])){
  3.             $tree = '';
  4.             if($only_parent==false){
  5.                 foreach($cats[$parent_id] as $cat){
  6.                     $tree .= '<optgroup label="' . $cat['name'] .'">';
  7.                     $tree .=  build_tree($cats,$cat['id']);
  8.                     $tree .= '</optgroup>';
  9.                 }
  10.             }elseif(is_numeric($only_parent)){
  11.                 $cat = $cats[$parent_id][$only_parent];
  12.                 $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  13.                 $tree .=  build_tree($cats,$cat['id']);
  14.                 $tree .= '</option>';
  15.             }
  16.         }
  17.         else return null;
  18.         return $tree;
  19.     }
  20.     echo '<select>';
  21.     echo build_tree($cats, 0);
  22.     echo '</select>';


-----
Just do it
 
 Top
event
Отправлено: 04 Мая, 2014 - 01:05:08
Post Id


Частый посетитель


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


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




Panoptik, в таком случае оно вот так получается: Огорчение Огорчение Огорчение

 
 Top
event
Отправлено: 04 Мая, 2014 - 10:58:45
Post Id


Частый посетитель


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


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




Помогите пожалуйста. Растерялся
 
 Top
Panoptik
Отправлено: 04 Мая, 2014 - 12:11:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




включайте наконец мозг и учитесь самостоятельно решать свои проблемы
PHP:
скопировать код в буфер обмена
  1.  
  2. function build_tree($cats,$parent_id,$only_parent = false){
  3.         if(is_array($cats) and isset($cats[$parent_id])){
  4.             $tree = '';
  5.             if($only_parent==false){
  6.                 foreach($cats[$parent_id] as $cat){
  7.                     $tree .= '<optgroup label="' . $cat['name'] .'">';
  8.                     $tree .=  build_tree($cats,$cat['id'],$cat['id']);
  9.                     $tree .= '</optgroup>';
  10.                 }
  11.             }elseif(is_numeric($only_parent)){
  12.                 $cat = $cats[$parent_id][$only_parent];
  13.                 $tree .= '<option>'.$cat['name'].' #'.$cat['id'];
  14.                 $tree .=  build_tree($cats,$cat['id']);
  15.                 $tree .= '</option>';
  16.             }
  17.         }
  18.         else return null;
  19.         return $tree;
  20.     }
  21.     echo '<select>';
  22.     echo build_tree($cats, 0);
  23.     echo '</select>';


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


-----
Just do it
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB