Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Советы

Главная   Библиотека   Советы

Размещение элемента Upload control (Поле вложения) как элемента HTML-кода

Александр Чудилин
Элемент дизайна File upload control (в пятой русифицированной версии - Поле вложения) используется в приложениях, ориентированных на Web, для присоединения к документу файлов при работе из web-браузера

Стандартная процедура размещения элемента в форме, предусматривающая конвертацию элемента дизайна Notes в соответствующий тег HTML-кода, описана в Designer Help в разделе APPLICATION DESIGN\Designing Forms\Adding a file upload control
Согласно этому описанию, для размещения Upload Control в форме следует воспользоваться командой Главного меню Create -> Embedded Element -> File upload control (Создание -> Внедренный элемент -> Поле вложения)
В результате фрагмент HTML-кода соответствующей web-страницы содержит тег элемента
<INPUT TYPE=file NAME="%%Filebd65291fe9eaadbac4256d6e00439ae5.$Body.0.15C">
Причем значение атрибута NAME имеет следующую структуру %%File<UNID формы>.$Body.<смещение в форме(в поле $Body элемента дизайна)>, и, в соответствии с этим, находится в зависимости от положения элемента Upload control в форме. Любое изменение расположения элементов формы приводит к изменению этого значения
Замечание. В Domino версии 6 изменилась структура значения атрибута, причем без обратной совместимости. В связи с этим приходится рассматривать приводимое решение (но, по большому счету, не алгоритм решения) отдельно для каждого случая
Значение атрибута NAME для версии R6 формируется следующим образом: %%File.<ReplicaID базы данных>.<UNID формы>.$Body.<смещение в форме(в поле $Body элемента дизайна)>. Для вычисления значения этого нового элемента атрибута можно использовать функцию @ReplicaID
В прилагаемом примере (скачать >>>) реализован код для пятой версии Domino
Автору пришлось решать задачу размещения элемента Upload control непосредственно в виде HTML-тега
Понятно, что получение значения атрибута в данном случае - казалось бы, сложная задача... если не обратить внимание, что при размещении элемента Upload control значение атрибута NAME вычисляется с использованием идентификатора подформы и смещения элемента внутри нее и никоим образом не зависит от размещения подформы и прочих элементов внутри формы
Таким образом, достаточно один раз подготовить подформу с элементом Upload control и затем ее использовать в различных формах

