Используйте Web Money - это очень удобно

среда, 30 апреля 2008 г.

Оптимизация кода.

При выполнении запросов к большим спискам > 1000 элементов код запросов выполняется очень медленно.
Тем более, что этот код обычно кроме обращения содержит еще какие-нибудь действия с найденными элементами.
Часто приходится использовать foreach для элементов списка или коллекций если нужно проверить какой-то флаг.
Хочу поделиться проблемами и моей оптимизацией решения.

1. Односторонняя синхронизация списка с базой данных: Кол-во элементов > 8000
время синхронизации ~десятых долей секунды. (Зависит от быстродействия сервера, время чтения списка ~ 8 сек. из базы ~ 3-4)
Решение: использование метода SPList.Items.GetDataTable(); И работа с dataSource. Конечно же не забывая о кодировках - в базе и списке sharepoint некоторые символы различаются.

2. Большой список, нужно найти элемент, или несколько - < 1% от общего числа.
Решение: использовать поиск sharepoint FullTextSqlSearch - работает на порядок быстрее чем SPQuery и, тем более чем перебор.
Элементы для изменения получаем используя getItemById().
ИД должен быть одним из параметров запроса.

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

3. Если код настолько громоздкий, что пользователь отваливается по таймауту, то мне приходит в голову решение с использованием вебсервисов и ajax - постепенное выполнение кода разбитого на этапы.

Дискуссия по этому вопросу Приветствуется!!!!

четверг, 24 апреля 2008 г.

Развертывание портала для просмотра из интернет.

Недавно развернул портал для просмотра заказчика через интернет.
Делается это довольно просто:
1. Расширяем веб приложение желательно на 80 порт т.к. это проще.
2. Задаем альтернативное имя типа portal.domen.ru если под таким именем зарегистрирован в DNS.
3. Если хочется проверить работоспособности то можно прописать в hosts ip (внутренний) portal.domen.ru Например для уменьшения трафика или из-за политики безопастности.

среда, 23 апреля 2008 г.

Кастомизированная форма dispForm, editForm и newForm

Очень интересная возможность для ограничения возможностей пользователей и добавления своей скриптовой обработки заполнения формы.

Источник
Порядок действий:
1. Копируем необходимую нам страницу с формой.
2. Удаляем на ней веб часть listForm
3. Вставляем custom listForm
4. Редактируем как хотим.
Мои замечания:
1. Если поле не должно быть редактируемым пользователем, можно взять значение из формы dispForm.
2. Если вы хотите предоставить различный функционал для различных уровней разрешения используйте контрол SharePoint:SPSecurityTrimmedControl, внутрь него кладите то что вам нужно.
Ну и конечно вы можете добавить и свои веб части и свои скрипты. Как результат можно получить гибкий инструмент для просмотри и редактирования элементов зависящий от прав, и вашей производственной необходимости.
Есть одна проблема для библиотек: если в библиотеке несколько типов содержимого переназначить форму не удасться.
Но можно скрыть родную и вставить свою рядом - будет работать, к сожалению только для одного типа содержимого т.е. для каждого типа содержимого нужно сделать свою форму, вставить их на одну страницу, а видимость реализовать с помощью скрипта на основании ContentType из URL или из значения соответствующего поля + необходимо реализовать обработку изменения типа содержимого.
Это несомненно большой минус этой кастомизации.
Кроме того при изменении параметров списка необходимо переделывать форму.

понедельник, 21 апреля 2008 г.

Кастомизация полей: дополнительная инфа.

Источник - ограничение видимой ширины поля.
Смысл в том, что в схеме полей добавить свойство в определениях поля
<fields>
<field name="Title" readonly="TRUE" required="FALSE" hidden="TRUE">
<field name="Name" displayname="Name" type="Text" displaysize="30">
<field name="Address" displayname="Address" type="Text">
<field name="City" displayname="City" type="Text" displaysize="20">
<field name="Country" displayname="Country" type="Text" displaysize="15">
</fields>

Т.е. есть возможность настраивать видимость полей и их параметры прямо в схеме в RenderPattern я так понимаю - это глобальная настройка в C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML\FLDTYPES.XML. Кроме того возможно эти свойства можно использовать для настройки других схемах - SCHEMA.XML для различных фич и типов данных - списков, библиотек - но это пока измышления проверю напишу или если кто-то проверит - напишите коммент и я поправлю блог.
Так же это доступно при определние своих полей на основе стандартных - просто копированием xml или в составе проекта - например рабочего процесса (workflow), когда мы создаем тип данных и наполняем его полями.

Или как я уже писал ранее можно настроить в стиле просмотра списка VWSTYLES.XML - в HTML тегах для конкретного представления.

Что больше подходит для вашего решения выбирайте сами.

четверг, 17 апреля 2008 г.

Hide Actions 2

Новая инфа:

Как убрать элементы в стандартном toolbar'е в формах изменения, создания, просмотра элемента
Как сделать кастомизированные dispForm и editForm
Соответвенно там в свойствах toolBar можно указать тип (New, Edit, Display) и получить различный набор кнопок.

К предыдущему посту про ECB Menu:
Пришлось лопатить core.js.
К сожалению сделать копию и прицепить к новой masterpage не удалось - Sharepoint цепляет core где-то еще.

Пример кода:

var mySiteURL = new String(); //мой код убираю меню на узле и ниже
mySiteURL = ctx.listUrlDir;
if (mySiteURL.search("sites/имяСемействаУзлов/имяУзла")!= -1)
{
//здесь измененное меню
}
else
{
//здесь без изменений
}

Вставить нужно в трех местах ищите:

AddManagePermsMenuItem
AddDocLibMenuItems(m, ctx)
AddListMenuItems(m, ctx)

среда, 16 апреля 2008 г.

Hide Custom Action

Actions list
Как убрать остальное
В общем придется убирать скриптами на странице. Т.к. core.js трогать не хочется.
И еще на закуску через веб часть

пятница, 11 апреля 2008 г.

Получение праметров для кастомизированного поля и что такое ONET.xml

Файл находится: C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL\XML\ONET.xml
Внутри BaseTypes находятся схемы стандартных полей sharepoint.
Наиболее интерсная информация которую можно оттуда почерпнуть это структура схемы и приемы использования ссылок на поля.
И самое интересное:
Права на просмотр содержимого - интуитивно понятно:

<DisplayPattern>
<IfHasRights>
<RightsChoices>
<RightsGroup PermEditListItems="required" />
</RightsChoices>
<Then>
<HTML>Есть права</HTML>
</Then>
<Else>
<HTML>Нет прав</HTML>
</Else>
</IfHasRights>
<CurrentRights />
</DisplayPattern>

Использование прав позволит вам отображать различное содержимое в столбце для различного типа пользователей - а это широкое место для маневра в кастомизации интерфейса.
А это получение permissionmask - <CurrentRights /> - текущие права пользователя
Важный параметр если вы используете стандартные javascript функции sharepoint.

четверг, 3 апреля 2008 г.

Кастомизируя стили...

Источники:MSDN (2003 sharepoint) и конечно google
Идеология...
Стиль по существу является XSLT преобразованием xml с содержанием списка.
Я уже писал по этому поводу.
Все что нам нужно это поправить html разметку в тегах CDATA.

Итак по адресу:

C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL\XML\VWSTYLES.XML
лежит этот замечательный файл в котором хранятся стили отображения для ListViewWebPart или проще говоря для библиотек и списков.

Хочу поделиться своими изысканиями в этой области:
1. Создать свой стиль проще всего через копирование.
Необходимо задать ему новый ИД больше 20.

2. Можно ограничить типы списков для которых будет работать ваш стиль:
например ID="34" DisplayName="Карточка(изменить)" BaseType="0" - для списков и библиотек или BaseType="1" для библиотек.

3. Когда вы создаете свой стиль необходимо внимательно посмотреть на ограничения по полям( особенно если вы пытаетесь переделать готовый стиль для библиотеки в стиль для списка.

Мои примеры:
1. Удалив содержимое <ViewHeader> и выравнив стиль (HTML теги которые открывались в этой области) вы получите отображение списка без заглавия.

2.
Добавив такую схему в <ViewBody> в каждой строке:
<HTML> <![CDATA[<a href="]]></HTML>
<ListProperty Select="DefaultViewUrl" HTMLEncode="TRUE"/>
<HTML><![CDATA[?FilterField1=ID&FilterValue1=]]></HTML>
<Field Name="ID" HTMLEncode="TRUE" />
<HTML><![CDATA[" >Подробнее...</a>]]></HTML>
Мы получим ссылку на основное представление списка в котором будет показываться только текущий элемент. Вместо DefaultViewUrl можно использовать страницу с вебчастью на которой отображается список.

Этот стиль предназанчен для перехода в представление в котором отображается только один элемент в таком стиле где нет элементов навигации по списку например для отображения многострочного поля с форматированием: мы видим только 1 поле во всей области. Таким образом можно отображать новости, страницы и т.п. HTML форматированную информацию.

Комбинируя изменение стиля и кастмизированное поле мы можем получить практически произвольный вид списка, с нашими скриптами и HTML контролами. Это богатый инструментарий как для дизайнера так и для разработчика.
Отдельно хочу обратить ваше внимание на заполнение значениями переменной ctx = new ContextInfo(); типа ContextInfo - из нее можно достать необходимую вам информацию о пользователе, списке и т.п.

В целом советую сначала прочитать про преобразование xml потом внимательно просмотреть схемы стилей (попытаться их прочитать) думаю через неделю вы сможете создать свой собственный стиль на базе существующего.

Удачи!