Решения для sharepoint

Апрель 29, 2009

Пользовательское вычислимое поле для формы просмотра элемента списка

Filed under: Главная — admin @ 23:34

Sharepoint имеет два типа полей, предназначенных для вывода вычислимых значений на формах просмотра элемента списка – computed и calculated. Поля с типом calculated сохраняют свое значение в базе данных и обновляют его только при обновлении элемента списка. Поэтому это поле не может использоваться для отображения данных, которые могут изменитья независимо от элемента списка. Поле типа computed  вычисляет формулу , состоящую из значений других полей элемента списка. Разработчики не могут создавать пользовательские поля, наследующие этот тип поля (SPFieldComputed) и могут использовать только caml для задания формулы в схеме.
Поставленная задача – отображение в форме просмотра списка (обычно это dispform.aspx, но в принципе имя формы задается в схеме списка) данных, которые с одной стороны зависят от текущего элемента списка, а с другой независимы от него (в элементе списка item1 есть ссылка на другой элемент списка item2 и надо вывести, например, имя item2 в верхнем регистре).

Решение в целом:

Создать пользовательское поле, наследуемое от SPFieldText и переопределить метод RenderFieldForDisplay класса control, который отображает это поле.

Решение в деталях:

1. Создать проект visual studio с типом class library и создать новый класс:

// example of creating a custom field type
    public class SomeCustomField : SPFieldText
    {

        public SomeCustomField(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName) { }

        public SomeCustomField(SPFieldCollection fields, string typeName, string displayName)
            : base(fields, typeName, displayName) { }

        public override Microsoft.SharePoint.WebControls.BaseFieldControl FieldRenderingControl
        {
            get
            {
              
                BaseFieldControl control = new SomeCustomFieldControl();
                control.FieldName = this.InternalName;
                return control;
            }
        }
    }

    // custom field type uses helper class to initialize and render control
    public class SomeCustomFieldControl : BaseFieldControl
    {
           
        protected override string DefaultTemplateName
        {
            get
            {
                return @”SomeCustomFieldControl”;
            }
        }
      
        protected override void RenderFieldForDisplay(HtmlTextWriter output)
        {

            int IdOfItem2 = (int)this.ListItem["refid"];
            SPListItem item2 = this.ListItem.ParentList.GetItemById(IdOfItem2);
            string data = item2.Name.ToUpper();
            output.Write(data);
            base.RenderFieldForDisplay(output);
        }
 

    }

2.Откомпиллировать класс, создать сборку, подписать ее, и разместить в GAC.
(Как все просто в sharepoint ;) )

3.Создать SomeCustomField.ascx со следующим содержанием:

<SharePoint:RenderingTemplate ID=”SomeCustomFieldControl” runat=”server”>
  <Template>
 
  </Template>
</SharePoint:RenderingTemplate>

Скопировать этот файл в директорию Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES

3. Созать файл fldtypes_SomeCustomField.xml со следующим содержанием:
<?xml version=”1.0? encoding=”utf-8 ?>
<FieldTypes>
 

  <FieldType>
    <Field Name=”TypeName”>SomeCustomField</Field>
    <Field Name=”ParentType”>Text</Field>
    <Field Name=”TypeDisplayName”>SomeCustomField Status</Field>
    <Field Name=”TypeShortDescription”>SomeCustomField Status Field</Field>
    <Field Name=”UserCreatable”>TRUE</Field>
    <Field Name=”ShowInListCreate”>TRUE</Field>
    <Field Name=”ShowInSurveyCreate”>TRUE</Field>
    <Field Name=”ShowInDocumentLibraryCreate”>TRUE</Field>
    <Field Name=”ShowInColumnTemplateCreate”>TRUE</Field>
    <Field Name=”FieldTypeClass”>SomeCustomFieldAssembly.SomeCustomField, SomeCustomField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=11ae1111111ddd11</Field>
    <RenderPattern Name=”DisplayPattern”>
      <Switch>
        <Expr>
          <Column/>
        </Expr>
        <Case Value=”»>
        </Case>
        <Default>
       
          <Column SubColumnNumber=”0? HTMLEncode=”TRUE”/>
       
        </Default>
      </Switch>
    </RenderPattern>
  </FieldType>
 
 
