Wednesday, June 30, 2010

Чтобы больше этого не забывать

В веб-интерфейсах для разных операций, имеющих дело с API MOSS 2007 злокозненная функция RunWithElevatedPrivileges должна идти ДО открытия сайта и узла. Таким вот образом:

  1. SPSecurity.RunWithElevatedPrivileges(delegate(){

  2.   using (SPSite site = new SPSite("SITENAME"))

  3.   {

  4.     using (SPWeb web = site.OpenWeb())

  5.     {

  6.       // code goes here

  7.     }

  8.   }

  9. });

Friday, March 19, 2010

пропажа ListFormWebPart

Как известно, при изменении стандартных форм Sharepoint крайне важно не трогать ListFormWebPart на страницах NewForm, EditForm и DispForm; если её удалить, появятся ошибки вроде "Неправильный URL страницы" при нажатии на "Создать".
Если это всё-таки случилось, не надо спешить следовать рекомендациям Микрософта, удалять лист и делать всё заново, можно решить проблему куда проще.
Поскольку испортился только, скажем, NewForm.aspx, а EditForm.aspx у нас на месте, открываем неиспорченный файл и копируем весь код ListFormWebPart оттуда, после чего вставляем его в какую-нибудь WebPartZone. Код этот выглядит примерно вот так:

<WebPartPages:ListFormWebPart runat="server" __MarkupType="xmlmarkup" WebPart="true" __WebPartId="{2F5FA27F-56B9-46FC-90E1-85E853CA4204}" >
<WebPart xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">
 <Title>Переговорные</Title>
 <FrameType>Default</FrameType>
 <Description />
 <IsIncluded>true</IsIncluded>
 <PartOrder>1</PartOrder>
 <FrameState>Normal</FrameState>
 <Height />
 <Width />
 <AllowRemove>true</AllowRemove>
 <AllowZoneChange>true</AllowZoneChange>
 <AllowMinimize>true</AllowMinimize>
 <AllowConnect>true</AllowConnect>
 <AllowEdit>true</AllowEdit>
 <AllowHide>true</AllowHide>
 <IsVisible>false</IsVisible>
 <DetailLink />
 <HelpLink />
 <HelpMode>Modeless</HelpMode>
 <Dir>Default</Dir>
 <PartImageSmall />
 <MissingAssembly>Невозможно импортировать эту веб-часть.</MissingAssembly>
 <PartImageLarge />
 <IsIncludedFilter />
 <ExportControlledProperties>true</ExportControlledProperties>
 <ConnectionID>00000000-0000-0000-0000-000000000000</ConnectionID>
 <ID>g_2f5fa27f_56b9_46fc_90e1_85e853ca4204</ID>
 <ListName xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{8CCD4B47-F922-4630-8F18-527F71928E4A}</ListName>
 <ListItemId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">0</ListItemId>
 <ControlMode xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">Edit</ControlMode>
 <TemplateName xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">ListForm</TemplateName>
 <FormType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">6</FormType>
 <ViewFlag xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">1048576</ViewFlag>
</WebPart>
</WebPartPages:ListFormWebPart>


А теперь - магия: меняем ControlMode на New и FormType на 8. Тогда эти строчки будут выглядеть вот так:

 <ControlMode xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">New</ControlMode>
 <TemplateName xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">ListForm</TemplateName>
 <FormType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">8</FormType>


* This source code was highlighted with Source Code Highlighter.


Сохраняем файл. Вуаля! Всё заработало. Надеюсь, это сэкономит кому-нибудь пару часов бития головой об стену. :)

PS Для DispForm.aspx ControlMode, соответственно, Display, а FormType - 4.

Monday, February 01, 2010

динамические баннеры

Недавно мне понадобилось, чтобы на странице нашего Sharepoint портала были сменяющие друг друга баннеры. Поскольку оказалось, что стандартными средствами MOSS 2007 этого достичь нельзя, я решил написать такую веб-часть сама. Оказалось несложно:)
Управляется она тремя свойствами: ссылкой, именем библиотеки с изображениями для показа, и ссылкой на узел (относительной или абсолютной), где оная библиотека находится.

using System;
using System.Runtime.InteropServices;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using System.Web.UI.WebControls;

namespace RotatingBanner
{
  [Guid("e93d7943-5503-4894-9ca8-1ad9368d1153")]
  public class RotatingBannerWebPart : Microsoft.SharePoint.WebPartPages.WebPart
  {
    public string strURL = "";
    public string strImgPath = "";
    public string strList = "";
    HyperLink link = new HyperLink();

    // Свойства веб-части
    [Personalizable(), WebBrowsable, WebDisplayName("Ссылка")]
    public string URL
    {
      get
      {
        return this.strURL;
      }
      set
      {
        this.strURL = value;
        if (link != null)
        {
          link.NavigateUrl = this.URL;
        }
      }
    }
    [Personalizable(), WebBrowsable, WebDisplayName("Узел с библиотекой баннеров")]
    public string SPListURL
    {
      get
      {
        return this.strList;
      }
      set
      {
        this.strList = value;
      }
    }
    [Personalizable(), WebBrowsable, WebDisplayName("Название библиотеки баннеров")]
    public string ImgPath
    {
      get
      {
        return this.strImgPath;
      }
      set
      {
        this.strImgPath = value;
      }
    }

    public void RotatingImage()
    {
      this.ExportMode = WebPartExportMode.All;
    }

    protected override void CreateChildControls()
    {
      base.CreateChildControls();

      // Пробуем считать картинки из библиотеки
      try
      {
        if (strList != "")
        {
          // Подключаемся к указанному узлу
          SPSite site = new SPSite(strList);
          SPWeb web = site.OpenWeb();

          if (strImgPath != "")
          {
            // Подключаемся к указанной библиотеке
            SPList list = web.Lists[strImgPath];
            SPListItem item;
            SPListItemCollection items = list.Items;

            int iCount = 0;

            Random r = new Random();
            iCount = r.Next(0, list.ItemCount);
            item = items[iCount];

            string imageUrl = "/" + list.RootFolder.Url + "/" + item.Name;

            // Вставляем картинку с ссылкой в веб-часть
            link.ImageUrl = imageUrl;
            this.Controls.Add(link);
          }
          // Закрыть используемый узел
          site.Close();
          site.Dispose();
          web.Close();
          web.Dispose();
        }
      }
      catch (Exception ex)
      {
        TextField text = new TextField();
        text.Value = ex.Message;
        this.Controls.Add(text);
      }
    }
  }
}