Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Pavel Titov 08.07.2006 22:23 / 08.07.2006 22:34
По мере увеличения количества объектов появляется желание избежать ручного труда при создании интерфейсов добавления/изменения экземпляров этих объектов, хранимых в базе данных.@describe[] # field - название поля # type - string, text, int, double, date, sqldate, название другого класса (в этом случае можно # вызвать ^другой_класс::load[значение_поля] и получить объект) # Допускается несколько типов через запятую. # title - человеческое название поля # null - может быть пустым # comment - комментарий # conventions - инструкция по заполнению $result[^table::create{field type title null comment conventions supplier company Поставщик yes owner company,person Владелец name text Наименование <a href="/conventions/hardware/name.htm">инструкция по заполнению</a> buyed sqldate Дата покупки warranty sqldate Гарантийный срок serial string Серийный номер yes comments string Примечание computer servers Установлено в yes storage_company company Передано на хранение yes storage_document string на основании yes}]И сделал класс с методом, формирующий форму редактирования (осторожно, некрасивый код):
@showform[data;description][field;classes;fieldshown] Отображение формы редактирования объекта ^description.menu{ $field[$description.field] <tr><td class="caption">$description.title ^if(def $description.conventions){<br />$description.conventions} </td> <td> ^switch[$description.type]{ ^case[string;int;sqldate]{ <input name="$field" value="$data.$field" /> } ^case[text]{ <textarea style="width:100%" name="$field">$data.$field</textarea> } ^case[DEFAULT]{ ^rem{ *** вероятно, это поле пользовательского класса *** } $classes[^description.type.split[,]] $fieldshown(0) ^rem{ *** если класс только один или у нас есть значение, то все просто *** } ^if(^classes.count[] == 1 || def $data.$field){ ^classes.menu{ ^try{ ^editables:input[$classes.piece;$field;$data.$field] $fieldshown(1) }{ ^if($exception.type eq editables.badclass){ ^rem{ *** нельзя такой класс редактировать *** } <strong>Неизвестный тип параметра $classes.piece</strong> $exception.handled(1) } } } }{ ^rem{ *** в противном случае нужно сначала предложить сделать выбор класса *** } ^if(!def "$form:class$field"){ <select name="class$field"> ^classes.menu{ <option>$classes.piece</option> } </select> <input type="submit" name="setClass" value="..." /> }{ $form:class$field <input type="hidden" name="class$field" value="$form:class$field" /> ^editables:input[$form:class$field;$field;$data.$field] } $fieldshown(1) } ^if($fieldshown == 0){ <input name="$description.field" value="$data.$field" /> } } } </td> </tr> }^editables:input - вызывает метод input класса, соответствующего полю заданного нестандартного типа, имя которого передается первым параметром, а уже этот метод формирует html-код, специфичный для поля заданного типа.