| Новости | 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-код, специфичный для поля заданного типа.