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ś
}
}
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:
- Skopiować aktualne assembly z Timer Jobem do GAC (gacutil -if),
- Wykonać iisreset /noforce (lub zrestartować odpowiednią pulę aplikacji: cscript.exe "c:\windows\system32\iisapp.vbs" /a NazwaMojejPuliAplikacji /r (co trwa znacznie krócej),
- Aktywować funkcję (czyli feature), (Ustawienia witryny -> Funkcje zbioru witryn lub Funkcje witryny)
- 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.
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.