пятница, 29 июля 2011 г.

SMS и SharePoint

Уже больше года назад, мы писали на работе очень интересное решение, которое впоследствии вошло в состав нашего портала DeskWork - по отсылке оповещений, в том числе SMS. И вот в который раз убеждаюсь, насколько важно изучать SharePoint и его внутренности, потому что ценой минимальных усилий, оказывается, можно было бы глубоко сынтегрировать ту систему SMS-рассылок с SharePoint, получив массу вкусных бонусов (а может быть, мы это еще сделаем в будущем).

Я имею в виду встроенную в SharePoint возможность отсылать SMS и даже MMS по протоколу Office Mobile Service Protocol. Протокол вполне продуманный: предусмотрена пакетная отправка сообщений и интерфейс для получения статусов доставки... В этом посте я расскажу, как можно этот самый OMS использовать в своих решениях, и какие бонусы можно получить.

среда, 6 июля 2011 г.

Работа с XML в SharePoint из Javascript

SharePoint очень тесно связан с XML. Все эти схемы полей и списков, определения элементов Ribbon, SharePoint Batch API, запросы SPQuery/CamlQuery - и многое другое. И если на стороне сервера всё более-менее понятно, там есть XmlReader/XmlWriter, XmlSerializer, XDocument и т.д., то что делать на стороне клиента?

Как обрабатывать XML, формировать или изменять его, и какие для этого есть функции в SharePoint EcmaScript  - всю эту информацию я постарался собрать в сегодняшней статье.

вторник, 5 июля 2011 г.

Использование HTML5 в формах списков SharePoint

Недавно я писал про RenderingTemplate и использование перегруженного ListFieldIterator для того, чтобы изменять отображение форм списков SharePoint. В качестве примера использования этого способа, я привел скриншот проекта, где поля списка распределены по вкладкам. Также, в том посте был выложен для скачивания "базовый" проект-пример на эту тему.

Сегодня я хочу еще раз вернуться к RenderingTemplate и ListFieldIterator, рассмотрев их более тщательно и иллюстрированно, на другом примере - внедряя элементы управления HTML5 в формы списков SharePoint.

понедельник, 4 июля 2011 г.

SP.UI.ModalDialog и стандартные диалоги SharePoint

На своем докладе на SharePoint Conference Russia 2011 я, в числе прочего, показывал интересный пример глубокой интеграции с SharePoint - использование диалогов SharePoint в собственных целях, получение и обработка их returnValue.

Такой подход позволяет обеспечить глубокую интеграцию с SharePoint и иногда - значительно упростить разработку того или иного функционала. Особенно это актуально в среде Office365, где нет возможности создания собственных Application Pages. В этом случае крайне важно по максимуму использовать тот функционал, который есть в SharePoint.

В этой заметке я хочу еще раз вернуться к теме возвращаемых значений диалогов, описать несколько примеров, и привести код для самостоятельного тестирования диалогов, которых я не видел :)

пятница, 24 июня 2011 г.

Метаданные для SPField

