Предлагаю вашему вниманию самописный класс-компонент селектора.
Все наверное хоть раз в жизни сталкивались с таким элементом управления как два мультиселекта с рядом кнопок между ними для перемещения элементов из одного в другой. Лично мне понадобилась такая приблуда при кодинге админчасти одного из проектов для выбора вариантов из некоторого множества существующих.
Всегдашнее желание сделать все «по уму» оформилось в конечном счете в класс работа с которым чрезвычайна проста: создать экземпляр класса, выбрать подходящий метод генерации «компонента» и передать ему нужные данные.
Итак, класс
selector:
методы:
- selector – конструктор, означивает свойства класса (шаблоны под составные части компонента)
- createSelector – основной метод генерации «компонента» из шаблонов и переданных данных, не следует вызывать его напрямую, метод сугубо внутренний, рабочий.
- getSelector – метод, возвращающий код составных частей «компонента» в ассоциативном массиве array('sLeft' => 'html код левого селекта', 'sRight' => ' html код правого селекта ', 'buttons' => 'html код кнопок между селектами', 'JS' => 'JS код выполняющий перемещения опций селектов', 'full' => 'полный код компонента').
- newSelector – метод, работающий аналогично getSelector, но возвращающий код «компонента» в свойство html класса с такими же именами ключей.
- convertToItems – ввиду того, что данные необходимо подавать сборщику «компонента» в особом формате, сделан метод-конвертер на вход которому передаются два ассоциативных массива с данными для левого и правого селектов соответственно и три строковых параметра которые хранят значения ключей которые нужно преобразовать в необходимые для подачи массива данных сборщику.
свойства:
- $html – метод newSelector будет класть код именно в это свойство
- $tmpl – массив шаблонов элементов «компонента»
константы:
- SELECTOR_IMG_DIR – т.к. кнопки сделаны картинками, то константа должна указывать на директорию с оными.
Логика: Необходимо дать посетителю возможность выбора опций из имеющихся, а после отправки формы обработать выбор. Пусть мы сделали выборку из БД, чаще всего это массив (большие объемы данных обычно разбивают на страницы). Пусть он будет следующего вида
$left =
array('id' =>
string,
'nick' =>
string). Смысл данных этого массива следующий – есть из чего выбирать: эти-то данные и будут помещены в левый селектор. Данные выборки необходимо преобразовать к виду
array(array('caption' =>
string,
'value' =>
string,[
'class' =>
string]
), …
), для чего вызываем метод
convertToItems($left,
array(),
'nick',
'id') который вернет массив готовый для передачи сборщику компонента передав ему кроме данных еще и имя переменной
name по которой будут доступны результаты выбора. После того как форма будет отправлена, в нашем распоряжении будут массивы
nameAvailable и
nameSelected которые в сумме (оператор
+ над массивами) дадут все возможные варианты для выбора при необходимости.
Почему код по частям: дизайн всегда разный, кто-то захочет сделать «компонент» не горизонтальным, а вертикальным, кто-то вообще разбросать по всей странице. Создаем новый селектор и по частям выводим куда надо. JavaScript-код будет выводиться один раз на страницу, но если необходимо получить его еще раз, для этого есть в методах сборки параметр
bool $forceJS. Когда нет необходимости в изощренном виде «компонента» просто выводим содержимое по ключу
'full' (вид близкий к обычному виду windows контрола).
В архиве класс + файл примера в котором после отправки формы выводится содержимое массивов выбранных элементов и остаток доступных для выбора (внимание: после отправки формы данные в «компоненте» неактуальные из-за отсутствия перезаписи данных относительно массива
$_POST)