Разбор ссылок

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#1
Всем привет!
Есть вот какой вопрос... Можно ли при открытии документа по notes-ссылке Notes://domino/C225727B00509B31/8FD3C0B17DD5EC2BC22571A7003FC321/60D8DA15260B9A26C225754C004B66CF попробовать разобрать эту ссылку по составляющим?
 

Omh

Lotus team
04.07.2007
2 210
1
#2
Первая часть - реплика ID базы
вторая - UNID view
третья - UNID документа
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#3
это я знаю... :)
Как разбить по частям на момент запроса на открытие документа?
Т.е. в каком событии базы можно получить доступ к этой ссылке. Вот :)
 

Omh

Lotus team
04.07.2007
2 210
1
#4
Имхо вряд ли.
Скорее на QueryOpen/PostOpen открывающегося документа.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#5
так вот есть вариант что документ отсутствует в одной базе, но присутствует в другой... архивной, у которой репликаайди другая. Вот думаю как перенаправление сделать

Похоже есть такая служба в самом domino. буду ковырять
 

lionk

Well-known member
05.04.2007
310
2
#6
если это в вебе, то на webquryopen, можно повесить агента а в нём читать CGI перепенную Path_Info(вроде) там получиш полную сылку и потом можеш её разбирать.
 

Kizarek86

Lotus team
20.07.2007
864
4
#8
Если я правильно понимаю ссылка на определенный документ храниться в другом документе.
Так не проще ли сделать не ссылкой а скриптом открытие того документа? допустим хранить только ИД.
Повесить на текст действие, и там уже искать документа де надо и открывать)
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#9
Нет. Ссылка не в документе.
Открыть ссылку можно из навигатора Notes, как гипер ссылку из вебстраницы или коммандой винды "выполнить"
Вот разбор ссылки нужен при запуске этими средствами. Как я понимаю надо как-то ловить событие на открытие документа.
Если документ присутствует в базе - вопросов не возникает, но если документ в базе отсутствует - возникает ошибка что-то вроде "Документ отствует". Где эту ошибку можно обработать?

Для примера...
Возьми ссылку на документ с одной базы, и вместо айди документа подставь айди документа из другой базы.
А потом выполни ее через комманду винды "выполнить"
 
K

K-Fire

#10
Думаю перехватить такую ссылку нельзя никак.
Возможный вариант: все такие ссылки заменять на вызовы агента, а агент уже выполняет нужные действия.
 

Kizarek86

Lotus team
20.07.2007
864
4
#11
K-Fire
Ну кстати хорошая идея)
Вызывать агент и переданными ему параметрами, и агентом уже искать документ где надо.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#12
мммм..... прошу прощения... а можно по подробней для жителей крайнего севера?
 

Kizarek86

Lotus team
20.07.2007
864
4
#13
NickProstoNick
Ссылка будет не на документ, а на агент фигня таже - NameAgent?OpenAgent&NameParam=ValueParam

Где будешь под ValuePatam ставить допустим ИД документа.

а потом разбирать этой штукой в агенте (скрипт не оптимизирован, и много хлама там, но работает)
Код:
Dim arg As String
Dim temp As String
Dim item As NotesItem
Dim db As NotesDatabase
Dim type1 As String
Dim ti As Integer
Dim tt As String
Dim grRead As String
Dim grWrite As String
Dim session As NotesSession
Dim note As NotesDocument


Public Class RequestContentParser
Private psRC As String
Private piAmpPos As Integer
Private iTempPrev As Integer ' tracks where the last field value was...
Sub new(Byval sRequest_Content As String)
psRC = sRequest_Content
piAmpPos = 0
End Sub
Private Function Unescape(Byval s As String) As String
Dim iPercent As Integer
Dim iPlus As Integer
Dim sL As String
Dim sM As String
Dim sR As String
Dim result As Variant
'		result = Evaluate(|@URLDecode("UTF-8";"|+s+|")|)
'		s=result(0)
iPercent = Instr(s,"%")
iPlus = Instr(s,"+")
If iPlus = 0 Then
If iPercent = 0 Then 'neither percent nor plus was found.
Unescape = s
Else 'plus not found, deal with percent
sL = Left$(s,iPercent-1)
sM = Mid$(s,iPercent+1,2)
sR = Mid$(s, iPercent+3)
Unescape = sL + Chr$(Cint("&h" & sM)) + Unescape(sR)
End If
Elseif iPercent = 0 Or iPlus < iPercent Then 'percent doesn't exist or plus comes before percent, deal with plus
sL = Left$(s, iPlus - 1)
sR = Mid$(s, iPlus + 1)
Unescape = sL + " " + Unescape(sR)
Else 'percent comes before plus, deal with percent
sL = Left$(s,iPercent-1)
sM = Mid$(s,iPercent+1,2)
sR = Mid$(s, iPercent+3)
Unescape = sL + Chr$(Cint("&h" & sM)) + Unescape(sR)
End If
End Function
Public Function GetFieldValues(sFieldName As String) As Variant 'rtns an array, if null then returns single value in array of value ""
'lets return an array of field values
Dim rtn() As String
Redim rtn(0) As String
iTempPrev = 1
Dim tmpString As String
tmpString = GetNextFieldValue(sFieldName)
Dim i As Integer
i = 0
If tmpString = "" Then
rtn(i) = "" 
Else
While Not tmpString = ""
Redim Preserve rtn(i)
rtn(i) = tmpString
i = i+1
tmpString = GetNextFieldValue(sFieldName)
Wend 
End If
GetFieldValues = rtn
End Function
Private Function GetNextFieldValue(sFieldName As String) As String
Dim iAmpPos As Integer
Dim iFieldPos As Integer
Dim iValPos As Integer
Dim sValue As String
iFieldPos = Instr( iTempPrev, "&" + psRC, "&" + sFieldName + "=")
If iFieldPos = 0 Then
GetNextFieldValue = ""
Else
iValPos = iFieldPos + 1 + Len(sFieldName)
iAmpPos = Instr(iValPos, psRC, "&")
iTempPrev = iValPos
If iAmpPos = iValPos Then
GetNextFieldValue = ""
Elseif iAmpPos < iValPos Then 'its the last value in the string....
GetNextFieldValue = Unescape(Mid(psRC, iValPos))
Else
GetNextFieldValue = Unescape(Mid(psRC, iValPos, iAmpPos - iValPos))
End If
End If
End Function
End Class
так получаем параметр
Код:
Dim query As String
Set session = New NotesSession	
Set note = session.DocumentContext
Dim Parameter As String
query = note.Query_String_Decoded(0)

Dim RCP As RequestContentParser
Set RCP = New RequestContentParser(query)

Parameter = Trim(Ucase(RCP.GetFieldValues("NameParam")(0)))
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#14
мммм.... уже совсем стыдно, но все же.... для жителей заполярного круга.
Как вызвать агента из винды или по ссылке из веб?