У объекта SPField есть два полезных метода: GetCustomProperty и SetCustomProperty. Но к сожалению, использовать их в качестве обычного PropertyBag очень сложно:
  1. Свойства эти можно использовать только для Custom Field Type'ов, прописывая их названия и типы в схеме типа поля
  2. Вдобавок, нужно еще изменять схему экземпляра поля (SPField.Schema), добавляя туда атрибут Customization. Автоматически это почему-то не делается :(
Естественно, динамически добавлять свойства к уже существующим полям с помощью этих методов никак не получится. Однако, решения есть, и они известны. Дело в том, что схема поля (SPField.Schema) позволяет использовать произвольные атрибуты для элемента Field.

Обычно, для того, чтобы их задействовать, используют private методы класса SPField: SetFieldAttributeValue и GetFieldAttributeValue. Но в этом случае, естественно, используется Reflection, который запрещен в Office365. И вообще, Reflection - это хак, а любые хаки желательно обходить стороной.

Поэтому, я написал собственное решение, которое парзит XML и меняет свойство FieldSchema самостоятельно. Решение получилось довольно простым, и я всё чаще и чаще использую этот самодельный PropertyBag для хранения разных дополнительных атрибутов полей.

Код (не забудьте подключить пространство имен System.Xml.Linq):

  private const string nameSpace = "my";

  /// <summary>
  /// Прикрепляем метаданные к колонке списка. Эти метаданные будут храниться
  /// в схеме поля.
  /// </summary>
  /// <param name="field">Колонка (SPField), к которой следует добавить метаданные</param>
  /// <param name="key">Название поля метаданных</param>
  /// <param name="value">Значение поля метаданных</param>
  public void SetFieldMetaData(SPField field, string key, string value)
  {
   var fieldSchema = XDocument.Parse(field.SchemaXml);
   var tabAttribute = fieldSchema.Element("Field").Attribute(XNamespace.Get(nameSpace) + key);
   if (tabAttribute == null)
    fieldSchema.Element("Field").Add(new XAttribute(XNamespace.Get(nameSpace) + key, value));
   else
    tabAttribute.Value = value;

   field.SchemaXml = fieldSchema.ToString();
   field.Update();
  }

  /// <summary>
  /// Получаем метаданные из колонки.
  /// </summary>
  /// <param name="field">Колонка, из которой считываются метаданные</param>
  /// <param name="key">Название поля метаданных</param>
  /// <returns>Возвращает значение поля метаданных для колонки, или null, если поле метаданных с указанным именем не было ранее присоединено к этой колонке.</returns>
  public string GetFieldMetaData(SPField field, string key)
  {
   var fieldSchema = XDocument.Parse(field.SchemaXml);
   var tabAttribute = fieldSchema.Element("Field").Attribute(XNamespace.Get(nameSpace) + key);
   if (tabAttribute == null)
    return null;
   else
    return tabAttribute.Value;
  }

вторник, 21 июня 2011 г.

SharePoint Conference Russia 2011: краткий отчет

Вчера выступал на SharePoint Conference Russia 2011. Это моя первая конференция, первое серьезное выступление, и одновременно, как это ни смешно, вообще первая девелоперская конференция, посещенная мной лично.



Неудивительно, что впечатлений привез целый вагон (о да, я ездил в Москву на поезде, ха-ха!). А также - опыта, наблюдений, и новых знакомств. Но, обо всём по порядку.

среда, 15 июня 2011 г.

Как правильно изменять внешний вид List Form в SharePoint

Всё в SharePoint'е можно делать разными способами. Но в последнее время, очень хочется делать правильно...

На этот раз, мне потребовалось внести изменения на формы стандартного SharePoint'овского списка. Таких форм существует три вида, и вы все их прекрасно знаете:
  1. DisplayForm - форма отображения элемента списка
  2. EditForm - форма изменения элемента списка
  3. NewForm - форма создания нового элемента списка
Из-за большого количества полей в одном из наших списков, мне захотелось разнести эти поля по вкладкам. Причем, захотелось также следующее:
  1. Чтобы сохранилась возможность добавлять новые поля в список
  2. Чтобы можно было перемещать поля из одной вкладки в другую, и менять порядок их следования
  3. Чтобы поля рендерились стандартными средствами 
Для того, чтобы определить принадлежность полей к вкладкам, я раскопал способ добавления пользовательских данных в SPField, и создал симпатичный jquery-интерфейс для того, чтобы этим мог заниматься пользователь. Но дальше дело, неожиданно, застопорилось: оказалось, что народ повсеместно пользуется для подобных целей грязными js-хаками, а такой способ мне категорически не подошел!

И вот, после долгих исследований и поиска в интернетах, мне-таки удалось понять, как же это делается правильно, и воплотить в жизнь вот такую вот красивую форму:



Как видите, часть полей (ФИО и фотография) здесь рендерятся по-особому. Остальные поля рендерятся обычным образом, но разбиваются на вкладки (пользователь может менять порядок полей и принадлежность полей разным вкладкам).

В общем, функционал на мой взгляд, весьма интересный, и в этом посте я расскажу подход к подобным изменениям.