parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

О редактировании объектов

Pavel Titov 08.07.2006 22:23 / 08.07.2006 22:34

По мере увеличения количества объектов появляется желание избежать ручного труда при создании интерфейсов добавления/изменения экземпляров этих объектов, хранимых в базе данных.

Сам я додумался лишь до создания в каждом классе методов create/load/save и метода, содержащего описания свойств экземпляра объекта.
@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-код, специфичный для поля заданного типа.

Это даже более или менее работает, но меня беспокоит ощущение, что я изобретаю велосипед. Соответственно, интересует следующее:
1. А вдруг это кто-то уже делал на парсере намного лучше и красивее меня и готов поделиться опытом? Сходу поиском по форуму не нашел.
2. Но уж на других ОО-языках такое наверняка делали. По каким ключевым словам следует искать в Google?