Attachments

Gor

Well-known member
07.06.2005
517
1
#1
Здравствуйте!

Столкнулся с очередной проблемой)

Форма под web.

На ней 5 полей. Мне необходимо чтобы в каждое поле поле можно было прицепить свой аттачмент.

Знаю что есть такая вещь FileUpload.
Сделал напротив каждого поля File upload.
Так вот FileUpload как я понял цепляет аттачмент непосредственно в форму... т.к. после сохранения дока экран разделяется на 2 части и там содержатся аттачменты...
А мне бы хотелось чтобы каждый аттачмент цеплялся непосредственно к своему полю и чтобы больше нигде аттачментов не было видно...?
 

alb

Well-known member
13.07.2005
212
0
#2
было гдето здесь надо будет поискать
на сохранения надо ставить агента который выгружает аттчмент на диск после номально крепить в нужное поле

MOVING ATTACHED FILES ON THE WEB
by Dan Velasco, Senior Technical Editor (dan_velasco@idg.com)

If you've ever used the File Upload Control feature in Domino, you might have
been disappointed by the fact that when a file is attached to a document via a
Web browser it appears at the very bottom of the page rather than in a rich text
field. Today's tip is a function that will allow you to move a file that is
being attached via the Web to a rich text field of your choice. Paste the
function code that follows into your WebQuerySave agent and then follow the
example below to call the function and move the newly attached file to the
exact
rich text field you desire.

Function WebMoveAttachment ( doc As NotesDocument, Byval moveToFieldName As
String )
'--This function moves a file attached via the Web with the File Upload
Control
to a rich text field.

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 )
'--CUSTOMIZE the tempDirectory below if you want to save the file to a
different
directory
tempDirectory = session.GetEnvironmentString ( "Directory", True )
filePath = tempDirectory + "\" + fileName

'--Save the file on the server
Call inputAttachment.ExtractFile ( filePath )
'--Delete the original attachment
Call doc.RemoveItem ( "$File" )

'--Create the rich text item and re-attach the file
If doc.HasItem ( moveToFieldName ) Then
Set rtItem = doc.GetFirstItem ( moveToFieldName )
'--CUSTOMIZE the code below if you want to add a couple of lines to the
rich
text field before re-attaching the file
'--rtItem.AddNewLine(2)
Else
Set rtItem = New NotesRichTextItem ( doc, moveToFieldName )
End If

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

'--Finally, delete the file from the server file system
Kill FilePath

End Function

Here is an example of how you would call the function above from the
Initialize
event:

Sub Initialize

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

'--Call the function to move the attachment ( doc, moveToFieldName )
Call WebMoveAttachment ( doc, "AttachedFile" )

'--Save the document
Call doc.Save ( True, True )

End Sub

Many happy attachments!
источник
вот это тоже прочитайте
 

Gor

Well-known member
07.06.2005
517
1
#3
здесь способ такой что он не раскладывает Аттачменты в нужные поля...
На формулах в принципе практически тоже самое можно изобразить...

Код:
"[<a class=bodylink href=" + @Text(@DocumentUniqueID) + "/$FILE/" + @URLEncode("Domino";@AttachmentNames) + ">" + @AttachmentNames + "</a> (" + @Text(@AttachmentLengths) + " bytes)"+"	Delete?<input type=\"checkbox\" name=\"%%Detach.29\" value=\"" + @AttachmentNames + "\"><script>show_preview('" + @LowerCase(@RightBack(@AttachmentNames;".")) + "','" + "/" + DbHref + "/GetFile?OpenAgent&UNID=" + @Text(@DocumentUniqueID) + "&Detach=" + @URLEncode("Domino";@AttachmentNames) + "');</script>]"

На Интертрасте обсуждалось, жаль что рещение на JS не выложили...

Только обсуждение
У FileUpload Control можно задать идентификатор. Затем, на JS записыаем название аттача в скрытое текстовое поле (каждому FileUpload Control соответствует свое поле), а дальше все просто.
 

Gor

Well-known member
07.06.2005
517
1
#4
Написал следующее

