Диалоги

Материал из Eludia
Перейти к: навигация, поиск
Dialog.gif

В первых версиях интерфейсы Eludia были строго одноэкранными, причём делалось всё для того, чтобы максимально воспроизвести usability DOS-приложений. Это не шутка. С определённой точки зрения, алфавитно-цифровой ГИП гораздо лучше оконного графического. Во всяком случае, для реализации рутинных операций он заметно удобнее и не вызывает лишних вопросов у пользователя. Тем не менее, жизнь берёт своё, и нам приходится всё больше использовать всплывающие окна. Для модальных диалогов в Eludia предусмотрен несложный API.

Допустим, нам требуется показать определённый экран в модальном всплывающем окне, а по итогам его работы исполнить некий скрипт в текущем окне.

Экран диалога

Прежде всего, разрабатываем форму, как обычно (get_item / draw_item).

Далее в draw_item переопределяем кнопку Esc:

	esc => 'javaScript:window.close()',

Теперь нажатие Esc просто закрывает окно. Нажатие Ctrl-Enter в конечном счёте должно приводить к тому же, но с дополнительным эффектом: надо произвести действие, а потом дать знать вызывающей стороне, что оно состоялось. Условимся, что это будет определяться как значение 'ctrl_enter' поля result результата операции. Чтобы передать такую структуру данных, достаточно вызвать

	dialog_close ({what_s_pressed => 'ctrl_enter'});

в конце do_update. Функция dialog_close, по аналогии с redirect и esc, самостоятельно формирует ответ и устанавливает $_REQUEST {__response_sent}.

Вызов окна

Теперь — то, с чего, возможно, стоило бы начать: как открывать окно. Для этого предусмотрена функция dialog_open. У неё на выходе получается строка, начинающаяся с 'javaScript:', она предназначена для подстановки в href. Сам скрипт вызывает (showmodaldialog) статический файл /i/_skins/$_SKIN/dialog.html, который, в свою очередь, загружает себе в iframe переданный ему URL (такой фокус понадобился, чтобы избежать статичности диалогов).

	href => dialog_open ({
					
		title => 'Окошко',
					
		href => "/?type=win&id=$$data{id}",
						
	}, {width => 800, height => 600}) . ' alert (result.what_s_pressed); void (0)',

Обратим внимание на приписку в хвост скрипта: это та самая обработка результата, о которой говорилось выше.

Однако, скорее всего, вам не придётся вызвать dialog_open напрямую, поскольку гораздо удобнее воспользоваться универсальной обработкой ссылок и просто указать опцию dialog рядом с href:

	draw_cells ({
		bgcolor => $i -> {bgcolor},
		href    => "/?type=dmnds_pays&action=create&id_dmnd=$i->{id}",
		dialog  => {
			title  => 'Платёж',
#			after  => 'alert (result.what_s_pressed)',
			after  => '_reload (result)',
			options => {
				width  => 600,
				height => 200,
			},
		}
							
	},

Опция after — это постобработка результата. 'void (0)' к ней приписывается автоматически.

Используемая здесь функция _reload в API не определена, её исходный текст необходимо разработать самостоятельно и приписать к $_REQUEST {__script}. Впрочем, содержимым after может быть произвольный js-код, исполнимый в контексте страницы.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Разработчику
Администратору
Инструменты