Savecmsitem

Smartsite 8.0 - ...

De savecmsitem methode kan gebruikt worden om (content) items toe te voegen en/of te bewerken. De methode vereist geen parameters, maar wel een xml payload met daarin de wijzigingen en om welk item het gaat (op basis van een itemnummer of op basis van een code). Voor het toevoegen van een item dient (uiteraard) geen itemnummer opgenomen te worden in de xml maar wel een parent.

De xml volgt het formaat zoals deze ook door de manager en de CmsServer wordt gebruikt, en moet (dus) aan de volgende regels voldoen:

  • De elementen moeten de http://smartsite.nl/namespaces/metadocument/2.0 namespace gebruiken en alle elementnamen moeten lowercase gebruiken. 
  • Direct binnen de root node moet een entry node aanwezig zijn. Dit is de node waarbinnen de velden van een item moeten worden opgegeven.
  • De velden binnen de entry node moeten overeenkomen met logische veldnamen binnen het contenttype (maar dan altijd in lowercase).
  • Voor het wijzigen van een item moet een nr element aanwezig zijn met daarin het betreffende itemnummer, of eventueel een code element met daarin de code van het item.
  • Voor het toevoegen van een item moet een parent element aanwezig zijn, met daarin het itemnummer waaronder het nieuwe item moet worden toegevoegd. Ook een contenttype element is verplicht in dit geval, met daarin het nummer van het contenttype voor het nieuwe item.

Security

De diverse controles die worden uitgevoerd op het moment dat je binnen de manager een item wilt bewerken (danwel toevoegen) worden door de WebAPI ook uitgevoerd.
Dit houdt (o.a.) het volgende in:

  • Om een item te mogen bewerken moet de gebruiker content access hebben op het betreffende item.
  • Als het item een specifieke workflow status heeft, wordt gecontroleerd of de gebruiker het recht heeft om items te bewerken die deze workflow status hebben.
  • Als het item is toegekend aan een specifieke gebruiker of aan een groep, wordt gecontroleerd of de gebruiker overeenkomt danwel lid is van deze groep, voordat het bewerken wordt toegestaan.
  • Er wordt gecontroleerd of het item gelocked is (door een andere gebruiker). Zo niet, dan wordt het item gelocked voordat het item bewerkt wordt. 
    Het item kan dus alleen bewerkt worden (door de WebAPI) als het mogelijk is om een itemlock te verkrijgen.

Validaties

De WebAPI verschilt wel ten opzichte van het toevoegen/bewerken van items binnen de manager op het gebied van validaties. Binnen de manager wordt XForms als basis gebruikt om een formulier te genereren, waarmee het item toegevoegd of bewerkt wordt. Vrijwel alle validaties op basis van bijvoorbeeld CTFP's worden "vertaald" naar XForms restricties.

Maar vanuit de WebAPI wordt de XForms "tussenlaag" niet gebruikt. Daarom worden een aantal van deze restricties door de WebAPI niet afgedwongen.

C# voorbeeld

using (HttpClient client = new HttpClient()) 
{
// set Authorization header
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{options.Username}:{options.Password}"))
);

int itemNumber = 831;
XNamespace ns = XNamespace.Get("http://smartsite.nl/namespaces/metadocument/2.0");

// create example xml to update an item
XElement data = new XElement(ns + "data",
new XElement(ns + "entry",
new XElement(ns + "nr", itemNumber),
new XElement(ns + "title", $"WebApi test item - updated @ {DateTime.Now}"),
new XElement(ns + "body", $"Item updated using savecmsitem: {DateTime.Now}")
)
);

// call SaveCmsItem method
string requestUrl = $"{options.Url}/savecmsitem";
var httpContent = new StringContent(data.ToString());

var response = await client.PostAsync(requestUrl, httpContent);
return response.IsSuccessStatusCode;
}

WebAPI macro voorbeeld

<se:webapi username="username" password="password" method="savecmsitem" save="result">
<se:parameters>
<se:parameter name="payload">
<data xmlns="http://smartsite.nl/namespaces/metadocument/2.0">
<entry>
<nr>102320</nr>
<title>Item updated using WebApi macro [datum]</title>
<body>Item updated using WebApi macro [datum]</body>
</entry>
</data>
</se:parameter>
</se:parameters>
</se:webapi>