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

Тема в разделе "Lotus - Программирование", создана пользователем NickProstoNick, 25 мар 2009.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    Есть вот какой вопрос... Можно ли при открытии документа по notes-ссылке Notes://domino/C225727B00509B31/8FD3C0B17DD5EC2BC22571A7003FC321/60D8DA15260B9A26C225754C004B66CF попробовать разобрать эту ссылку по составляющим?
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Первая часть - реплика ID базы
    вторая - UNID view
    третья - UNID документа
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    это я знаю... :)
    Как разбить по частям на момент запроса на открытие документа?
    Т.е. в каком событии базы можно получить доступ к этой ссылке. Вот :)
     
  4. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Имхо вряд ли.
    Скорее на QueryOpen/PostOpen открывающегося документа.
     
  5. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    так вот есть вариант что документ отсутствует в одной базе, но присутствует в другой... архивной, у которой репликаайди другая. Вот думаю как перенаправление сделать

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

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    если это в вебе, то на webquryopen, можно повесить агента а в нём читать CGI перепенную Path_Info(вроде) там получиш полную сылку и потом можеш её разбирать.
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    нет. не веб.
     
  8. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Если я правильно понимаю ссылка на определенный документ храниться в другом документе.
    Так не проще ли сделать не ссылкой а скриптом открытие того документа? допустим хранить только ИД.
    Повесить на текст действие, и там уже искать документа де надо и открывать)
     
  9. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Нет. Ссылка не в документе.
    Открыть ссылку можно из навигатора Notes, как гипер ссылку из вебстраницы или коммандой винды "выполнить"
    Вот разбор ссылки нужен при запуске этими средствами. Как я понимаю надо как-то ловить событие на открытие документа.
    Если документ присутствует в базе - вопросов не возникает, но если документ в базе отсутствует - возникает ошибка что-то вроде "Документ отствует". Где эту ошибку можно обработать?

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

    K-Fire Гость

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

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    K-Fire
    Ну кстати хорошая идея)
    Вызывать агент и переданными ему параметрами, и агентом уже искать документ где надо.
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    мммм..... прошу прощения... а можно по подробней для жителей крайнего севера?
     
  13. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    NickProstoNick
    Ссылка будет не на документ, а на агент фигня таже - NameAgent?OpenAgent&NameParam=ValueParam

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

    а потом разбирать этой штукой в агенте (скрипт не оптимизирован, и много хлама там, но работает)
    Код (Text):
    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
    так получаем параметр
    Код (Text):
    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)))
     
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    мммм.... уже совсем стыдно, но все же.... для жителей заполярного круга.
    Как вызвать агента из винды или по ссылке из веб?
     
  15. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Notes://domino/dbname.nsf/NameAgent?OpenAgent&NameParam=ValueParam
    вроде так)
     
Загрузка...

Поделиться этой страницей