Xpages + Lotusscript

fedotxxl

Well-known member
09.11.2005
614
0
#1
Итак, xPages передовая технология, которую будут развивать. У нас, к сожалению или к счастью, тонны кода на LS. Как LS дружит с xPages?
 

xKlonx

Lotus team
10.09.2009
410
0
#2
На данный момент занимаюсь разработкой в xpages, библиотеки написанные на LS переписываю на javascript, можно использовать и LS но только через вызов агента
 

fedotxxl

Well-known member
09.11.2005
614
0
#4
xRomax
Как насчет использования JS в качестве backend технологии? Или же лучше Java/LS?

etc
JSF в лотусе
 

fedotxxl

Well-known member
09.11.2005
614
0
#5
Гм... поискал возможность создавать JS агенты... ничего путного не нашел
Так на чем же кодировать, если использовать xPages? JavaScript/Java/LotusScript? Который из языков позволяет описать и UI, и backGround логику? Здесь еще важен момент наличия подводных камней - с LS уже порядком намучился....
 

Мыш

Премиум
12.02.2008
1 095
10
#6
fedotxxl, я так понимаю, что LS там особо не прикрутишь. JS - это как бы native язык для XPages.
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#7
LS можно использовать:
- для создания дока на основе XPage на клиенте
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
Код:
xPageName$ = "test"
q$ = |"notes://" + @Name([CN]; @DbName[1]) + "/" + @DbName[2] + "/| + xPageName$ + |.xsp?OpenXPage"|
URL = Evaluate(q$)

Dim NUIWS As New NotesUIWorkspace
Call NUIWS.URLOpen(URL(0))
- для всего бэкграундного функционала (библиотеки, агенты).
 

swyatogor

Lotus team
24.02.2014
478
10
#8
товарищи.. есть вопрос.. есть форма стандартная. на форме панель с действиями.. все они написаны на LS с вызовом дополнительных функций из библиотек - тоже на LS..
Стоит задача сделать тоже самое на Web морде.. хотелось сделать на XPage.. но уперся в тот момент что не знаю как это переселить на JS.
Можете хотя бы ткнуть пальцем в сторону как это можно реализовать..
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">А это пример одной из кнопок на панели</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Click(Source As Button)
Dim session As New NotesSession	
Dim view As NotesView
Dim doc As NotesDocument
Dim db As NotesDatabase 
Dim w As New NotesUIWorkspace
Dim uidoc As NotesUIDocument 
Dim unid As String 
Dim sendto As Variant 
Dim success As Variant
Dim item As NotesItem
Set db = session.CurrentDatabase 
Set uidoc = w.CurrentDocument 	
Set doc = uidoc.Document

AllowEdit = True
If uidoc.EditMode = False Then uidoc.EditMode = True
Call uidoc.Document.ReplaceItemValue("status","3")
Call uidoc.Document.ReplaceItemValue("state","4")
Call uidoc.Document.ReplaceItemValue("ss3","1")
Call uidoc.Document.ReplaceItemValue("ss3_date",Now())

answer = Msgbox ("Желаете прокоментировать?",4+32, "Вопрос:")
If answer = IDYES Then
f = w.DialogBox("DlgComment",True,True,False,True,False,False,"Комментарии:",,False,False,True)	
If f Then
Call uidoc.Document.ReplaceItemValue("activity_document", Now() & " --> " & uidoc.FieldGetText("activity_user") & " : Служебная записка согласована утверждена адресатом с комментарием: " & uidoc.FieldGetText("tmpComments") & Chr(13) & uidoc.FieldGetText("activity_document"))
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("author"),"СЗ: Ваша служебка утверждена адресатом - " + uidoc.FieldGetText("InternalNumber"),uidoc.FieldGetText("tmpComments"),"Служебную записку утвердили с коментарием")
If Not uidoc.FieldGetText("sendto_copy") ="" Then
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("sendto_copy"),"СЗ: Утверждено адресатом (ознакомление) - " + uidoc.FieldGetText("InternalNumber"),uidoc.FieldGetText("tmpComments"),"Служебную записку утвердили с коментарием")
End If

