Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как запретить выбор опции по ID (https://javascript.ru/forum/misc/60511-kak-zapretit-vybor-opcii-po-id.html)

laimas 05.01.2016 12:15

Какая разница кто эти списки будет готовить?
Вот как понять "опции уже в базе"? Если код списков готовятся, значит нет никаких опций в базе, есть данные для них, и вам не опции запрещать надо, а описать группу в списке, а делается это тем, на что я давал ссылку - ознакомились?
А для того чтобы это сделать, нужно соответствующие этому данные получить, структуру их, а дальше уже копейки.

Alex921 07.01.2016 03:55

laimas, Это для вас копейки, так как вы знаете что и как, а для меня ж*па...

laimas 07.01.2016 04:12

:D

Копейки, уверяю. Я не знаю как делается запрос на сервере и что возвращает, но принцип должен быть следующим - запрос должен возвращать записи, которые отсортированы по родителю. Вот пример, где объект, это возвращенный сервером запрос в базу. name_group - это имя группы (в ответе может быть и id группы, если нужен, в дальнейшем можно и по нему расклад делать, но это не столь важно), два остальных параметра, это параметры опций.

Ну и собственно само построение списка:

<html> 
<head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
var s = [
    {
        name_group : 'name 1',
        id_option : 2,
        name_option : 'option 1'
    },
    {
        name_group : 'name 1',
        id_option : 3,
        name_option : 'option 2'
    },
    {
        name_group : 'name 1',
        id_option : 4,
        name_option : 'option 3'
    },
    {
        name_group : 'name 2',
        id_option : 5,
        name_option : 'option 4'
    },
    {
        name_group : 'name 2',
        id_option : 6,
        name_option : 'option 5'
    },
    {
        name_group : 'name 2',
        id_option : 7,
        name_option : 'option 6'
    }
], sel, grp, name; 
$(function() {
    sel = $('<select/>').appendTo('body');
    $.each(s, function() {
        if(this.name_group != name) {
            name = this.name_group;
            grp = $('<optgroup label="'+name+'"/>').appendTo(sel);
        }
        grp.append('<option value="'+this.id_option+'">'+this.name_option+'</option>')
        
    });
});
</script>     
</head> 
<body>
</body> 
</html>


Здесь работа с DOM, правда в среде jQuery, собственно и просто на JS будет тоже самое, суть, ну чуть больше строк кода будет.

Ваш же код подготавливает строку описывающую html-код списка, и так же нужно было бы поступать и на сервере. И если поступать так, то чуть изменится суть, но принцип будет тот же. Сперва в строку открывающие теги списка и группы, а далее сравнение переменной с текущей группой, и если не равно, то присвоить ей текущую группы, и добавить в строку закрывающий и открывающий теги группы. А теги опций последовательно после условия. После цикла закрывающий тег группы и списка.

Это разве сложно? :)

Alex921 08.01.2016 00:28

Спасибо за ваш труд, но я по вашему не сделаю так как банально сойду с ума))) Там три страны, и в каждой области есть города, в каждом городе есть районы и пригороды)) Там их столько что даже страшно представить...
А вот как список строится в базе

Район
&nbsp;&nbsp;&nbsp;&nbsp;район 1
&nbsp;&nbsp;&nbsp;&nbsp;район2
&nbsp;&nbsp;&nbsp;&nbsp;район 3
Пригород
&nbsp;&nbsp;&nbsp;&nbsp;пригород 1
&nbsp;&nbsp;&nbsp;&nbsp;пригород 2
&nbsp;&nbsp;&nbsp;&nbsp;пригород 3
Район и Пригород это тоже самое что и (район 1 или пригород 1...)

И
Пригород имеет id_value в таблице cat_board_listv
И
Район имеет id_value в таблице cat_board_listv

То есть, все в куче, слезы на глазах, и сожаление что подписался на это все...
Вот и хочется как-то через id_value заблокировать выбор, или может к каждому "району" и "пригороду" приписать что-то в базе что бы нельзя было выбрать...?

laimas 08.01.2016 07:03

Думаю, что вам не придет в голову вывалить один список включающий в себя все страны, в них города, а в них районы и пригороды. Такие вещи выводятся связанными списками, последовательно, а значит это не есть условие, которое не позволяет решить данную задачу. SQL же и РНР как то по барабану чего там в базе, первый будет отдавать то что просят, второй выводить что получено согласно сценария. То есть это тоже не есть проблема.
А вот если списки хранятся в базе действительно так:


Район
&nbsp;&nbsp;&nbsp;&nbsp;район 1
&nbsp;&nbsp;&nbsp;&nbsp;район2
&nbsp;&nbsp;&nbsp;&nbsp;район 3
Пригород
&nbsp;&nbsp;&nbsp;&nbsp;пригород 1
&nbsp;&nbsp;&nbsp;&nbsp;пригород 2
&nbsp;&nbsp;&nbsp;&nbsp;пригород 3
Район и Пригород это тоже самое что и (район 1 или пригород 1...)

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