</FieldTypes>

Скопировать его в папку Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML
4. Инсталлировать и активировать feature.xml:

<?xml version=”1.0? encoding=”utf-8? ?>
<!– _lcid=”1033 _version=”12.0.4017 _dal=”1 –>
<!– _LocalBinding –>
<Feature  Id=”11111111-1111-1111-85B9-5ED1D39C073B”
  Title=”CustomField”
  Description=”SomeCustomField Type”
  Version=”12.0.0.0?
  Scope=”Site”
  xmlns=”http://schemas.microsoft.com/sharepoint/” >
  <ElementManifests>
    <ElementManifest Location=”elements.xml”/>
  </ElementManifests>
</Feature>

where the elements.xml is:

 <Field ID=”{CA1A1D11-2123-4db7-B11A-1C0D05D01111}”
            Name=”SomeCustomFieldDerived”
            Group=”Custom”
           Type=”SomeCustomField”
           DisplayName=”SomeCustomField Derived”
           ShowInDisplayForm=”TRUE”
            Sortable=”FALSE”
            ReadOnly=”TRUE”
            Required=”false”   
            Hidden=”false”
      SourceID=”http://schemas.microsoft.com/sharepoint/v3”
      StaticName=”SomeCustomFieldDerived”
    
      />
 
Все сделано. Теперь можно добавлять наше поле к элементам списка или типам содержимого.

К этому полю нельзя будет делать caml запросы и реальное значение этого поля в элементах списка будет null, соответственно оно не будет отображаться на странице просмотра всех элементов списка allitems.aspx.

Март 21, 2009

Отладка асинхронно выполняющегося net кода в sharepoint

Filed under: Главная — admin @ 23:24

Отладка net кода вызываемого системой в sharepoint несколько затруднительна. Например, owstimer может вызывать пользовательский код методов раcчетов «expiration formula» независимо от пользователя. Поэтому простое подключение отладчика visual studio здесь невозможно. Выход из положения – вставить строчку в начало пользовательского кода Debug.Assert(1==2, «Some message»). При возникновении исключения нажать на кнопку Retry и открыть отладчик. Конечно, пользовательский код должен содержать отладочную информацию и не быть оптимизированным.

Февраль 7, 2009

Невозможно удалить папку forms в sharepoint

Filed under: Главная — Метки: — admin @ 14:40

Ошибка в версии wss 3.0 с sp1 приводит к невозможности удалить или переименовать папку с именем froms в библиотеке документов sharepoint, вне зависимости является ли она папкой первого уровня или подпапкой. Для исправления этого бага нужно скачать обновление для wss 3.0 (KB941422), (файл с именем Wss-kb941422-fullfile-x86-glb.exe).

URL to download:http://www.microsoft.com/downloads/details.aspx?FamilyID=78549f3c-3cd2-445e-9dc0-417ca5a4a079&displaylang=en

Июнь 26, 2008

Динамическое создание отчетов с помощью report viewer

Filed under: Главная — admin @ 16:40

Для динамического создания отчетов в report viewer можно использовать LoadReportDefinition метод этого элемента, передавая ему созданный «на лету» rdlc файл. Загрузите пример динамического создания отчетов. Скопируйте оба файла куда-нибудь на веб сайт и откройте RMReport.aspx файл в браузере. Вы можете задавать число колонок в отчете, вставляя его в url: RMReport.aspx?col=4. Для дополнительной информации об использовании report viewer в sharepoint смотрите использовании report viewer в среде sharepoint .
Удачи.

Май 13, 2008

Транзакции в Sharepoint 2007

Filed under: Главная — admin @ 16:39