Call uidoc.FieldSetText("tmpComments","")
Call uidoc.Save	
Call uidoc.Document.Save(True,False)
End If
Else

Call uidoc.Document.ReplaceItemValue("activity_document", Now() & " --> " & uidoc.FieldGetText("activity_user") & " : Служебная записка утверждена адресатом " & Chr(13) & uidoc.FieldGetText("activity_document"))
Call uidoc.Save	
Call uidoc.Document.Save(True,False)
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("author"),"СЗ: Ваша служебка утверждена адресатом - " + uidoc.FieldGetText("InternalNumber"),Left(uidoc.FieldGetText("Body"),100),"Часть текста служебной записки")
If Not uidoc.FieldGetText("sendto_copy") ="" Then
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("sendto_copy"),"СЗ: Утверждено адресатом (ознакомление) - " + uidoc.FieldGetText("InternalNumber"),Left(uidoc.FieldGetText("Body"),100),"Часть текста служебной записки")
End If
End If

If doc.Getitemvalue("SendTo_Copy")(0)<>"" Then 
var = GetReaders(doc.Getitemvalue("SendTo_Copy"))
Set item = doc.ReplaceItemValue("Ot_Readers",Arrayappend(doc.ot_readers,var) )
Item.IsReaders = True
Item.IsSummary = True	
Call doc.Save(True,False)
End If


Call uidoc.Save()	

Call uidoc.Close 
End Sub

Function GetReaders (Names As Variant) 
Dim rez As Variant
Dim Persons As Variant
Dim tmpPers As Variant

ForAll Nam In names
tmpPers = Split(nam,"@")
rez = Evaluate(|
@Do(
Server := "Ezop";
DbName := "names.nsf";
View := "($LDAPCN)";
@Certificate([Subject];@DbLookup("":"NoCache"; Server : Dbname; View; @LowerCase(@Name([CN];"| & tmpPers(0) & |")); "Certificate")))|)

If IsArray(persons) Then 
persons = ArrayAppend(Persons,rez)
Else 
persons = rez	
End If

End ForAll	

GetReaders = persons
End Function

Sub sendMail_WW (db As NotesDatabase,doc As NotesDocument,sendto As Variant, subject As String, body As String, HeadBody As string)
Dim s As New NotesSession
Dim hdr As NotesMIMEHeader
Dim stream As NotesStream
Dim MIMEE As NotesMIMEEntity
Dim Hlink As String
Dim Nlink As String
Nlink = doc.Notesurl

Hlink = Replace( Nlink, "нотес адрес" , "инет адрес")
Hlink = Replace( Hlink, "notes:" , "https:")


Set mailDoc = db.CreateDocument
mailDoc.Form = "memo"
mailDoc.Principal = "Хранилище типовых документов"
mailDoc.SMTPOriginator = "Хранилище типовых документов"
mailDoc.DisplaySent = "Mail Agent"
mailDoc.From = "Внутренний документооборот"
mailDoc.Subject = subject
'	mailDoc.Importance = importance
mailDoc.SendTo = sendto

Set MIMEE = maildoc.CreateMIMEEntity("Body")
Set hdr = MIMEE.CreateHeader("MIME-Version")
Call hdr.SetHeaderValAndParams(|1.0|)
Set stream = s.CreateStream

Call stream.WriteText(|<p><font size="1" color="maroon" face="Tahoma">Данное сообщение является информационным. Для совершения требуемых действий 
пройдите по представленным ниже ссылкам. Отвечать на данное сообщение ненужно. </p></font>|)
Call stream.WriteText(|<p><font size="2" face="Tahoma">Ссылки на документ.<br>|)
Call stream.WriteText(|<a href="| + Nlink + |">Ссылка для доступа через стандартный клиент</a><br>|)
Call stream.WriteText(|<br>|)