Алгоритм решения задачи:
1. Подготовить подформу с Upload control и "подглядеть" значение атрибута NAME:
1.1. Создать подформу UploadSubform, разместить в ней Upload control.
1.2. Создать произвольную форму TestUpload. Внедрить в нее подформу UploadSubform.
1.3. Сохранить форму
1.4. Открыть форму в браузере (URL http://server/filepath/testupload?OpenForm).
1.5. Выбрать опцию просмотра HTML-кода:
1.6. Найти тег:<INPUT TYPE=file ...>
<INPUT TYPE=file NAME="%%File4faea516ad8a79d1c4256d9e0038d491.$Body.0.76">
Это и есть HTML-код элемента. Он не будет меняться, если не меняется подформа UploadSubform.

2. Подготовить форму, по которой будут создаваться документы с присоединяемыми файлами.
2.1. Создать форму AttachmentForm. Разместить в форме нужные элементы дизайна и элементы оформления.
2.2. Разместить подформу UploadSubform. Теперь не играет роли, в какое место формы она попадет

3. Подготовить страницу с HTML-кодом.
Например:
<form method=post action="/path/db.nsf/AttachmentForm?CreateDocument" ENCTYPE="multipart/form-data">
<h2>File upload</h2>

Document name <input type=text name="DocName"><p>
Select file <INPUT TYPE=file NAME="%%File4faea516ad8a79d1c4256d9e0038d491.$Body.0.76">
<input type=submit>
</form>

Весь этот текст помечается как HTML (через пункт Главного меню Text -> Pass-Thru HTML).

При открытии этой страницы (URL-запрос http://server/filepath/имя_страницы?OpenPage), web-пользователь увидит поля для ввода имени файла. При нажатии на кнопку Submit создастся документ по форме AttachmentForm и указанный пользователем файл присоединится к этому документу.



Что дальше?

Что еще может пожелать разработчик в процессе развития данной задачи?

1. Вложения, полученные из интернет, не привязываются к конкретному полю и висят внизу документа. Как их скрыть?
Разместите в форме, по которой отображается документ, вычисляемое при открытии скрытое поле $V2AttachmentOptions со строковым значением "0".


2. Как узнать количество, имена, размеры вложений?
(см. подробности в Domino Designer Help)
Формулы: @Attachments, @AttachmentNames, @AttachmentLengths
LotusScript:
Forall Item In doc.Items
If Item.Type = ATTACHMENT Then
FileName = Item.Values(0)
End If
End Forall



3. Как переместить вложение из интернет в RT-поле?
Предлагается использовать следующий алгоритм: фоновым агентом файл отцепляется во временный каталог, затем вкладывается в поле.
Такого агента можно вызывать, например, на событие WebQuerySave формы AttachmentForm.

Код LotusScript
Function WebMoveAttachment ( doc As NotesDocument, Byval moveToFieldName As String )
'--Функция перемещает файлы, вложенные в документ через элемент Upload Control в форматируемое поле документа

    Dim session As New NotesSession
    Dim v2File As NotesItem
    Dim rtItem As NotesRichTextItem
    Dim inputAttachment As NotesEmbeddedObject
    Dim tempDirectory As String
    Dim fileName As String
    Dim filePath As String

    Set v2File = doc.GetFirstItem ( "$File" )
    fileName = v2File.Values(0)
    Set inputAttachment = doc.GetAttachment ( fileName )

'--Определение пути к каталогу для временного сохранения файла
    tempDirectory = session.GetEnvironmentString ( "Directory", True )
    filePath = tempDirectory + "\" + fileName
' разделитель имени в файловой системе - в коде используется пример для Windows

'--Извлечение файла в файловую систему
    Call inputAttachment.ExtractFile ( filePath )

'--Удаление файла из документа
    Call doc.RemoveItem ( "$File" )

'--Создание форматируемого поля в документе и размещение в нем файла
    If doc.HasItem ( moveToFieldName ) Then
Set rtItem = doc.GetFirstItem ( moveToFieldName )
'--В созданное поле можно добавить не только файл, но и текст, или, как ниже, - две пустые строки
rtItem.AddNewLine(2)
    Else
Set rtItem = New NotesRichTextItem ( doc, moveToFieldName )
    End If

    Set inputAttachment = rtItem.EmbedObject ( EMBED_ATTACHMENT, "",FilePath )

'--И, наконец, удаление файла из файловой системы
    Kill FilePath

End Function


Вызов описанной функции из события Initialize агента

Sub Initialize

    Dim session As New NotesSession
    Dim doc As NotesDocument
    Set doc = session.DocumentContext

    '--Вызов функции для перемещения файла
    Call WebMoveAttachment ( doc, "AttachedFile" )

    '--Сохранение документа
    Call doc.Save ( True, True )

End Sub




4. Несколько Upload Control в одной форме. Как разложить загруженные файлы по соответствующим RT-полям?
Проблема в том, что порядок имен загруженных файлов не сохраняется. Как определить - в каком File Upload какой аттачмент лежит?
Решение (by Natalia G. Kozlova):

У FileUpload Control можно задать идентификатор. Затем, используя функцию JavaScript записывается название вложенного файла в скрытое текстовое поле (каждому FileUpload Control соответствует свое поле), а дальше все просто.

Ограничение только одно - возникает путаница при вложении нескольких файлов с одинаковыми названиями, но здесь можно использовать проверку в коде JavaScript.




5. Как сделать ссылку на вложение (URL)?
Описание можно найти в соответствующем разделе Domino Designer Help: APPLICATION DESIGN\Designing A Web Site\URL commands for opening attachments, image files, and OLE objects

Один из вариантов ссылки на вложение в документ: http://hostname/path/db.nsf/view/docname/$File/AttachmentFileName

Примечание (by Nick A Norkin):
"при использовании функции @AttachmentNames для формирования URL-ссылок я бы еще рекомендовал преобразование @URLEncode("Domino"; <имя файла без расширения>) + "." + <расширение файла>, если существует возможность наличия файлов с русскими именами"

Рекомендуется также ознакомиться с кодом стандартного почтового шаблона, в частности, как в нем реализована работа с файлами через Web.



Благодарности

  • Благодарю Андрея Фирсова за вовремя подкинутую ключевую идею,
  • компанию "ИнтерТраст" за форум,
  • и все сообщество российских разработчиков Lotus за моральную поддержку и здравые идеи ;)
     
      Опубликовано — 12/14/2003 |    
Владимир, 20.05.2004:
Очень интересное решение!



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :

Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU