четверг, января 20, 2011

Сюрприз от DocumentSet - 2

Второй сюрприз от неплохого типа – неверный перенос средствами экспорта/импорта настроек представления для содержимого набора документов. После импорта используется представление по умолчанию для библиотеки, а вовсе не то представление, которое было настроено до экспорта.

Исправляются последствия сюрприза использованием вот такого метода:

   1: /// <summary>
2: /// Востановление представления стартовой страницы набора документов
3: /// </summary>
4: /// <param name="list">список/библиотека</param>
5: /// <param name="contentTypeName">Название типа содержимого</param>
6: /// <param name="viewName">имя представления</param>
7: private void ResetDocSetView(SPList list, string contentTypeName, string viewName) {
8: SPContentType contentType = null;
9: try { contentType = list.ContentTypes[contentTypeName]; } catch { }
10: if (contentType != null) {
11: DocumentSetTemplate docSetTemplate = DocumentSetTemplate.GetDocumentSetTemplate(contentType);
  12:         if ((docSetTemplate.WelcomePageView == null)  (docSetTemplate.WelcomePageView.Title != viewName)) {
  13:             SPView view = list.Views.TryGetView(viewName);    
  14:             if (view != null) {
  15:              docSetTemplate.WelcomePageView = view;  
  16:                 docSetTemplate.Update(true);    
  17:             } else {    
  18:                 msgError +=     
  19:                     string.Format("В списке [{1}] отсутствует представление [{0}]", viewName, list.Title);    
  20:             }    
  21:         }    
  22:     } else {    
  23:         msgError +=    
  24:             string.Format("В списке [{1}] отсутствует тип [{0}]", contentTypeName, list.Title);    
  25:     }    
  26: }
Technorati Tags: ,


пятница, декабря 31, 2010

Нда…

Как-то WordPress не торопится подтверждать мнение, что он лучший “движок” для блогов. Blogspot покруче будет – больше всякого правильно отображает…

Да, а “нравится” для мордокниги ни там, ни тут не отображаются, Tweet Meme – только на Blogspot. Тщательнее надо, тщательнее…



Тестирую новые плагины для Writer

Ну, для меня новые – давно не копался в этой галерее…

Now Playing – не фурычит, ни на WMP? ни на Foobar2000 Тошнит Палец вниз

Picasa 

   фурычит… Палец вверх

CodeFormatter Дай пять!

код текстом:

SP.Ribbon.PageState.PageStateHandler.prototype = {

getFocusedCommands:
function() {ULSMg8:;
return null;
},





код картинкой:





четверг, декабря 30, 2010

Сюрприз от DocumentSet

В неплохом типе (ContentType) “Набор документов” (DocumentSet) обнаруживается плохо замаскированная бомбочка замедленного действия (скорее, даже, забытый разработчиками мешок с мусором – как иногда хирурги забывают ножницы в животе пациента…).
В этом мешке валяются обращения к неведомым обработчикам событий этого типа данных. В обычных обстоятельствах эти вызовы ничем себя не обнаруживают, активизируются они при подключении других обработчиков (например, вот этого) и проявляются в виде замусоривания системного лога сообщениями вида:

Ошибка при загрузке и запуске приемника событий Microsoft.Office.DocumentManagement.DocumentSets.DocumentSetEventReceiver в Microsoft.Office.DocumentManagement, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c.
: В экземпляре объекта не задана ссылка на объект.

Поиск показывает, что сюрприз известен уже давно и благополучно пережил несколько “кумулятивных обновлений” Sharepoint 2010.
Лечится выбрасыванием мешка на помойку - удалением этих “обработчиков” (DocumentSetItemsEventReceiver и DocumentSetEventReceiver) из всех библиотек, использующих тип DocumentSet.
Technorati Tags:

Оказывается - 7

Для поля типа SPFieldUrl практически нельзя задать значение по умолчанию. Собственно, задать можно, но только в формате “<url>” – в этом случае поле в новом элементе получает формально правильное значение “<url>, <url>”, что эстетически как-то не очень…

Задание значения по умолчанию "в “эстетичном” формате “<url>, <title>” приводит к значению поля вида “<url>,, <title>, <url>, <title>”, что неверно не только эстетически, но и по сути – ссылка получается кривая.

Вот такой вот сюрприз…

Technorati Tags:

вторник, ноября 30, 2010

Значение ID из УРЛ страницы

В коде веб-части для получения значения параметра ID (да и любого другого) из УРЛа страницы, на которой веб-часть установлена, можно использовать LINQ-выражение:

   1: ID = (from urlParameterName in this.Page.Request.QueryString.AllKeys 
   2:       where urlParameterName.ToUpper() == "ID"
   3:       select this.Page.Request.QueryString[urlParameterName]).FirstOrDefault();

Выглядит забавно, написать сразу не получается (не то, что кучка циклов из MSDN), но преимуществ такого подхода много…

понедельник, ноября 29, 2010

Оказывается - 6

Свойства узла (SPWeb.Properties) являются “неистребимыми” – их можно добавлять, их значения можно менять, но их нельзя удалить. Формально, конечно, метод .Remove() существует и даже как бы действует, но при обновлении значения узла все свойства оказываются на месте. Можно действовать средствами PowerShell, можно средствами ОМ в программе на C# – эффект одинаков. Разница в том, что в C# можно установить значение в null, в PS присваивание $null присваивает пустую строку.

Вот такой маленький сюрпризик Дразнюсь.

Technorati Tags:

среда, ноября 17, 2010

Оказывается - 5

… что и MSDN не всегда говорит правду.

Например, читаем

An expression using the &= assignment operator, such as

x &= y

is equivalent to

x = x & y 

На практике оказывается, что эквивалентность для логических операндов наблюдается только в приведённом примере:

class AndAssignment
{
static void Main()
{
bool b = true;
b &= false;
Console.WriteLine(b);
}
}
/*
Output:
False
*/

Если же операнд y является вызовом какой-либо процедуры, то оператор &= эту процедуру вызывает всегда, независимо от значения x.

суббота, октября 30, 2010

Октябрьский CU

Установил неслабого такого размера (ок. 150 Мб) набор апдейтов для OSS 2010 422859_intl_x64_zip.exe и выяснил, что почитали MSDN!!! Пламенный приветСолнце

Споткнуться на ровном месте - 3

Очередной капкан обнаружился при попытке установить веб-часть на страницу просмотра для списка, который имеет поля типа FilteredLookup. Независимо от выбранной веб-части получаем исключение HRESULT: 0x80030102 (STG_E_REVERTED)) (использование уничтоженных ранее объектов). Такое же исключение получается и при попытке удалить с такой страницы ранее установленные веб-части.Раздраженный

Проведённое расследование показало, что поле не сильно и виновато: отладчик не фиксирует исключения в коде поля, а “страница сопровождения веб-частей” [_layouts/spcontnt.aspx]) удаление делает без проблем. Получается, редактор страниц как-то хитро взаимодействует с полем, при этом хитрость выходит боком. Что удивительно, для пользователей, а не для разработчиков.

Винт для этой хитрой зад примочки нашёлся довольно быстро – утилитой SPFExplorer (модификация под Шарепойнт-2010 старой моей утилиты) скопировал нужную веб-часть с другой страницы. И без использования уничтоженных объектов…

Придётся теперь плагин для утилиты сочинять… Кружка пива

пятница, октября 29, 2010

Оказывается - 4

Если объявить документ библиотеки или элемент списка “записью”, то это навсегда. Рецепт: активируйте “возможность” семейства сайтов “Управление записями по месту”, настройте по вкусу “Параметры объявления записей” и объявите документ в библиотеке записью при помощи появившейся кнопки на ленте.

Библиотека становится неудаляемой, а снять свойство “записи” с документа не удаётся - кнопка не имеет обещанного пункта подменю для снятия отметки

image

а нажатие на кнопку лишь повторяет “объявление”
image

Теперь избавиться от этой радости можно только вместе с узлом…

Оказывается - 3

