Комбобокс - это элемент разметки. Выглядит как выпадающий список с возможностью вписать свое значение, если ничего из списка не подошло.
Как реализовать такой функционал лучше всего? Как сохранять в базу новые значение?
Я вижу несколько реализаций, но, как мне кажется, ни одна из них не идеальна.
Первый вариант: "2 поля".
Нужно выбрать цвет при создании нового товара для каталога. Есть 2 таблицы "Товары" и "Цвета". У товара есть поле "ID цвета" и "Другой цвет". В форме создания товара, по сути, 2 поля - одно позволяет выбрать цвет из списка и сохранить его ID, второй поле просто текстовое, позволяет ввести свой цвет, если нужного цвета в списке нет, и сохранить его в "Другой цвет".
Такой способ требует проверки, чтобы у товара был либо указан ID, либо вписан другой цвет.
Второй вариант: "Автоподстановка".
Все тоже самое, только у товара всего одно текстовое поле "Цвет". Выпадающий список просто заполняет это поле. Даже после выбора можно редактировать содержимое, ничего не сломается. Выбор сохраниться в товаре как текст (например, содержимое поля будет "Синий").
При таком способе будет (почти) невозможно отфильтровать товары по цвету. Но этот вариант годится, например, для чата или техподдержки, чтобы выбирать стандартные ответы.
Третий вариант: "Создание на лету".
Если мы ввели в поле такой вариант, которого нет в списке, то он автоматически добавится в таблицу. Соответсвенно для нашего примера, в таблице товаров будет только одно поле — "ID цвета".
В этом способе, после активного использования, в выпадающем списке будет куча хлама, опечаток, ошибочных записей и тп. Но можно добавленные на лету записи выводить только после модерации. В общем, это самый крутой вариант, но самый сложный.
Может быть есть варианты лучше или проще?
И кстати, если у вашего варианта есть html-реализация (плагин, например), буду рад увидеть.
К mysql данный вопрос имеет странное отношение, особенно с учётом просьбы примера в html...
Механизма на самом деле всего три.
1. Любой пользователь может вносить новые значения.
2. Только отдельные люди могут редактировать список добавляя или удаляя значения.
3. Никто не может его изменить, только выбрать из существующих.
Выбор конкретного варианта зависит скорее от бизнеспроцесса.
То есть, если все пользователи это исключительно сотрудники и их немного, то можно им разрешить работать по п.1
Если пользователей много (десятки, сотни, тысячи), то с большой вероятностью лучше п.2, когда лишь ограниченный круг ответственных лиц имеет право на корректировку.
Пункт 3 полезен для тех случаев, когда пользователи системы не являются ответственными лицами для принятия решений и/или их очень много, а отдельно за данными никто не следит. В этом случае лучше ограничить доступное подмножество вариантов выбора, как раз для избегания мусора и бардака в данных.
Во всех трех случаях данные такого вида нужно хранить в отдельной таблице и строить связи с другими по ID характеристики.
Плюс рекомендую учесть возможность пометить их как удалённый при этом не удаляя физически из БД, чтобы не выводить в списке вариантов выбора для пользователей, но при этом иметь адекватный вид в архивах прошлых операций, когда эти данные можно было выбирать.
Спасибо за подробный ответ. Но вы покрыли не все варианты. Скажите, как быть, если новые значения вносить в список нельзя, но нужно иметь возможность вписать в поле свое значение (хоть оно и не появится в списке)? Или отказаться от такого варианта совсем?
Сергей: все так же. Значение в список таки вписывается и сохраняется, но сразу с атрибутом "удалён"/"не отображать" (разницы между ними для общего случая нет). То есть в базе оно есть обязательно с ID, но в списке для других пользователей не выводится.
Будет определенная сложность с поиском и фильтрацией по таким значениям, если пользователи забьют "чёрный, черн., чорный". В этом случае придётся организовать полнотекстовый поиск и/или словари синонимов/ошибок...
Fortop: Спасибо, этот вариант лучше, чем мой "Третий", хоть и смысл тот же. Сюда (при определенной степени доверия к пользователю), можно даже прикрутить систему, которая будет варианты, которые встречаются у нескольких юзеров, добавлять в общий список. Вот только в этом случае встает вопрос - что делать со всеми клонами? Менять все ID цветов (во всех местах использования) на тот, что выбран как образец, а все цвета-клоны удалять? Но это уже другая тема для обсуждения.