• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Модальные Диалоги

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Всем привет!
Вот действительно насущная задача... как организовать диалог при помощи Extention Library, который будет ожидать реакции пользователя?
Т.е. не станет выполнять код, следующий после вызова диалога.

Просто хочется использовать один Custom Control диалога для всех страниц, а не хардкодить постоянно.
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
Я вот сделал так. И работает без ExtLib.
Создал custom control "dialogSelect". В нем:
Код:
<xp:this.resources>
<xp:dojoModule name="dijit.Dialog"></xp:dojoModule>
</xp:this.resources>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[XSP.addOnLoad(function(){dialog_create("dialogSelect","Выберите")})]]></xp:this.value>
</xp:scriptBlock>
<div id="dialogSelect" style="display:none" class="lotusDialogWrapper">
// сама форма
</div>

Создал еще custom control "SubForm" с кнопкой.
Код:
<xp:button id="button1" value="ВызватьДиалог">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[dijit.byId("dialogSelect").show()]]></xp:this.script>
</xp:eventHandler>
</xp:button>

Теперь везде вставляю "SubForm" и всё.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Я вот сделал так. И работает без ExtLib.
Создал custom control "dialogSelect". В нем:
Код:
<xp:this.resources>
<xp:dojoModule name="dijit.Dialog"></xp:dojoModule>
</xp:this.resources>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[XSP.addOnLoad(function(){dialog_create("dialogSelect","Выберите")})]]></xp:this.value>
</xp:scriptBlock>
<div id="dialogSelect" style="display:none" class="lotusDialogWrapper">
// сама форма
</div>

Создал еще custom control "SubForm" с кнопкой.
Код:
<xp:button id="button1" value="ВызватьДиалог">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[dijit.byId("dialogSelect").show()]]></xp:this.script>
</xp:eventHandler>
</xp:button>

Теперь везде вставляю "SubForm" и всё.
Покажи код вызова этого диалога. Больше чем уверен, что все закачивается dialog.show()
А всю остальную обработку ты ведешь именно в диалоге.
Такое мне не подходит

Проблема таких диалогов - они не ждут реакции пользователя
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
Покажи код вызова этого диалога. Больше чем уверен, что все закачивается dialog.show()
А всю остальную обработку ты ведешь именно в диалоге.
Такое мне не подходит

Проблема таких диалогов - они не ждут реакции пользователя
Да, кнопка с show(). А что они делают? Получается модальное окно в котором есть, например, две кнопки "ОК" "Отмена" и юзер никуда из него не денется. Или хочется модальное окно для всего браузера?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Хочется чтоб после dialog.show() код не выполнялся, пока пользователь не нажмет кнопочку по аналогии с LotusScript
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Сегодня малость поигрался. Удалось организовать подобие.
Что сделал... На основной странице форма документа и кнопка "Сохранить" (Submit)
В диалоге 2 кнопки Ок (Submit) и Cancel (Button). На обеих один обработчик function DialogRresult( key: int ), где key - код кнопки по аналогии с MessageBox LS. В этой процедуре обрабатываю что нажал пользователь в диалоге и собственно дальнейшую обработку документа.
В кнопке "Сохранить" - первичная проверка документа и вызов диалога и отмена Submit:
<!--shcode--><pre><code class='js'>if(getComponent("untitled1").value != "" ){
MessageBox( "Сохранить?", 1, 32, "TEST");
false
}[/CODE]
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
Подойдет, но немного допилить. Если результаты диалога надо записывать в разные поля (диалог универсальный), то обработчик надо расширить параметрами.
Код:
function DialogRresult ( key, typesave ) {
if (key==1) {
if (typesave=="Fields1") {
doc.replaceItemValue("Field1", "1");
doc.replaceItemValue("Field1_1", "1_1")
} else if (typesave=="Fields2") {
doc.replaceItemValue("Field2", "2");
doc.replaceItemValue("Field2_1", "2_1")
}
} else if (key==2) {
// ...
}
}
В документе на кнопке 1 пишем:
Код:
(Server)
viewScope.typesave="Fields1"
(Client)
dijit.byId("dialog1").show()

В документе на кнопке 2 пишем:
Код:
(Server)
viewScope.typesave="Fields2"
(Client)
[code]dijit.byId("dialog1").show()

В диалоге на кнопке 1:
Код:
DialogRresult( 1, viewScope.typesave)
На кнопке 2:
Код:
DialogRresult( 2, viewScope.typesave)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Я не сохраняю результат.
Просто нужно знать действие пользователя
 
Z

Zeka

как организовать диалог при помощи Extention Library, который будет ожидать реакции пользователя?
Т.е. не станет выполнять код, следующий после вызова диалога.
Чего толкового сказать не могу, так просто поразглогольствую... :)
...в xPages другие принципы работы, неже ли в лотусе. Если ты будешь открывать диалок явой (SSJS) то твой код должен дойти до конца, что бы сервер смог построить всё дерево компонентов и вернуть html клиенту. Он не может "подвиснуть" где-то по середине и дождаться ответа клиента.

Если же ты открываешь диалог при помощи CSJS, то опять таки, код зависящий от ответа пользователя должен писаться не в следующих за dijit.byId("dialog1").show() строчках, а передоваться в допиленный диалог как callback function
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!