Уже больше года назад, мы писали на работе очень интересное решение, которое впоследствии вошло в состав нашего портала DeskWork - по отсылке оповещений, в том числе SMS. И вот в который раз убеждаюсь, насколько важно изучать SharePoint и его внутренности, потому что ценой минимальных усилий, оказывается, можно было бы глубоко сынтегрировать ту систему SMS-рассылок с SharePoint, получив массу вкусных бонусов (а может быть, мы это еще сделаем в будущем).
Я имею в виду встроенную в SharePoint возможность отсылать SMS и даже MMS по протоколу Office Mobile Service Protocol. Протокол вполне продуманный: предусмотрена пакетная отправка сообщений и интерфейс для получения статусов доставки... В этом посте я расскажу, как можно этот самый OMS использовать в своих решениях, и какие бонусы можно получить.
пятница, 29 июля 2011 г.
среда, 6 июля 2011 г.
Работа с XML в SharePoint из Javascript
SharePoint очень тесно связан с XML. Все эти схемы полей и списков, определения элементов Ribbon, SharePoint Batch API, запросы SPQuery/CamlQuery - и многое другое. И если на стороне сервера всё более-менее понятно, там есть XmlReader/XmlWriter, XmlSerializer, XDocument и т.д., то что делать на стороне клиента?
Как обрабатывать XML, формировать или изменять его, и какие для этого есть функции в SharePoint EcmaScript - всю эту информацию я постарался собрать в сегодняшней статье.
Как обрабатывать XML, формировать или изменять его, и какие для этого есть функции в SharePoint EcmaScript - всю эту информацию я постарался собрать в сегодняшней статье.
вторник, 5 июля 2011 г.
Использование HTML5 в формах списков SharePoint
Недавно я писал про RenderingTemplate и использование перегруженного ListFieldIterator для того, чтобы изменять отображение форм списков SharePoint. В качестве примера использования этого способа, я привел скриншот проекта, где поля списка распределены по вкладкам. Также, в том посте был выложен для скачивания "базовый" проект-пример на эту тему.
Сегодня я хочу еще раз вернуться к RenderingTemplate и ListFieldIterator, рассмотрев их более тщательно и иллюстрированно, на другом примере - внедряя элементы управления HTML5 в формы списков SharePoint.
Сегодня я хочу еще раз вернуться к RenderingTemplate и ListFieldIterator, рассмотрев их более тщательно и иллюстрированно, на другом примере - внедряя элементы управления HTML5 в формы списков SharePoint.
понедельник, 4 июля 2011 г.
SP.UI.ModalDialog и стандартные диалоги SharePoint
На своем докладе на SharePoint Conference Russia 2011 я, в числе прочего, показывал интересный пример глубокой интеграции с SharePoint - использование диалогов SharePoint в собственных целях, получение и обработка их returnValue.
Такой подход позволяет обеспечить глубокую интеграцию с SharePoint и иногда - значительно упростить разработку того или иного функционала. Особенно это актуально в среде Office365, где нет возможности создания собственных Application Pages. В этом случае крайне важно по максимуму использовать тот функционал, который есть в SharePoint.
В этой заметке я хочу еще раз вернуться к теме возвращаемых значений диалогов, описать несколько примеров, и привести код для самостоятельного тестирования диалогов, которых я не видел :)
Такой подход позволяет обеспечить глубокую интеграцию с SharePoint и иногда - значительно упростить разработку того или иного функционала. Особенно это актуально в среде Office365, где нет возможности создания собственных Application Pages. В этом случае крайне важно по максимуму использовать тот функционал, который есть в SharePoint.
В этой заметке я хочу еще раз вернуться к теме возвращаемых значений диалогов, описать несколько примеров, и привести код для самостоятельного тестирования диалогов, которых я не видел :)
пятница, 24 июня 2011 г.
Метаданные для SPField
У объекта SPField есть два полезных метода: GetCustomProperty и SetCustomProperty. Но к сожалению, использовать их в качестве обычного PropertyBag очень сложно:
Обычно, для того, чтобы их задействовать, используют private методы класса SPField: SetFieldAttributeValue и GetFieldAttributeValue. Но в этом случае, естественно, используется Reflection, который запрещен в Office365. И вообще, Reflection - это хак, а любые хаки желательно обходить стороной.
Поэтому, я написал собственное решение, которое парзит XML и меняет свойство FieldSchema самостоятельно. Решение получилось довольно простым, и я всё чаще и чаще использую этот самодельный PropertyBag для хранения разных дополнительных атрибутов полей.
Код (не забудьте подключить пространство имен System.Xml.Linq):
- Свойства эти можно использовать только для Custom Field Type'ов, прописывая их названия и типы в схеме типа поля
- Вдобавок, нужно еще изменять схему экземпляра поля (SPField.Schema), добавляя туда атрибут Customization. Автоматически это почему-то не делается :(
Обычно, для того, чтобы их задействовать, используют 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'овского списка. Таких форм существует три вида, и вы все их прекрасно знаете:
И вот, после долгих исследований и поиска в интернетах, мне-таки удалось понять, как же это делается правильно, и воплотить в жизнь вот такую вот красивую форму:
Как видите, часть полей (ФИО и фотография) здесь рендерятся по-особому. Остальные поля рендерятся обычным образом, но разбиваются на вкладки (пользователь может менять порядок полей и принадлежность полей разным вкладкам).
В общем, функционал на мой взгляд, весьма интересный, и в этом посте я расскажу подход к подобным изменениям.
На этот раз, мне потребовалось внести изменения на формы стандартного SharePoint'овского списка. Таких форм существует три вида, и вы все их прекрасно знаете:
- DisplayForm - форма отображения элемента списка
- EditForm - форма изменения элемента списка
- NewForm - форма создания нового элемента списка
- Чтобы сохранилась возможность добавлять новые поля в список
- Чтобы можно было перемещать поля из одной вкладки в другую, и менять порядок их следования
- Чтобы поля рендерились стандартными средствами
И вот, после долгих исследований и поиска в интернетах, мне-таки удалось понять, как же это делается правильно, и воплотить в жизнь вот такую вот красивую форму:
Как видите, часть полей (ФИО и фотография) здесь рендерятся по-особому. Остальные поля рендерятся обычным образом, но разбиваются на вкладки (пользователь может менять порядок полей и принадлежность полей разным вкладкам).
В общем, функционал на мой взгляд, весьма интересный, и в этом посте я расскажу подход к подобным изменениям.
Подписаться на:
Сообщения (Atom)