При разработке приложения для sharepoint нам потребовалось сделать несколько операций с элементами листа как одно целое, например, переместить элемент и изменить его поле,  или обновить несколько элементов листа, при этом обновиться должны были либо все элементы, либо ничего. Объектная модель Sharepoint services не имеет методов работы с транзакциями. Поиски в интернет привели на статью в  форуме  http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2873895&SiteID=1. Модератор ссылаясь здесь на http://support.microsoft.com/kb/883316, указывал, что объектная модель sharepoint вообще их не поддерживает. Я видел ранее несколько других статей, которые советовали использовать Service Without Components http://weblogs.asp.net/paolopia/archive/2005/01/30/363312.aspx  или http://msmvps.com/blogs/anguslogan/archive/2005/07/19/58191.aspx и еще использовать новый для Net класс  TransactionScope http://www.eggheadcafe.com/software/aspnet/31533974/sharepoint-om–transacti.aspx. Я пробовал использовать Service Without Components и TransactionScope класс, но они не работали в sharepoint.  Поэтому, ссылка модератора  на Microsoft KB и аргумет, что распределенные транзакции основаны на  com+ технологии показались мне убедительными и привели к выводу, что проcто использовать транзакции в объектной модели sharepoint нельзя.  Но модератор форума, который отрицал возможность транзакций в ОМ sharepoint, советовал  использовать WF в Sharepoint для этого. Это показалось мне интересным и я продолжил поиски . Я нашел интересную статью http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1993200&SiteID=1, которая ссылалась на http://msdn2.microsoft.com/en-us/library/ms442249.aspx.  В MSDN говорилось, что Windows SharePoint Services-specific workflow activities пакетируюся и осуществляются в транзакции, но  code activities осуществляются сразу и без возможности отката. Но большинство SharePoint Services-specific workflow activities не могут быть использованы напряму в Visual Studio,  только посредством sharepoint Designer. Поэтому, я снова начал искать и нашел другую интересную статью  http://blogs.msdn.com/sharepointdesigner/archive/2007/07/06/porting-sharepoint-designer-workflows-to-visual-studio.aspx , которая показывала, как использовать SD workflow in VS.

Ноябрь 16, 2007

Использование элемента управления ReportViewer в Sharepoint

Filed under: Главная — admin @ 21:01

ReportViewer можно использовать в Sharepoint для вывода отчетов. Для этого нужно поместить ReportViewer на aspx страницу. Создать rdlc файл отчета, предназначенный для вывода табличных данных, например таблицы Name – Age. А затем  связать свойство ReportPath с файлом rdlc и добавить в коллекцию DataSources источник данных. Так как, эти свойства мы заполняем программно, то несложно модернизировать этот пример для работы с разными файлами rdlc, выводящими разные таблицы. Кроме того, можно использовать сессию для передачи источника данных в приведенный код. В этом случае формирование источника данных может происходить в другом месте.

В папкe ReportViewer находится полный код проекта, созданный в VS2005. Файлы MyReport.aspx и MyReport.aspx.cs нужно скопировать в директорию «layouts», а файл Report.rdlc в корень виртуальной директории вашего приложения, то есть там где находится файл web.config. Для проверки работы нужно ввести в браузер адрес вашего сайта и путь к странице  _layouts/MyReport.aspx. Результат показан на следующем рисунке:

Отчет

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

Ноябрь 13, 2007

Использование сессий в MOSS

Filed under: Главная — admin @ 17:51

По умолчанию сессии доступны на уровне ферм в sharepoint. Проверить это можно, если отркрыть:Central Administration ->Application Management ->Office SharePoint Server Shared Services ->Configure session state. Для того, чтобы использовать сессии в своем коде нужно либо разрешить сессии в web.config, либо на самих веб-страницах. В web.config за это отвечает строчка <pages enableSessionState=»true» … при этом строчка <add name=»Session» type=»System.Web.SessionState.SessionStateModule»/> должна быть вынута из комментариев. Чтобы включить поддержку сессий на отдельной веб-странице нужно просто установить EnableSessionState=»True» в директиве Page.

Powered by WordPress