вторник, 20 ноября 2012 г.

Добавление элемента в библиотеку (Client Object Model)

Делаем следующее:

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 загруженной картинки;

10 комментариев:

  1. Андрей, подскажите как можно перенести документы из одной библиотеки документов в другую по завершению рабочего процесса?

    ОтветитьУдалить
    Ответы
    1. Добрый день Виктор, рабочий процесс сделан в дизайнере или в студии, с дизайнером не помогу (на практике он не используется почти) если в студии решение достаточно простое, есть метод копирования, организуем цикл по элементам библиотеки.

      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) { делаем что-то еще }
      }

      Удалить
  2. А есть какая-то книжка по SharePoint 2010+VS 2010 которую Вы могли бы посоветовать? Очень хочется разобраться. Спасибо.

    ОтветитьУдалить
    Ответы
    1. На русском не находил достойных, на английском лучшая пожалуй Jorg Krause - SharePoint 2010 as a Development Platform (2010 года), её можна скачать в инете.

      Удалить
  3. Доброе время суток, Андрей. Книжка хорошая. Помогает. Более мене начал писать :)
    Есть некая задумка: Запускает рабочий процесс по мере получения данных в Журнал рабочего процесса пишутся записи аля: Вася согласовал, Вера согласовала.
    Так вот. Очень хочу ведернуть эти записи и записать их в Word допустим. А вот как... Как просто выгрузить его понятно.
    Как Вы думаете это тривиальная задачка или я изобретаю велосипед?

    ОтветитьУдалить
    Ответы
    1. Добрый день, Виктор. Задачка не совсем тревиальная, есть хороший пример выгрузки в той же книге на странице 201 (Working with Office Documents)

      Удалить
    2. Сегодня нарисовал отчет. Правда наверное немного криво. Сделал так: создал новый field у элемента, туда пишу Пользователь~результат
      потом читаю поле, делаю Split('~') и пишу в файл заменяя параметры на рассплитенный массив. В общем всё работает. Только пришлось кое-что прикрутить, ибо документ не создавался от имени systemprofile - попросту в C:\Windows\System32\config\systemprofile\ и C:\Windows\SysWOW64\config\systemprofile создал папку Desktop чтобы было куда Word.Application пихать темповые файлы. В книжке посмотрел, но пока ещё не пробовал - отчет срочно нужен был. И ещё раз спасибо.

      Удалить
  4. День добрый! Я наверное уже надоел с вопросами, но всё-таки спрошу :)
    Хочу нарисовать WebPart для предварительного просмотра офисных файлов, pdf. Никогда не сталкивались? Может есть что-то готовое в Поинте?

    ОтветитьУдалить
    Ответы
    1. Добрый день, пишите без проблем, с этим не подскажу, задач схожих не делал пока, если у Вас будет решение, дайте мне знать, любопытно.

      Удалить
  5. Сделал предварительный просмотр. Возможно криво, но сделал.
    Нарисовал WebPart. На нем разместил iframe отображающий pdf файлы, сделал кнопарь для просмотра файла. Делает веб-часть следующее: подключил microsoft.office.interop.(word,excel,point) по нажатии на кнопку файл копируется и сохраняется с рандомным именем в формате pdf в темповую папку закрытой для пользователей библиотеки. Для удобства нарисовал компоненту наследуемую от iframe, но с более удобным для меня полем аля PathFile. Так вот в этот PathFile пихаю путь к переконверченному файлу в формате pdf. Показывает на ура, для того чтобы дать время Interopам сконвертить сделал Threading.Sleep(500). Как нажимается кнопка повторно файлы, которые не открыты в сессии в Темповой папке удаляются. Так и место экономлю и вроде как рандом-совпадений избегаю. Может и не правильно сделал. Фирма меня на курсы отправляет М10175 По разработке приложений думаю поможет всё систематизировать.

    ОтветитьУдалить