Код:
function Attachment1()
{

if (document.getElementByid("Fup1").Value != '')
{
document.getElementById("Attach1").Value = document.getElementByid("Fup1").Value
};

if (document.getElementByid("Fup2").Value != '')
{
document.getElementById("Attach2").Value = document.getElementByid("Fup2").Value
};

if (document.getElementByid("Fup3").Value != '')
{
document.getElementById("Attach3").Value = document.getElementByid("Fup3").Value
};

}
Где Fup - идентификатор File upload, Attach - идентификатор поля в которое я хочу записать название аттача
Выводит ошибки на странице( не пойму почему
 
D

D!m@n

#5
Написал следующее

Код:
function Attachment1()
{

if (document.getElementByid("Fup1").Value != '')
{
document.getElementById("Attach1").Value = document.getElementByid("Fup1").Value
};

if (document.getElementByid("Fup2").Value != '')
{
document.getElementById("Attach2").Value = document.getElementByid("Fup2").Value
};

if (document.getElementByid("Fup3").Value != '')
{
document.getElementById("Attach3").Value = document.getElementByid("Fup3").Value
};

}
Где Fup - идентификатор File upload, Attach - идентификатор поля в которое я хочу записать название аттача
Выводит ошибки на странице( не пойму почему
У меня в JS опыта мало, но мне кажется, что вы просто не там точки с запятой поставили ;)
Должно быть так:
Код:
function Attachment1()
{

if (document.getElementByid("Fup1").Value != '')
{
document.getElementById("Attach1").Value = document.getElementByid("Fup1").Value;
}

if (document.getElementByid("Fup2").Value != '')
{
document.getElementById("Attach2").Value = document.getElementByid("Fup2").Value;
}

if (document.getElementByid("Fup3").Value != '')
{
document.getElementById("Attach3").Value = document.getElementByid("Fup3").Value;
}

}
 

Gor

Well-known member
07.06.2005
517
1
#6
Возможно, хотя даже вот такая функция ругается

Код:
function Attachment()
{
document.getElementById("Attach1").Value == document.getElementByid("Fup1").Value;
}
Тут вопрос то главный как взять значение из одного поля и записать в другое, зная их id

почему то и такая конструкция не подходит...
document.ReplaceItemValue("Attach1",document.getElementByid("Fup1").Value);
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 600
277
#8
Возможно, хотя даже вот такая функция ругается

Код:
function Attachment()
{
document.getElementById("Attach1").Value == document.getElementByid("Fup1").Value;
}
это операция сравнения - булева величина и никуда не присваивается...
присвоение - просто =
ежели написано function - так и значение возвращать надо
 
D

D!m@n

#9
2Gor: извиняюсь, в суть проблемы особо не вникал, но Вы явно хотели либо
Код:
function Attachment()
{
document.getElementById("Attach1").Value = document.getElementByid("Fup1").Value;
}
либо
Код:
function Attachment()
{
return (document.getElementById("Attach1").Value == document.getElementByid("Fup1").Value);
}
 

Gor

Well-known member
07.06.2005
517
1
#10
в общем я хотел пускай по нажатию кнопки записать значение из одного поля в другое

одно поле (Fup1) type="file" другое (Attach1) text

Я хотел скопировать путь до прикреплённого файла из Fup1 в обычное текстовое поле
 
S

SkinGreek

#11
и еще хотел бы добавить, если это еще актуально. JS регистрозависимый язык и функции document.getElementByid нет, есть document.getElementById. И если память не изменяет свойства Value тоже нет есть value
Желательно узнать какие имено ошибки происходят на странице. В данном случае он должен ругаться что объект не имеет такого метода.
Документация по DOM может помочь снять несколько вопросов.
 

Gor

Well-known member
07.06.2005
517
1
#12
мда))) Как то я неаккуратно с регистрами, поправил и всё заработало)
 
S

SkinGreek

#13
ЗЫ:
Я хотел скопировать путь до прикреплённого файла из Fup1 в обычное текстовое поле
в таком случае лучше сразу же и отрезать путь к файлу ("C:\...")
Примерно так...
Код:
path = path.replace(/([^\.\\]+\.\w{3})$/i, "$1");
В данном примере выцепляются имя файла(то есть перед концом строки сначала все символы не являюхимися точкой или слешем, далее точка и 3 текстового символа являющихся расширением)
Можно воспользоваться и методом match, но имхо так короче и понятней.
если с RegExp не знакомы то вот одна из вводных статей
http://www.opennet.ru/base/dev/pcre_javascript.txt.html
 