Пока в базе не будет наведен порядок, и говорить о чем-то нет смысла.

Alex921 09.01.2016 13:21

а разве нельзя сделать как-то так, что бы через скрипт блокировать?
Типа, скрипт находит id опции и приписывает к ней disabled?

laimas 09.01.2016 14:18

И каким образом это можно сделать, если Район и Пригород это тоже самое что и (район 1 или пригород 1...)? Конечно можно и повыпендриваться условием и подогнать под нужное, но во-первых, и не впервой повторяется, что нужно не блокировать, а выделить группы. А во-вторых нужно иметь порядок в базе, а не колотить костыли в код.

Цитата:

Сообщение от Alex921
Район и Пригород это тоже самое что и (район 1 или пригород 1...)
И
Пригород имеет id_value в таблице cat_board_listv
И
Район имеет id_value в таблице cat_board_listv

Может все таки не строкой в базе се описано, коли есть идентификаторы и "одно и тоже", а просто вы не можете пояснить толково что имеется в базе?

Данные в базе должны быть структурированы, и коли речь о странах, городах и их районах, то - есть таблица стран, есть таблица городов и есть таблица районов. Таблицы связаны по первичному ключу. Таблица районов (в примере table_district) содержит поле собственного идентификатора, идентификатор города, которому принадлежит район. Связь города со страной осуществляется по таблице городов. Принадлежность к пригороду или району нужно определять не идентификатором записи, а полем типа SET с двумя значениями.

Дамп таблицы:

Код:

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

CREATE TABLE IF NOT EXISTS `table_district` (
  `id_district` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Иентификатор района',
  `id_city` int(11) NOT NULL COMMENT 'Идентификатор города',
  `name` varchar(150) NOT NULL COMMENT 'Наименование района'',
  `district` set('Пригород','Район') NOT NULL COMMENT 'Район/Пригород',
  PRIMARY KEY (`id_district`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;

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

INSERT INTO `tmp` (`id_district`, `id_city`, `name`, `district`) VALUES
(8, 2, 'Имя 1', 'Пригород'),
(9, 1, 'Имя2', 'Район'),
(10, 2, 'Имя 3', 'Район'),
(11, 2, 'Имя 4', 'Район'),
(12, 2, 'Имя 5', 'Пригород'),
(13, 2, 'Имя 6', 'Пригород');

Пусть запрашиваются районы/пригороды города с ID=2:

$q = mysql_query('SELECT id_district, name, district FROM table_district WHERE id_city=2 ORDER BY district');
while($r = mysql_fetch_assoc($q)) $json[] = $r;

exit(json_encode($json, JSON_UNESCAPED_UNICODE));


Клиент получит JSON:

Код:

[
    {"id_district":"8","name":"Имя 1","district":"Пригород"},
    {"id_district":"12","name":"Имя 5","district":"Пригород"},
    {"id_district":"13","name":"Имя 6","district":"Пригород"},
    {"id_district":"10","name":"Имя 3","district":"Район"},
    {"id_district":"11","name":"Имя 4","district":"Район"}
]

Как построить список показывалось.

Alex921 10.01.2016 05:14

laimas,
Я действительно тупо объяснил, попробую по другому, не будем рассматривать районы и пригороды как таковые.
Возьмем другие значения
Имеем select Утюги
Опций для построение списка для "Утюги"
Тип подошвы (id=1)
&nbsp;&nbsp;&nbsp;&nbsp;тип 1 (id=2)
&nbsp;&nbsp;&nbsp;&nbsp;тип 2 (id=3)
&nbsp;&nbsp;&nbsp;&nbsp;тип 3 (id=4)
Материал корпуса (id=5)
&nbsp;&nbsp;&nbsp;&nbsp;Материал 1 (id=6)
&nbsp;&nbsp;&nbsp;&nbsp;Материал 2 (id=7)
&nbsp;&nbsp;&nbsp;&nbsp;Материал 3 (id=8)
Задача таже: запретить выбор в списке "Тип подошвы" и "Материал корпуса" все остальное выбирать в списке можно...
Разделять список на "Тип подошвы" и "Материал корпуса" нельзя, так как там такое кол-во этих свойств что просто ужас...
P.S. Благодарю за то что не забили...

laimas 10.01.2016 10:56

Вы что издеваетесь? Как можно запретить некий ID, а остальные пожалуйста?

Приведенное выше, это характеристики товара, а их не содержат в одном поле поле таблицы, это значит, что каждая группа характеристик, это свой уникальный ключ. Дальше пояснять?


Часовой пояс GMT +3, время: 07:32.