Dodawanie własnego typu pola do SPList

by Piotrosz 18. June 2010
Wbudowany typ pola (kolumny), taki jak "Note", "Text" lub "Boolean" można dodać do listy (Microsoft.SharePoint.SPList) na przykład w następujący sposób:
if(!list.Fields.ContainsField("MojaNazwaPolaInternal"))
{
    list.Fields.Add("MojaNazwaPolaDisplay", SPFieldType.Note, false);
    list.Update();
}
czyli z wykorzystaniem typu wyliczeniowego SPFieldType w argumencie. Aby dodać własny typ pola (custom field type) do listy poprzez object model trzeba skorzystać z innego sposobu, bez posługiwania się SPFieldType:
if (!list.Fields.ContainsField("MojaNazwaPolaInternal"))
{
    SPField myField = list.Fields.CreateNewField("MojePole", "MojaNazwaPolaInternal");
    list.Fields.Add(myField);
    list.Update();
}
"MojePole" to type name określone w katalogu 12\TEMPLATE\XML, w pliku XML, który zgodnie z konwencją powinien mieć nazwę rozpoczynającą się od fldtypes:
<FieldTypes>
	<FieldType>
		<Field Name="TypeName">MojePole</Field>
		<Field Name="ParentType">Text</Field>
		...
	</FieldType>
</FieldTypes>
Klasa SPField ma właściwość TypeAsString, dzięki której można odróżnić typ nowego pola, np:
foreach (SPField field in list.Fields)
{
    if (field.TypeAsString == "MojePole")
    {
        // Rób coś
    }
}

Timer job w WSS

by Piotrosz 16. June 2010
Luźne fragmenty kodu związane z timer jobs w WSS. (Po dokładną dokumentację należy sięgnąć na przykład tutaj)

Dodawanie timer joba podczas aktywacji feature:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPSite site = (SPSite)properties.Feature.Parent;
    UnregisterJob(site);
    MyTimerJob job = new MyTimerJob(site.WebApplication);
    SPMinuteSchedule schedule = new SPMinuteSchedule();
    schedule.BeginSecond = 0;
    schedule.EndSecond = 59;
    schedule.Interval = 1; //w minutach 
    job.Schedule = schedule;
    job.Update();
 }
        
private void UnregisterJob(SPSite site)
{
    SPJobDefinitionCollection jobs = site.WebApplication.JobDefinitions;
    foreach (SPJobDefinition job in jobs)
    {
        if (job.Name == Globals.JobName)
            job.Delete();
    }
}
Klasa MyTimerJob
  
public class MyTimerJob : SPJobDefinition
{
    public MyTimerJob () : base() { }

    public MyTimerJob (SPWebApplication webApp)
    : base(Globals.JobName, webApp, null, SPJobLockType.ContentDatabase) 
    {
        this.Title = Globals.JobName;
    }

    public override void Execute(Guid targetInstanceId)
    {
        // Jakies czynności wykonywane przez timer job
    }
}
Namierzanie Timer jobs w centralnej administracji:
Administracja centralna -> Operacje -> Zakładka 'Konfiguracja globalna' -> Definicje zadań czasomierza oraz Stan zadań czasomierza

Debugowanie:
  1. Skopiować aktualne assembly z Timer Jobem do GAC (gacutil -if),
  2. Wykonać iisreset /noforce (lub zrestartować odpowiednią pulę aplikacji: cscript.exe "c:\windows\system32\iisapp.vbs" /a NazwaMojejPuliAplikacji /r (co trwa znacznie krócej),
  3. Aktywować funkcję (czyli feature), (Ustawienia witryny -> Funkcje zbioru witryn lub Funkcje witryny)
  4. Podłączyć się do procesu OWSTIMER.EXE (Debug -> Attach to process lub CTRL+ALT+P)
W moim przypadku czasami debugger nie chciał się przypinać i wtedy pomagał restart serwisu Windows SharePoint Services Timer.

Tags:

WSS

Zapisywanie ustawienia web parta poza EditorPart

by Piotrosz 16. June 2010
Mały przykład zapisywania ustawień WebParta w klasie Web Parta (w tym przykładzie dziedziczącej Microsoft.SharePoint.WebPartPages.WebPart). Należy sprawdzić czy użytkownik ma prawo do zapisywania swoich ustawień:
void btnSave_Click(object sender, EventArgs e)
{
    if (SPContext.Current.Web.DoesUserHavePermissions(SPBasePermissions.UpdatePersonalWebParts))
    {
        this.SomeProperty = "Some Value";
        this.SaveProperties = true;
        //SetPersonalizationDirty();
    }
}

[Personalizable(PersonalizationScope.User)]
[WebBrowsable(false)]
public string SomeProperty { get; set;}

this.SaveProperties=true; należy zastosować, gdy klasa web parta dziedziczy z ,Microsoft.SharePoint.WebPartPages.WebPart a SetPersonalizationDirty(), gdy klasa web parta dziedziczy z System.Web.UI.WebControls.WebParts.WebPart.

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen