• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

NickProstoNick

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

Просто хочется использовать один Custom Control диалога для всех страниц, а не хардкодить постоянно.
 
Я вот сделал так. И работает без 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" и всё.
 
Я вот сделал так. И работает без 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()
А всю остальную обработку ты ведешь именно в диалоге.
Такое мне не подходит

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

Проблема таких диалогов - они не ждут реакции пользователя
Да, кнопка с show(). А что они делают? Получается модальное окно в котором есть, например, две кнопки "ОК" "Отмена" и юзер никуда из него не денется. Или хочется модальное окно для всего браузера?
 
Хочется чтоб после dialog.show() код не выполнялся, пока пользователь не нажмет кнопочку по аналогии с LotusScript
 
Сегодня малость поигрался. Удалось организовать подобие.
Что сделал... На основной странице форма документа и кнопка "Сохранить" (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]
 
Подойдет, но немного допилить. Если результаты диалога надо записывать в разные поля (диалог универсальный), то обработчик надо расширить параметрами.
Код:
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)
 
Я не сохраняю результат.
Просто нужно знать действие пользователя
 
как организовать диалог при помощи Extention Library, который будет ожидать реакции пользователя?
Т.е. не станет выполнять код, следующий после вызова диалога.
Чего толкового сказать не могу, так просто поразглогольствую... :)
...в xPages другие принципы работы, неже ли в лотусе. Если ты будешь открывать диалок явой (SSJS) то твой код должен дойти до конца, что бы сервер смог построить всё дерево компонентов и вернуть html клиенту. Он не может "подвиснуть" где-то по середине и дождаться ответа клиента.

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Курс AD