Диалоги
Материал из Eludia.
В первых версиях интерфейсы 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-код, исполнимый в контексте страницы.