В Шарепойнте-2010 существуют неудаляемые списки. Вот как получить парочку таких: активируйте на узле “возможность” с дивным именем “Организатор контента”. На узле появляются два списка – “Библиотека-распределитель” и “Правила организатора контента”, удалить которые не удаётся (вне зависимости от активности “фичи”): в свойствах списков отсутствует пункт для удаления

image

использование утилиты тоже неудачно:


image

Только вместе с узлом… Где-то уже на грани диверсии Тошнит

суббота, октября 23, 2010

Оказывается - 2

Оба способа переноса узлов  (сохранение узла в качестве шаблона с последующим созданием нового и экспорт/импорт с использованием утилиты stsadm.exe) не восстанавливают содержимого полей типа “пользователь”. Метод с использованием шаблонов делает это молча, в протоколе импорта прискорбный факт отражён в виде предупреждения:

Warning: Не удается выполнить разрешение пользователя или группы 18

Ага, весьма информативно, хоть и лучше, чем ничего…

Оказывается…

Если форму редактирования элемента списка открывать обычным образом – кликом на ссылку мышкой, то форма просмотра/редактирования откроется в суперском (он же пуперский) интерфейсе, в настройках названном диалоговой формой.

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

Одно утешает: если у юзера нет разрешений на изменение параметров списка, то отключение диалоговых форм – временное.

Споткнуться на ровном месте - 2

Нет в жызни щастя… Подумал немножко над решениями проблемы общедоступных примечаний в формах, содержащих ссылки на другие формы, и пришёл к выводу, что выкрутиться можно, лишив юзера возможности наткнуться на глюк с “Доской заметок” – из формы просмотра master убрать ссылки на формы редактирования detail, а в форме редактирования master такие ссылки оставить, но убрать оттуда “Доску”. Всё это решается при помощи настройки вьюшек вполне стандартными способами, и сообщение об ошибке больше не вываливается.

Но скучно было бы жить, если бы всё было бы так просто – нашёлся капкан. Выяснилось, что при сохранении настроенного таким образом узла в качестве wsp-шаблона (что, собственно, является одной из целей мероприятия) получить полноценной копии путём создания нового узла по этому шаблону не удаётся – эти самые “Доски” не импортируются и на месте веб-части для написания заметок видим милое сообщение:

image

Но не всё так плохо – использование операций экспорта/импорта (stsadm –o export/import) приводит к желаемому результату – копия узла со всеми настройками в нужном месте. Осталось научиться использовать импорт в своих рабочих процессах…

среда, октября 20, 2010

Читают ли MSDN разработчики SPD 2010…

Вот сейчас точно знаю, что не читают. По крайней мере, не всё читают…

Выяснилось, что в РП в Sharepoint Designer 2010 невозможно без дополнительных танцев с бубном использовать действие “Создать элемент в списке”. SPD настоятельно предлагает заполнить обязательное поле с дивным названием “Путь и имя”. При помощи вот этой утилиты удалось выяснить, что имеется в виду поле списка “FileLeafRef” (каков переводчик - чудо!), про которое в MSDN сказано: “Required, but ignored if the list is not a document library.”. В соответствии с этим указанием все списки имеют атрибут этого поля required==true (в WSS3 такого не было и никаких проблем с этим полем - тоже). А так как разработчики MSDN не читали, то и выставляют перед изумлённой публикой требование заполнить обязательное поле (которое не совсем обязательное, а только немножко…) неведомо чем.

При помощи той же утилиты можно видеть, что значение поля имеет вид '1;#1_.000', однако в рамках РП подсунуть ему такое значение (равно как и любое другое) не удаётся и РП заканчивается сообщением об ошибке: “Обновить элемент в рабочем процессе не удалось, возможно потому, что в одном или нескольких столбцах для этого элемента должны содержаться данные другого типа.”.

Исправилась ситуация при помощи той же утилиты – атрибут required был установлен в false. После этого SDP успокоился, а РП начал исполняться как ожидалось…

