Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: Делимся опытом
Показать сообщение отдельно

Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip selector.zip
(5.2 Kb, 9 просмотров)

Предлагаю вашему вниманию самописный класс-компонент селектора.
Все наверное хоть раз в жизни сталкивались с таким элементом управления как два мультиселекта с рядом кнопок между ними для перемещения элементов из одного в другой. Лично мне понадобилась такая приблуда при кодинге админчасти одного из проектов для выбора вариантов из некоторого множества существующих.
Всегдашнее желание сделать все «по уму» оформилось в конечном счете в класс работа с которым чрезвычайна проста: создать экземпляр класса, выбрать подходящий метод генерации «компонента» и передать ему нужные данные.

Итак, класс 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)

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 16:13, 25-08-2005 | #25

Название темы: Делимся опытом