Call stream.WriteText(|<a href="| + Hlink+ |">Ссылка для доступа через WEB или с мобильного клиента</a>|)
Call stream.WriteText(|<br>|)
Call stream.WriteText(|<br>|)

Call stream.WriteText(||+HeadBody+|:<br>|)
Call stream.WriteText(|<br>|)

Call stream.WriteText(|</font><Table border="1"><Tbody><TR><TD>|)
Call stream.WriteText(Body)
Call stream.WriteText(|</TD></TR></Tbody></Table>|)

stream.Position = 0&
MIMEE.SetContentFromText stream, "text/html;charset=UTF-8", ENC_IDENTITY_8BIT
Call maildoc.CloseMIMEEntities(True, "MIMEE") ' finalize pending changes into the document.
Call mailDoc.Send(False)		
End Sub
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#9
такой хардкод переписывать полюбасу ;)
это как код на пыхе - логика, строки, данные, потоки...
все в одной куче, здесь даже рапер написать проблематично
понадобится локализация... - опять засада
потихоньку менять кусок за куском, если есть описание/понимание - что код делает
у меня много старого говнокода - а шо делать :(
 

Dragon108

Well-known member
19.01.2010
265
0
#10
товарищи.. есть вопрос.. есть форма стандартная. на форме панель с действиями.. все они написаны на LS с вызовом дополнительных функций из библиотек - тоже на LS..
Стоит задача сделать тоже самое на Web морде.. хотелось сделать на XPage.. но уперся в тот момент что не знаю как это переселить на JS.
Можете хотя бы ткнуть пальцем в сторону как это можно реализовать..
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">А это пример одной из кнопок на панели</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Click(Source As Button)
Dim session As New NotesSession	
Dim view As NotesView
Dim doc As NotesDocument
Dim db As NotesDatabase 
Dim w As New NotesUIWorkspace
Dim uidoc As NotesUIDocument 
Dim unid As String 
Dim sendto As Variant 
Dim success As Variant
Dim item As NotesItem
Set db = session.CurrentDatabase 
Set uidoc = w.CurrentDocument 	
Set doc = uidoc.Document

AllowEdit = True
If uidoc.EditMode = False Then uidoc.EditMode = True
Call uidoc.Document.ReplaceItemValue("status","3")
Call uidoc.Document.ReplaceItemValue("state","4")
Call uidoc.Document.ReplaceItemValue("ss3","1")
Call uidoc.Document.ReplaceItemValue("ss3_date",Now())

answer = Msgbox ("Желаете прокоментировать?",4+32, "Вопрос:")
If answer = IDYES Then
f = w.DialogBox("DlgComment",True,True,False,True,False,False,"Комментарии:",,False,False,True)	
If f Then
Call uidoc.Document.ReplaceItemValue("activity_document", Now() & " --> " & uidoc.FieldGetText("activity_user") & " : Служебная записка согласована утверждена адресатом с комментарием: " & uidoc.FieldGetText("tmpComments") & Chr(13) & uidoc.FieldGetText("activity_document"))
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("author"),"СЗ: Ваша служебка утверждена адресатом - " + uidoc.FieldGetText("InternalNumber"),uidoc.FieldGetText("tmpComments"),"Служебную записку утвердили с коментарием")
If Not uidoc.FieldGetText("sendto_copy") ="" Then
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("sendto_copy"),"СЗ: Утверждено адресатом (ознакомление) - " + uidoc.FieldGetText("InternalNumber"),uidoc.FieldGetText("tmpComments"),"Служебную записку утвердили с коментарием")
End If

Call uidoc.FieldSetText("tmpComments","")
Call uidoc.Save	
Call uidoc.Document.Save(True,False)
End If
Else

