Показать сообщение отдельно
  #13 (permalink)  
Старый 18.09.2016, 11:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Если нужно выбрать значения этих свойств, то серверу в конечном итоге необходимо получить только результат выбора значений, самого списка свойств, а тем более кучи их дубликатов (по числу выбранных значений) совсем не требуется.

И так, пусть есть свойства в базе под ID 11, 22, 33, 44, и связанными с ними по этому ключу значениями. В примере это описано объектом.

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

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script> 
var lst = {
    '11' : {'111' : 'Aa', '112' : 'Ab', '113' : 'Ac'},
    '22' : {'221' : 'Ba', '222' : 'Bb', '223' : 'Bc'},
    '33' : {'331' : 'Ca', '332' : 'Cb', '333' : 'Cc'},
    '44' : {'441' : 'Da', '442' : 'Db', '443' : 'Dc'}    
};

$(function() {
    $('#chc').change(function() {
        if(this.length==2) $(this).remove();
        if(this.value) {
           var i = $(this).find(':selected');  
           $('#opt').append( '<label>Своство '+i.text()+
                             '</label><select name="opt['+this.value+']"><option value="">Выберите значение...</option>' + 
                    $.map(lst[this.value], function(v, k) {
                        return '<option value="' + k + '">' + v + '</option>'
           }).join() + '</select>');
           i.remove()
        }
    })
});
</script>     
</head> 

<body>
<select id="chc">
    <option value="">Выберите свойство...</option>
    <option value="11">A</option>
    <option value="22">B</option>
    <option value="33">C</option>
    <option value="44">D</option>
</select>

<div id="opt"></div>
</body> 
</html>


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

Последний раз редактировалось laimas, 18.09.2016 в 12:18.
Ответить с цитированием