В этой статье не пойдет речь о сложных вещах, а, скорей всего, о простых, но, которые забываются. Лично я, к проектам подхожу крайне редко, поскольку, однажды сделанное работает годами и через некоторое время уже не помнишь, чего же ты там написал. Для апологетов xPages есть специальная ветка, скажу только, что с помощью jQuery и на седьмом дизайнере 2009 года, вполне, можно создавать сайты любой сложности. А разговоры о смерти технологии Domino, вообще, пустые, покуда работают в интернетах CGI переменные, куки и волшебный Set ctx = ns.DocumentContext в Lotus Script (с). Коснемся немного общих вещей не связанных с jQuery, которые помогут новичками, и вспомнить тем, кто в теме. Итак, поехали...
1. Флажок доступа из WEB использовать JavaScript.
По умолчанию генерит на формах по которым создаются документы вот такой код и открывает паразитный тег form, о котором говорилось здесь Удаление автоматического тега <form action="">.
Уберите эту галочку 'использовать JavaScript '. Она не нужна. На документах по форме добавьте в код страницы
<script>$(function() { $('body > form').remove(); });</script>
и на form?open тоже это пригодиться, чтобы прибить
<form><p><input type="submit" value="Отправить"></form>
в конце страницы.
2. Помните, что страницы и формы дизайна могут быть открыты как page?open по имени или алиасу. Если проектируете форму для web и notes, обзывайте их как MainTopicWEB | MainTopic - только для WEB и алиас MainTopic только для Notes. Если page будет страница - откроется страница, если форма, то форма, если агент, то агент.
В этом примере по формам HomePage, MainTopic и Hand-Book создаются страницы сайта и формы имеют специальное поле SaveOptions="0", блокирующее создание по ?create и $V2AttachmentOptions="0", блокирующее показ аттачментов на вебе. По форме Feedback Anonymous может создавать документы, но дальше идёт проверка агентом по WQS и поле SaveOptions устанавливается в 1 или док сохраняется через .Save. В особенных случаях добавляйте поля влияющие на $Readers. Пример организации структуры базы
3. Внутри объекта задавайте тип содержимого для AJAX доступа. Пример страницы для вывода json ответа.
4. Если вам нужен доступ к полям Notes, то вместо страницы используйте форму, но открывайте ее как form?readform
Тогда AJAX доступ будет такой
5. Просто вызывайте агенты как agentname?open, но помните, что его имя не должно конфликтовать со страницей, формой или другим элементом дизайна ибо контейнер открывает по имени.
Где внутри Lotus Script
и json ответ
Можно не заморачиваться с классом WebSession() и писать просто
6. Для обработки в агенте контекста документа содержимого формы HTML, объявляйте Notes поля на форме или подформе и пишите их HTML алиас - сильно упростите себе жизнь, особенно там, где Notes поля не позволяют написать расширенный HTML5 и форму отправки можно будет разместить в любом месте страницы не открытой на редактирование. Контекст этой формы feedback?create обрабатывается по аналогии п.5, но с особенностями описанными в п.7. Без объявления Notes поля, например, контекст ctx.Type(0) будет пустой.
7. Документы создаются командой form?create, где в форме можно указать запуск агента по WQS и передать дальше управление на поле $$Return или вывести json в самом агенте. Но в агентах запускаемых по WQS формы не работает json ответ оформляемый как 'Print |Content-type: application/json; charset=utf-8| 'Вываливается Error 200. Оформляйте его как text/html
И обработка AJAX через JSON.parse
Может быть я что-то упустил, но у меня по-другому пункт 7 не заработал.
8. Если есть возможность писать код <script language="JavaScript" type="text/javascript"> в HTML - пишите, так как в специальных секциях подформ он может не работать, также как и на формах с $$ типа $$ReturnGeneralError.
9. Используйсте скрытое поле $$HTMLFrontMatter и пишите в нем "<!DOCTYPE html>" чтобы убить по умолчанию в заголовке сервера <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
10. Используйте последнюю версию jQuery jq:="<script src=\"
Если в эту ветку еще подтянутся старшие товарищи — будет только хорошо.
ps: И еще. Не используйте конструкции открытия view через $$ViewBody на формах типа $$ViewTemplate for Viewname. Просто не используйте. На вебе вы не избавитесь от парзитного <meta name="robots" content="noindex"> и Гугл вам об этом скажет. Создайте страницу и грузаните туда что хотите через $(id).load(url + " #content")
1. Флажок доступа из WEB использовать JavaScript.
По умолчанию генерит на формах по которым создаются документы вот такой код и открывает паразитный тег form, о котором говорилось здесь Удаление автоматического тега <form action="">.
Код:
<script language="JavaScript" type="text/javascript">
<!--
document._domino_target = "_self";
function _doClick(v, o, t, h) {
var form = document._Cart;
if (form.onsubmit) {
var retVal = form.onsubmit();
if (typeof retVal == "boolean" && retVal == false)
return false;
}
var target = document._domino_target;
if (o.href != null) {
if (o.target != null)
target = o.target;
} else {
if (t != null)
target = t;
}
form.target = target;
form.__Click.value = v;
if (h != null)
form.action += h;
form.submit();
return false;
}
// -->
</script>
Уберите эту галочку 'использовать JavaScript '. Она не нужна. На документах по форме добавьте в код страницы
<script>$(function() { $('body > form').remove(); });</script>
и на form?open тоже это пригодиться, чтобы прибить
<form><p><input type="submit" value="Отправить"></form>
в конце страницы.
2. Помните, что страницы и формы дизайна могут быть открыты как page?open по имени или алиасу. Если проектируете форму для web и notes, обзывайте их как MainTopicWEB | MainTopic - только для WEB и алиас MainTopic только для Notes. Если page будет страница - откроется страница, если форма, то форма, если агент, то агент.
В этом примере по формам HomePage, MainTopic и Hand-Book создаются страницы сайта и формы имеют специальное поле SaveOptions="0", блокирующее создание по ?create и $V2AttachmentOptions="0", блокирующее показ аттачментов на вебе. По форме Feedback Anonymous может создавать документы, но дальше идёт проверка агентом по WQS и поле SaveOptions устанавливается в 1 или док сохраняется через .Save. В особенных случаях добавляйте поля влияющие на $Readers. Пример организации структуры базы
Ссылка скрыта от гостей
.3. Внутри объекта задавайте тип содержимого для AJAX доступа. Пример страницы для вывода json ответа.
Код:
// Добавляем новый метод валидации checkEmail дополнительно к https://jqueryvalidation.org/
$.validator.addMethod("checkForbiddenEmail", (function() {
var isEmailValid;
isEmailValid = false;
var url = 'doLookup?open&email=' + $("#Email").val();
$.ajax({
cache: false,
url: url,
type: 'post',
datatype: "application/json",
async: false,
success: function(resp) {
//alert ($("#Email").val() +" "+resp.email);
if (resp.email === 'forbidden') {
isEmailValid = false;
} else {
isEmailValid = true;
}
}
});
return isEmailValid;
}), "");
4. Если вам нужен доступ к полям Notes, то вместо страницы используйте форму, но открывайте ее как form?readform
Тогда AJAX доступ будет такой
Код:
$.get(url+"?readform&cat="+cat+"&start=1&count="+onimod_viewstart+"&max="+onimod_viewcount)
.success( function(html){
$(id).hide().fadeIn().html(html); //Load content to id
5. Просто вызывайте агенты как agentname?open, но помните, что его имя не должно конфликтовать со страницей, формой или другим элементом дизайна ибо контейнер открывает по имени.
Код:
datarc = тут что-то собранное с формы
var url = 'doAddToCart?Open'+'&shopcart=' + shopcart;
$.ajax({
cache: false,
url: url,
type: 'post',
data: datarc, // в простом агенте вытаскивается как ctx.Request_Content(0)
datatype: "application/json",
success: function(resp){
if ( resp.update == '1' ) {
Где внутри Lotus Script
Код:
Dim web As New WebSession() ''http://tanny.ica.com/ICA/TKO/tkoblog.nsf/dx/websession-agent-class
argData = web.session.DocumentContext.Request_Content(0) ''Аргументы, переданные со страницы в datarc
username = web.session.DocumentContext.Remote_User(0) ' имя юзера, Anonymous = ""
shopcart = web.getQueryStringValue("shopcart") ''id корзины юзера _doExtractCookie('shopcart');
Items = explode(argData, "&")
Function explode(Byval strSource As String, delimiter As String) As Variant 'array of strings
Dim values() As String, idxDelimiter As Integer, idx As Integer
idx = 0
idxDelimiter = Instr(strSource, delimiter)
While (idxDelimiter > 0)
Redim Preserve values(idx)
values(idx) = Left(strSource, idxDelimiter - 1)
strSource = Mid(strSource, idxDelimiter + Len(delimiter))
idx = idx + 1
idxDelimiter = Instr(strSource, delimiter)
Wend
Redim Preserve values(idx)
values(idx) = strSource
explode = values
End Function
и json ответ
Код:
''Ответ для $.ajax
Print |Content-type: application/json; charset=utf-8|
Print ||
Print |{"shopcart":"|+shopcart+|","user":"|+userflag+|","items":|+Cstr(countitems)+|,"cartitems":|+Cstr(orderCollectionCount)+|,"update":"|+Cstr(update)+|"}|
Можно не заморачиваться с классом WebSession() и писать просто
Код:
Set ctx = ns.DocumentContext
Msgbox "ctx.Request_Content(0)" +ctx.Request_Content(0)
Msgbox "sessionID " +shopcart
Msgbox "ctx.DBID(0) "+ctx.DBID(0)
Msgbox "ctx.Copy " + ctx.Copy(0)
Msgbox "ctx.Pseudo" + ctx.Pseudo(0)
Msgbox "ctx.CheckFile "+ctx.CheckFile(0)
6. Для обработки в агенте контекста документа содержимого формы HTML, объявляйте Notes поля на форме или подформе и пишите их HTML алиас - сильно упростите себе жизнь, особенно там, где Notes поля не позволяют написать расширенный HTML5 и форму отправки можно будет разместить в любом месте страницы не открытой на редактирование. Контекст этой формы feedback?create обрабатывается по аналогии п.5, но с особенностями описанными в п.7. Без объявления Notes поля, например, контекст ctx.Type(0) будет пустой.
7. Документы создаются командой form?create, где в форме можно указать запуск агента по WQS и передать дальше управление на поле $$Return или вывести json в самом агенте. Но в агентах запускаемых по WQS формы не работает json ответ оформляемый как 'Print |Content-type: application/json; charset=utf-8| 'Вываливается Error 200. Оформляйте его как text/html
Код:
Print |Content-type: text/html; charset=utf-8| ' success: function(html){var data = JSON.parse(html) alert (data.user);
Print ||
Print |{"shopcart":"|+sessionID+|","user":"|+ctx.Pseudo(0)+|","email":"|+ctx.Email (0)+|","checkboxcopy":"|+ctx.Copy(0)+|","msg":"|+ctxType+|","error":"|+ErrorMsg+|"}|
End If
Call AgentLog.Close
Exit Sub
ErrorHandler:
Call AgentLog.Close
'Print "Ошибк а #:" + Str(Err)+ " line: "+ Cstr(Erl)
'Print ErrorCode
Print |Content-type: text/html; charset=utf-8| ' success: function(html){var data = JSON.parse(html) alert (data.user);
Print ||
Print |{"error":"|+"Ошибк а #:" + Str(Err)+ " line: "+ Cstr(Erl) + " "+ ErrorCode +|"}|
Exit Sub
И обработка AJAX через JSON.parse
Код:
url = feedback?create;
formcontent = $(form).serialize(); // serializes the form elements such Notes form!
//Length of a string literal 16,267 characters (32,000 bytes).
cl = $('#Content').val().length;
//$.toast('Размер содержимого '+ cl );
if ( cl > 4000) {
$.msgbox('<span class=msgbox_rb>Очень большое сообщение длиной '+cl+'. Пожалуйста, сократите до 4000 </span>',4);
}else{
$(idmsg).html("<div id='"+idmsg+"_bar'><img src='images/lightbox-ico-loading.gif'></div>"); //loading bar
$.ajax({
url: url,
type: 'post',
cache: false,
data: formcontent, // в агенте WQS вытаскивается через Set ctx = ns.DocumentContext
dataType: "html", //also in agent Print |Content-type: text/html; charset=utf-8|
success: function(html){
var data = JSON.parse(html); //работает !!!
//alert (data.user); //работает
if ( data.error=='0' ) {
Может быть я что-то упустил, но у меня по-другому пункт 7 не заработал.
8. Если есть возможность писать код <script language="JavaScript" type="text/javascript"> в HTML - пишите, так как в специальных секциях подформ он может не работать, также как и на формах с $$ типа $$ReturnGeneralError.
9. Используйсте скрытое поле $$HTMLFrontMatter и пишите в нем "<!DOCTYPE html>" чтобы убить по умолчанию в заголовке сервера <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
10. Используйте последнюю версию jQuery jq:="<script src=\"
Ссылка скрыта от гостей
"></script>"; в содержимом заголовка HTML формы или в общем поле $$HTMLHead и да прибудет с вами сила.Если в эту ветку еще подтянутся старшие товарищи — будет только хорошо.
ps: И еще. Не используйте конструкции открытия view через $$ViewBody на формах типа $$ViewTemplate for Viewname. Просто не используйте. На вебе вы не избавитесь от парзитного <meta name="robots" content="noindex"> и Гугл вам об этом скажет. Создайте страницу и грузаните туда что хотите через $(id).load(url + " #content")