Call uidoc.Document.ReplaceItemValue("activity_document", Now() & " --> " & uidoc.FieldGetText("activity_user") & " : Служебная записка утверждена адресатом " & Chr(13) & uidoc.FieldGetText("activity_document"))
Call uidoc.Save	
Call uidoc.Document.Save(True,False)
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("author"),"СЗ: Ваша служебка утверждена адресатом - " + uidoc.FieldGetText("InternalNumber"),Left(uidoc.FieldGetText("Body"),100),"Часть текста служебной записки")
If Not uidoc.FieldGetText("sendto_copy") ="" Then
Call sendMail_WW(db,uidoc.Document, uidoc.Document.GetItemValue("sendto_copy"),"СЗ: Утверждено адресатом (ознакомление) - " + uidoc.FieldGetText("InternalNumber"),Left(uidoc.FieldGetText("Body"),100),"Часть текста служебной записки")
End If
End If

If doc.Getitemvalue("SendTo_Copy")(0)<>"" Then 
var = GetReaders(doc.Getitemvalue("SendTo_Copy"))
Set item = doc.ReplaceItemValue("Ot_Readers",Arrayappend(doc.ot_readers,var) )
Item.IsReaders = True
Item.IsSummary = True	
Call doc.Save(True,False)
End If


Call uidoc.Save()	

Call uidoc.Close 
End Sub

Function GetReaders (Names As Variant) 
Dim rez As Variant
Dim Persons As Variant
Dim tmpPers As Variant

ForAll Nam In names
tmpPers = Split(nam,"@")
rez = Evaluate(|
@Do(
Server := "Ezop";
DbName := "names.nsf";
View := "($LDAPCN)";
@Certificate([Subject];@DbLookup("":"NoCache"; Server : Dbname; View; @LowerCase(@Name([CN];"| & tmpPers(0) & |")); "Certificate")))|)

If IsArray(persons) Then 
persons = ArrayAppend(Persons,rez)
Else 
persons = rez	
End If

End ForAll	

GetReaders = persons
End Function

Sub sendMail_WW (db As NotesDatabase,doc As NotesDocument,sendto As Variant, subject As String, body As String, HeadBody As string)
Dim s As New NotesSession
Dim hdr As NotesMIMEHeader
Dim stream As NotesStream
Dim MIMEE As NotesMIMEEntity
Dim Hlink As String
Dim Nlink As String
Nlink = doc.Notesurl

Hlink = Replace( Nlink, "нотес адрес" , "инет адрес")
Hlink = Replace( Hlink, "notes:" , "https:")


Set mailDoc = db.CreateDocument
mailDoc.Form = "memo"
mailDoc.Principal = "Хранилище типовых документов"
mailDoc.SMTPOriginator = "Хранилище типовых документов"
mailDoc.DisplaySent = "Mail Agent"
mailDoc.From = "Внутренний документооборот"
mailDoc.Subject = subject
'	mailDoc.Importance = importance
mailDoc.SendTo = sendto

Set MIMEE = maildoc.CreateMIMEEntity("Body")
Set hdr = MIMEE.CreateHeader("MIME-Version")
Call hdr.SetHeaderValAndParams(|1.0|)
Set stream = s.CreateStream

Call stream.WriteText(|<p><font size="1" color="maroon" face="Tahoma">Данное сообщение является информационным. Для совершения требуемых действий 
пройдите по представленным ниже ссылкам. Отвечать на данное сообщение ненужно. </p></font>|)
Call stream.WriteText(|<p><font size="2" face="Tahoma">Ссылки на документ.<br>|)
Call stream.WriteText(|<a href="| + Nlink + |">Ссылка для доступа через стандартный клиент</a><br>|)
Call stream.WriteText(|<br>|)

Call stream.WriteText(|<a href="| + Hlink+ |">Ссылка для доступа через WEB или с мобильного клиента</a>|)
Call stream.WriteText(|<br>|)
Call stream.WriteText(|<br>|)