Gor

Well-known member
07.06.2005
517
1
#14
а вообще чтобы записать значение в поле хватит присвоения из одного поля в другое?
Или метод есть специальный?

Потому что вот так не получается

Код:
function Atata(form)
{

form.l58.Value = form.Fup1.value;

p = form.l58.value;

alert (p);
}
Выводит пустое значение в алерте, хотя form.Fup1.value не равно пустому...
 
S

SkinGreek

#15
Опять Value вместо value :)
И еще такой способ доступа к полям формы вроде не специфицирован, а значит в FF может и не будет работать.
У вас несколько форм? Может лучше через document.getElementById()? в Id элементов например добавлять префикс для каждой формы и его уже передавать в функцию?
Но может я и не прав и в FF это сработат, надо пробовать
Свойство Value отдает и записыват значение поля. У некоторых элементов это свойство ReadOnly таких как input type file но вам это не грозит

упс
Свойство Value отдает и записыват значение поля. У некоторых элементов это свойство ReadOnly таких как input type file но вам это не грозит
имел ввиду свойство value:))
 

Gor

Well-known member
07.06.2005
517
1
#16
=) Невнимательность, действительно)

Может лучше через document.getElementById()?
Да почему то честно говоря document.getElementById("Attach1").Value мне всегда выводит значение [OBJECT]
Да и document.replaceItemValue("Attach1",document.getElementByid("Fup1").Value) в такой конструкции не заработал)

Хотя в div ы я поле взял...
Поэтому и пошёл этим путём)
Кстати спасибо за терпение и за мои занудные вопросы)) Просто опыта JS у меня вообще нету... Институтский C++ и ещё пары языков,
а с LotusScripta перестроиться бывает сложновато))
 
S

SkinGreek

#17
Да я понимаю так же как и мне на LS сложно перейти.
Метода document.replaceItemValue нету(если он выполняется на клиенте, то есть в браузере)
JS пишется в венгерской нотации поэтому там преобладает малый регистр первых букв в названиях методов и переменных(это чтоб проще было не забывать писать value)
Документацию по DOM можно найти
тут
http://msdn.microsoft.com/en-us/library/ms...63(VS.85).aspx#
Правда тут больше ориентируются под IE, но думаю у тебя не будет браузеро зависимого кода.
если "Attach1" это input type=text должно, то можно как получить введеный текст так и записать его самостоятельно
Если же это input type=file то document.getElementById("Attach1").value получает полное имя выбранного файла. Это должно работать.
В доке по INPUT type=file написано
value Retrieves the file name of the input object after the text is set by user input.
Можешь посмотреть HTML исходник сгенереный лотусом чтоб понять какой филд генерит какой html элемент.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 600
277
#18
который раз пытаюсь направить в "нужное" русло процесс постижения JS :) ...

динамично развивающиеся библиотеки prototype, jQuery и т.п. избавят от проблем кроссбраузерности (почти) и дадут богатейшую почву для развити интерфейсов, к ним выпускаются плагины...
используется объектных подход...

подозреваю :) следующим шагом, после задания и присвоения значений, будет валидация полей...

это все уже давно написано в упомянутых библиотеках и плагинах

вот валидатор, например:
http://ewavetnt.com.au/upload/demo/form_validation.html
и вот - http://bassistance.de/jquery-plugins/jquer...gin-validation/
там же есть реализация дерева

вот всякие манипуляции и ограничения на поля (разного типа):
http://www.pengoworks.com/workshop/jquery/...in.htm#examples

вот ричтекст: http://www.fyneworks.com/jquery/FCKEditor/

вот подборка по аттачам (поиск по плагинам):
http://plugins.jquery.com/search/node/uplo...project_project

вот линки на Доминошные замуты:
http://www.inttrust.ru/site/itforum.nsf/6e...33;OpenDocument
http://www.inttrust.ru/Site/itforum.nsf/al...45?OpenDocument

не тратьте время на собственные велики
 

Gor

