About this Lotus Domino Template

Предыстория этого Demo подробно описана тут. На этой странице я постараюсь объяснить, как работает динамическая подгрузка ричтекстовых полей из представления базы Lotus Domino на бесконечную страницу. Пример можно посмотреть на странице Dynamic View.

Собственно, главный помощник в этом деле — горячо любимый всеми, и мной в том числе, фреймворк jQuery и технология AJAX. Поехали...

1. Помимо формы для Notes, называемой Memo, и ее алиаса для Web MemoWeb|Memo, создаем третью форму doMemoLoad, из которой убираем весь обвес и оставляем только RT поле Body и два служебных SaveOptions="0" и $V2AttachmentOptions="0".


2. Создаем представление doMemoLoad с алиасом load, в котором заставляем открывать все Memo-документы при помощи формулы для формы 'doMemoLoad' без обвеса. В формуле представления пишем что-то такое:
REM {Динамически подгружаемый контент из формы doMemoLoad через функцию AJAX doLoad или doAjax с обработчиком ошибок сети};
Link := "load/" + @Text(@DocumentUniqueID);
nu:= "Post " + @Text(@DocNumber)+ " created "+ @Text(@Date(@Created)) ;
div:=" <div class='postrt' id='load"+@Text(@NoteID)+"'><script>doAjax('#load"+@Text(@NoteID)+"','"+Link+"')</script></div>";
@Implode(nu:div;@NewLine)


//В этом случае функция для запуска из View doMemoLoad находится в общей библиотеке js/common.js
function doAjax(id,url){
$.ajax({
url: url,
type: 'post',
cache: false,
success: function(html){
$(id).hide().fadeIn().html(html);
},
error: function(xhr){
$.toast('Error Network '+ xhr.status);
}
});
};


Этой конструкцией представление doMemoLoad уже подгружает контент динамически в саму себя. Можно вывести его с помощью формы и посмотреть, но нам этого мало и пойдем дальше.

3. Создаем простую форму для вывода представления doMemoLoad называемую '$$ViewTemplate for doMemoLoad' с одной вычисляемой подформой, где пишем:
lu := @DbColumn("":""; ""; "doMemoLoad"; 1);
lu := @If(@IsError(lu);"";@Elements(lu));
start:=@TextToNumber(@UrlQueryString("start"));
count:=@TextToNumber(@UrlQueryString("count"));
@If(start+count-1>lu;"HTML_Blank";"HTML_doViewBody")


Подформа HTML_Blank просто пустая.
Подформа HTML_doViewBody содержит единственное служебное поле <div>$$ViewBody</div> для вывода содержимого представления doMemoLoad. Поскольку в эту форму мы не загружаем js/common.js, то doAjax(id,url) указываем прямо в ней.

4. Создаем еще одно представление заглушку 'MemoLoad' и форму к нему '$$ViewTemplate for MemoLoad' для запуска пунктов 1, 2 и 3. В нее помещаем нехитрую конструкцию для динамической подгрузки контента вот такого содержания:
//Load content on scroll automatically
var loading = false;
$(window).scroll(function(){
if((($(window).scrollTop()+$(window).height())+250)>=$(document).height()){
if(loading == false){
loading = true;
$('#loadingbar').show(); //Display down50.png as loading true. Style set in css/style.css
$.get("doMemoLoad?OpenView&start="+$('#loaded_max').val()+"&count=1", //Load RT Memo from Lotus Domino View preloaded as function doAjax(id,url) in Form $$ViewTemplate for doMemoLoad
function(loaded){
$('#content').append(loaded).fadeIn(); //Add content to id='content'
$('#loaded_max').val(parseInt($('#loaded_max').val())+1); //Increment '#loaded_max'
$('#loadingbar').hide(); //Hide down50.png after loading
loading = false;
});
}
}
});

//Set Load Max for Load content on scroll automatically
$(document).ready(function() {
$('#loaded_max').val(3); //<input type="hidden" size="1" id="loaded_max">
$('#content_load').load("doMemoLoad?OpenView&start=1&count=2"); //After load jQuery preload first 2 memo in id='content_load' and set next $('#loaded_max').val(3)
});


Здесь происходит следующее: Представление 'MemoLoad' играет роль стартера, на форме его нет и при загрузке страницы через $(document).ready(function() загружает в <div id="content_load"></div> первые два поста из представления 'doMemoLoad?OpenView&start=1&count=2'. В скрытом инпуте на странице размещаем счетчик $('#loaded_max').val(3) с номером следующего поста. Далее, при прокрутке страницы колесом мыши контент будет подгружаться в блок <div id="content_load"></div> по одному пока не закончится по формуле @If(start+count-1>lu;"HTML_Blank";"HTML_doViewBody"). Если дальше крутить колесо мыши, то счетчик будет считать, но контент не будет подгружаться из пустой подформы HTML_Blank, создавая впечатление, что страница 'MemoLoad?OpenView' закончилась.

Как видим, никаких Xpage, агентов и сложных скриптов не требуется. Подробнее можно посмотреть уже в самой базе, которая в седьмом дизайнере выглядит приблизительно вот так.


Подразумевается, что где надо по контексту был загружен плагин jQuery.


5. В итоге, обратившись к странице Dynamic View, видим вот такую динамически подгружаемую красоту наподобие Твиттера или Вконтактика.


Конечно, вместо пустого представления MemoLoad с конструкцией $$ViewTemplate for doMemoLoad можно было все это запустить, например, из любой формы через ?readform или из страницы через ?openpage, но в данном случае надо было показать отличие от представления Simple View.

На самом деле, работать с формой или прямо со страницей с вложенным в нее через подформу представлением наиболее правильно, так как в конструкцию '$$ViewTemplate for' сервер Domino непременно вставляет мета тег <meta name="robots" content="noindex"> от которого невозможно избавиться.

Загрузить базу в архиве .zip со всем содержимым можно по ссылке 'Download webdesign.nsf' из правого сайдбара наверху страницы.

Enjoy! By NetWood 2017-03 webdesign.nsf

ps: Надо бы сюда прикрутить плагин расцветки синтаксиса, иначе код плохо читается.

Release
== R1.1 ==

== R1.2 ==
- Download counter
- Some fix