Call stream.WriteText(||+HeadBody+|:<br>|)
Call stream.WriteText(|<br>|)

Call stream.WriteText(|</font><Table border="1"><Tbody><TR><TD>|)
Call stream.WriteText(Body)
Call stream.WriteText(|</TD></TR></Tbody></Table>|)

stream.Position = 0&
MIMEE.SetContentFromText stream, "text/html;charset=UTF-8", ENC_IDENTITY_8BIT
Call maildoc.CloseMIMEEntities(True, "MIMEE") ' finalize pending changes into the document.
Call mailDoc.Send(False)		
End Sub

Переписывать, тут UI-шные вещи есть как минимум - ws и т.д. ... это никак XPage не поймет (естественно даже если это в агент запихнуть)


P.S.
На самом деле (при быстром просмотре листинга кода :( ) - тут отправка письма с предварительным вызовом диалога ... в принципе ничего критичного и сложного в том чтобы переписать это на js нет. Причем функции GetReaders и sendMail_WW можете перенести в lotusscript агент и соответственно вызывать их оттуда - т.е. в XPage реализовать только вызов диалога и запуск агента
 

swyatogor

Lotus team
24.02.2014
478
10
#11
да.. там ни чего сложного (для мну) нет (я писал))
просто я кроме формул и ЛС ни на чем не писал.. и для мну темный лес как из сервер сайд ДжиэС спросить пользователя хочет он чего то или не хочет..
как из когда страницы вызвать функцию из библиотеки?? т.е. по идее это базовые навыки программирования в страницах.. просто я этого не знаю.. вот и прошу дать пару пояснений.. как сделать..

а вообще появилось желание снести это всё в агента.. а пользователь будет делать только простейшие (для меня) действия делать - изменить одно поле и сохранить док.. или создавать новый док)) это я знаю как))
 

ty3uk

Well-known member
31.03.2008
170
0
#12
мысли в слух....

у меня сейчас медленно но верно поднимается вопрос переделки всего ЭДО на работу с XPages-ами. Слава богу, что ранее, я уже вводил всякие стандарты, которые облегчат этот переход. Система, сделана так, что некоторая часть кода есть в самой форме (это всевозможные "выборы" из других баз и т.п.), а вся бизнесс логика, висит в "процессах". В процессах, в свою очередь, работа с пользователем минимальная. В 99% случаев, это "алерты" (для данного перехода нужно заполнить такое-то поле!) или действия, которые выполяются без участия пользователя (отсылка нотификаций, пинание агнта в другой базе и т.п.). Но даже для Алертов, у меня, давно, "закладка" есть, делается это не messagebox-ом, а отдельной функцией (которая, в свою очередь, знает где сейчас "находимся", уя/агент/веб/хпагесы) и, соотвественно, в зависимости от ситуации, ведёт себя по разному.
Одна из фич, которая появилась в 8.5.1 если мне память не изменяет, это тот момент, что можно передавать документ с веба в лотусовый агент, БЕЗ СОХРАНЕНИЯ! Т.е. в моём случае, для процессов, теже алерты, тупо пихаются обратно в документ (через спец поле) и отдаются в веб, где идёт перехват и показывается пользователю.
А вот чистая работа с формой, это да, проблема. Но деваться некуда, надо переписывать для ХПагесов. Огромный плюс в том, что можно сделать КастомКонтрол, и, потом, его "зашарить" по всем базам (мне это очень важно, т.к. во всех базах идёт работа с ОргСтруктурой, Контрами и некоторыми специфичными для клиента базами, и, если есть какие-то изменения, то надо сразу во всех базах менять). Соотвественно поменяв Кастом в корневой базе, он, автоматом, обновиться во всех (вроде, пока не проверял). Есть, конечно, один сильный минус, это то, что кастом надо привязывать к полю, но, я пока не пробовал, но можно делать свои кастомы, в которые передавать поле как параметр.