Странно всё же, как такое было пропущено при тестировании действия. Получается одно из двух – либо обязательность для поля ввели после тестирования, либо тестирования не было вовсе…

Добавлено на другой день:

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

вторник, октября 19, 2010

Споткнуться на ровном месте…

Имеется ТЗ (типичное для систем master-details) на обеспечение возможности работать со списком details из форм просмотра и редактирования элементов списка master. Нормальное желание, да и средства для реализации в нынешней версии Шарепойнта вполне доступны: открываем на редактирование форму списка master и добавляем связанный список.

Радуемся результату и обнаруживаем следующий пункт ТЗ – элементы master должны иметь поле “Примечания”, которое может редактировать любой, имеющий доступ к списку. Тоже вполне типичное пожелание на разграничение доступа к полям списка, которое нормального решения не имеет и в нынешней версии Шарепойнта. Правда, в нынешней версии Sharepoint Server нашлась веб-часть “Доска заметок”, выводящая метаданные. Поставим и эту веб-часть на форму списка master – и ТЗ выполнено.

Но так гладко не бывает: выяснилось, что если открыть полученную форму в диалоговом окне (настройки по умолчанию, используется новомодный интерфейс) и из неё открыть на редактирование элемент detail, то при сохранении detail получим сообщение об ошибке

m-в-bug

Данные сохраняются, в чём ошибка состоит, выяснить не удалось (да не сильно и хотелось).

Обойти баг можно двумя способами – либо отключить новый интерфейс для списка master, либо убрать с формы “Доску заметок”. Что называется “оба хуже” Раздраженный. Даже не смешно… Шаблон узла с демонстрацией бага – здесь.

Как говорится, первый блин (с метаданными) - комом. Или с новым интерфейсом?

воскресенье, октября 10, 2010

Бля…

Пока удалял Live Sync (легальным способом, через Control Panel Дразнюсь), из меню пропали пункты для запуска Live-фотоальбома. И всего остального тоже – остались бесполезный Mesh, Writer и "семейная безопасность". Всё остальное переместилось в верхнюю часть списка “Все программы”. Зачем, почему – науке неизвестно… Запустил (опять же, легально) “восстановление” Live – в конце увидел просьбу (хорошо хоть, что не требование) о перезагрузке…

Бля… 2010 год на дворе, последний квартал его, а тут о перезагрузке просят… Когда уродов на фиг прогонят с работы, интересно? Удар

Добавил позже. И зря подумал, что про перезагрузку была просьба – то был приказ, подлежащий немедленному исполнению… Расплата пришла утром – при включении компьютер не поднялся из режима hibernate. Он, конечно, и без этого частенько не просыпается, но тут я точно всякие «вредные» программы вроде торрента выгрузил.

Live Mesh

Попробовал… Получилось, что мне программка совсем не нужна – рабочий компьютер у меня совмещён с домашним, нотебука/планшета для красивых встреч с заказчиками тоже нет… Синхронизацию с телефоном, которая могла бы пригодиться, отменили… Live Sync в процессе пробования Mesh работать перестала…

В общем, прощай, Live Sync, здравствуй, Dropbox.

Диверсификация…

Много лет уже пользуюсь Live Sync, в частности, для переноса каких-то файлов на удалённые компьютеры, в основном, на подшефные серверы (Win 2003/2008). Исправно всё работало, да и сейчас, собственно, работает.

Одно плохо – с выходом Live Essentials 2011 выяснилось, что новая версия Live Mesh (точнее, релиз – раньше она в бете пребывала) не желает жить вместе с Live Sync и устанавливаться на мои серверные системы Схожу с ума от злости. А версию Mesh некоторые хвалят, несмотря на неполную реализацию заявленных ранее возможностей? поэтому хотелось бы и с ней поработать.

Замена Live Sync отыскалась довольно скоро – в очередной рассылке Softodrom’а был Dropbox. Без вопросов установился на сервере и на моей “семёрке”, без вопросов переслал туда/сюда файлы… Понаблюдаем… Опять же, вспоминая приключения с Live Sphere, смена поставщика – дело хорошее.