Делаем следующее:
1. Открываем стандартное окошко добавления элемента в библиотеку рисунков
2. В случае успешного добавления картинки, обновляем одно из полей выбранного элемента списка адресом этой картинки. Поле имеет тип "Hyperlink or picture".
Код:
Важные моменты в коде:
1. Открываем стандартное окошко добавления элемента в библиотеку рисунков
2. В случае успешного добавления картинки, обновляем одно из полей выбранного элемента списка адресом этой картинки. Поле имеет тип "Hyperlink or picture".
Код:
var picturesLibraryGuid = 'put-your-guid-here'; if (SP.ListOperation.Selection.getSelectedItems().length != 1) { SP.UI.Notify.addNotification('Select a single item, please!'); } else { var itemId = SP.ListOperation.Selection.getSelectedItems()[0].id; var listGuid = SP.ListOperation.Selection.getSelectedList(); var onError = function (sender, args) { SP.UI.Notify.addNotification('Error occured: ' + args.get_message()); }; var onItemUpdated = function () { SP.UI.Notify.addNotification('Item updated successfully!'); SP.UI.ModalDialog.RefreshPage(1); }; var options = { url: '/TeamSite/_layouts/Upload.aspx?List=' + picturesLibraryGuid, title: 'Upload picture', dialogReturnValueCallback: function (dialogResult, returnValue) { if (dialogResult == SP.UI.DialogResult.OK) { var context = new SP.ClientContext.get_current(); var list = context.get_web().get_lists().getById(listGuid); var item = list.getItemById(itemId); item.set_item('Picture', returnValue.newFileUrl); item.update(); context.executeQueryAsync(onItemUpdated, onError); } } }; SP.UI.ModalDialog.showModalDialog(options); }
Важные моменты в коде:
- SP.ListOperation.Selection - здесь можно получить Guid текущего списка, а также ID и fsObjType выбранных элементов этого списка;
- SP.UI.ModalDialog.RefreshPage - позволяет обновить содержимое текущей страницы, если диалог корректно отработал и предполагается, что данные на странице изменились. В качестве параметра передается обычно dialogResult.
- SP.ClientContext - точка входа для SharePoint EcmaScript Client Object Model.
- "_layouts/Upload.aspx" - Путь к форме загрузки файла в библиотеку документов. В качестве параметра, нужно передать Guid библиотеки, в которую будет происходить загрузка файла.
- returnValue.newFileUrl - возвращаемое значение диалога Upload.aspx, содержит свойство newFileUrl, которое выставляется в Url загруженной картинки;
Андрей, подскажите как можно перенести документы из одной библиотеки документов в другую по завершению рабочего процесса?
ОтветитьУдалитьДобрый день Виктор, рабочий процесс сделан в дизайнере или в студии, с дизайнером не помогу (на практике он не используется почти) если в студии решение достаточно простое, есть метод копирования, организуем цикл по элементам библиотеки.
Удалитьpublic static SPListItem MoveFile(SPListItem sourceItem, SPList destinationList, bool owerwriteExist)
{
using (new SPMonitoredScope(string.Format(Debug.ScopeFormat, "ListTools.MoveFile"), Debug.MaximumExecutionTime,
new SPRequestUsageCounter(Debug.MaximumSPRequestObjectCount), new SPSqlQueryCounter(Debug.MaximumSqlQueryCount)))
{
SPListItem item = null;
try
{
string fileUrl = sourceItem[SPBuiltInFieldId.EncodedAbsUrl].ToString();
SPFile file = sourceItem.Web.GetFile(fileUrl);
if (file != null && file.Exists)
{
try
{
file.MoveTo(destinationList.RootFolder.Url + "/" + Path.GetFileName(fileUrl), owerwriteExist);
}
catch (SPException spex)
{
if (spex.ErrorCode == -2130575257) //file already exist
file.MoveTo(destinationList.RootFolder.Url + "/" +
Path.GetFileNameWithoutExtension(fileUrl) + "_restored" + Path.GetExtension(fileUrl), owerwriteExist);
}
item = file.Item;
}
}
catch (System.Exception ex)
{
SPLogService.LogError(ex.ToString());
}
return item;
}
}
Использовать можно так:
SPList sourceList = ...; SPList destList = ...;
foreach(SPListItem item in sourceList.Items)
{
SPListItem newItem = MoveFile(item, destList, true);
if (newITem != null) { делаем что-то еще }
}
А есть какая-то книжка по SharePoint 2010+VS 2010 которую Вы могли бы посоветовать? Очень хочется разобраться. Спасибо.
ОтветитьУдалитьНа русском не находил достойных, на английском лучшая пожалуй Jorg Krause - SharePoint 2010 as a Development Platform (2010 года), её можна скачать в инете.
УдалитьДоброе время суток, Андрей. Книжка хорошая. Помогает. Более мене начал писать :)
ОтветитьУдалитьЕсть некая задумка: Запускает рабочий процесс по мере получения данных в Журнал рабочего процесса пишутся записи аля: Вася согласовал, Вера согласовала.
Так вот. Очень хочу ведернуть эти записи и записать их в Word допустим. А вот как... Как просто выгрузить его понятно.
Как Вы думаете это тривиальная задачка или я изобретаю велосипед?
Добрый день, Виктор. Задачка не совсем тревиальная, есть хороший пример выгрузки в той же книге на странице 201 (Working with Office Documents)
УдалитьСегодня нарисовал отчет. Правда наверное немного криво. Сделал так: создал новый field у элемента, туда пишу Пользователь~результат
Удалитьпотом читаю поле, делаю Split('~') и пишу в файл заменяя параметры на рассплитенный массив. В общем всё работает. Только пришлось кое-что прикрутить, ибо документ не создавался от имени systemprofile - попросту в C:\Windows\System32\config\systemprofile\ и C:\Windows\SysWOW64\config\systemprofile создал папку Desktop чтобы было куда Word.Application пихать темповые файлы. В книжке посмотрел, но пока ещё не пробовал - отчет срочно нужен был. И ещё раз спасибо.
День добрый! Я наверное уже надоел с вопросами, но всё-таки спрошу :)
ОтветитьУдалитьХочу нарисовать WebPart для предварительного просмотра офисных файлов, pdf. Никогда не сталкивались? Может есть что-то готовое в Поинте?
Добрый день, пишите без проблем, с этим не подскажу, задач схожих не делал пока, если у Вас будет решение, дайте мне знать, любопытно.
УдалитьСделал предварительный просмотр. Возможно криво, но сделал.
ОтветитьУдалитьНарисовал WebPart. На нем разместил iframe отображающий pdf файлы, сделал кнопарь для просмотра файла. Делает веб-часть следующее: подключил microsoft.office.interop.(word,excel,point) по нажатии на кнопку файл копируется и сохраняется с рандомным именем в формате pdf в темповую папку закрытой для пользователей библиотеки. Для удобства нарисовал компоненту наследуемую от iframe, но с более удобным для меня полем аля PathFile. Так вот в этот PathFile пихаю путь к переконверченному файлу в формате pdf. Показывает на ура, для того чтобы дать время Interopам сконвертить сделал Threading.Sleep(500). Как нажимается кнопка повторно файлы, которые не открыты в сессии в Темповой папке удаляются. Так и место экономлю и вроде как рандом-совпадений избегаю. Может и не правильно сделал. Фирма меня на курсы отправляет М10175 По разработке приложений думаю поможет всё систематизировать.