Well-known member
07.06.2005
517
1
#19
Хотелось бы немного вернуться к задаче...
Форма под web.

На ней 5 полей. Мне необходимо чтобы в каждое поле поле можно было прицепить свой аттачмент.
конечно информации достаточно много, это хорошо... как я и писал ранее
по моей проблеме есть только это

Код:
У FileUpload Control можно задать идентификатор. Затем, на JS записыаем название аттача в скрытое текстовое поле (каждому FileUpload Control соответствует свое поле), а дальше все просто.
Я хочу сделать загрузку аттачмента с определённого FileUpload в определённое ричтекствое поле.

Предположим я с горем пополам сделал первую часть))))
т.е.
У FileUpload Control можно задать идентификатор. Затем, на JS записыаем название аттача в скрытое текстовое поле (каждому FileUpload Control соответствует свое поле)
перед вызовом агента на WebQuerySave у меня запускается Java script, который записывает путь к файлу в текстовые поля, каждому FileUpload соответствует своё поле (c l58 по l62)


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

я сделал так:

Код:
Sub Click(Source As Button)

Вim 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
Dim doc As NotesDocument
Set doc = session.DocumentContext

Set v2File = doc.GetFirstItem ( "$File" )

p1 = doc.GetItemValue("l58")
p1 = Strrightback(p1(0),"\")
p2 = doc.GetItemValue("l59")
p2 = Strrightback(p2(0),"\")
p3 = doc.GetItemValue("l60")
p3 = Strrightback(p3(0),"\")
p4 = doc.GetItemValue("l61")
p4 = Strrightback(p4(0),"\")
p5 = doc.GetItemValue("l62")
p5 = Strrightback(p5(0),"\")

fileName = v2File.Values(0)
Set inputAttachment = doc.GetAttachment ( fileName )
'--CUSTOMIZE the tempDirectory below if you want to save the file to a different directory

tempDirectory = session.GetEnvironmentString ( "Directory", True )
filePath = tempDirectory + "\" + fileName

'--Save the file on the server
Call inputAttachment.ExtractFile ( filePath )
'--Delete the original attachment
Call doc.RemoveItem ( "$File" )
Call doc.Save ( True, True )

If fileName = p1 Then

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

End If

If fileName = p2 Then

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

End If

If fileName = p3 Then

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

End If


If fileName = p4 Then

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

End If


If fileName = p5 Then

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

End If

Call doc.ReplaceItemValue("l58","")
Call doc.ReplaceItemValue("l59","")
Call doc.ReplaceItemValue("l60","")
Call doc.ReplaceItemValue("l61","")
Call doc.ReplaceItemValue("l62","")
Kill FilePath
Call doc.Save ( True, True )
End Sub
Работает он очень криво к моему сожалению(( Если на форме ещё нет прицелёных файлов то когда агент отрабатывает после первого сохранения всё замечательно,
но когда хочешь прицепить ещё один файл на эту же форму то получается бред...
Что бросается сразу в глаза это то что скрипт не удаляет Item - $File....
В ричтекстовое поле цепляет, а в документе внизу всё равно видно прицепленый файл...

Не могу понять почему((
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 600
277
#20
вы мой пост прочли? И ссылки в конце видели?
там есть конкретное решение для домины
Ей (домине) надо определенное имя, ей плевать на ваши доморощенные! (это я к тому, что можно JS скриптом надобавлять кучу одинаковых контролов)

После определения имени (см. внимательно по ссылкам) для остальных контролов нужно присвоить такое же имя (это не запрещено)

а уж в агенте перебирать...

тамже (в моих ссылках, внутрях) есть референц:
http://www.intertrust.ru/Site/itforum.nsf/...97?OpenDocument

как конкретно получится (одно мультивалюйное или много айтемов с одним именем) я не знаю - исправиляюсь - полей будет несколько (с одним названием)

ежели лень заморачиваться на доминошный агент и форму тюнить - можно сервлет-манагер поднять на домине и сервлету давать форму на парсинг... А там ужо готовых решений тьма (в моих ссылках тоже это есть)
http://www.inttrust.ru/Site/itforum.nsf/al...12?OpenDocument

ЗЫ:куча РТ полей - это, ИМХО, очень неудобно, проще все аттачи пихать в одно