private string GetLayoutFieldValue([NotNull] Item item, [NotNull] FieldEditorField field) { if (field.Value.TrimStart().StartsWith("{")) { return(GetLayoutFieldValueFromJson(item, field)); } return(field.Value); }
public override ActionResult SaveItems(RequestParameters requestParameters, Dictionary <string, string> fields) { var output = new JsonContentResultWriter(new StringWriter()); WriteMetaData(output); var fieldList = new List <FieldEditorField>(); foreach (var pair in fields) { var key = pair.Key; var value = HttpUtility.UrlDecode(pair.Value) ?? string.Empty; var parts = key.Split('/'); if (parts.Length != 5) { output.WriteError("Invalid Field Uri: " + key); continue; } var languageName = parts[2]; if (languageName == "-") { languageName = LanguageManager.DefaultLanguage.Name; } var versionNumber = parts[3]; if (versionNumber == "-") { versionNumber = "0"; } var databaseName = parts[0]; var itemId = parts[1]; var language = Language.Parse(languageName); var version = Version.Parse(versionNumber); var fieldId = parts[4]; var field = new FieldEditorField(databaseName, itemId, language, version, fieldId, value); fieldList.Add(field); } var items = new Dictionary <string, Item>(); foreach (var field in fieldList) { var key = field.DatabaseName + "/" + field.ItemId + "/" + field.Language + "/" + field.Version; if (!items.TryGetValue(key, out var item)) { var database = Factory.GetDatabase(field.DatabaseName); item = database.GetItem(field.ItemId, field.Language, field.Version); if (item == null) { output.WriteError("Item not found: " + field.ItemId + "/" + field.Language.Name + "/" + field.Version.Number); continue; } if (!item.Security.CanWrite(Context.User)) { output.WriteError("You do not have permission to write to this item: " + item.Paths.Path); continue; } items[key] = item; try { item.Editing.BeginEdit(); } catch (System.Exception ex) { output.WriteError("An exception occured while saving item: " + item.Paths.Path + "; " + ex.Message); continue; } } var itemField = item.Fields[field.FieldId]; if (itemField != null && string.Equals(itemField.Type, "layout", System.StringComparison.OrdinalIgnoreCase)) { // layout field needs special handling because of layout deltas var layoutFieldValue = GetLayoutFieldValue(item, field); LayoutField.SetFieldValue(itemField, layoutFieldValue); continue; } item[field.FieldId] = field.Value; } foreach (var pair in items) { pair.Value.Editing.EndEdit(); } return(output.ToContentResult()); }
private string GetLayoutFieldValueFromJson([NotNull] Item item, [NotNull] FieldEditorField field) { var writer = new StringWriter(); var output = new XmlTextWriter(writer) { Formatting = System.Xml.Formatting.Indented }; output.WriteStartElement("r"); var root = JObject.Parse(field.Value); var devicesArray = root.Value <JArray>("devices"); foreach (var device in devicesArray.OfType <JObject>()) { output.WriteStartElement("d"); output.WriteAttributeStringIf("id", ResolveItemFromIdOrName(item.Database, device.Value <string>("deviceId"), device.Value <string>("deviceName"))); output.WriteAttributeStringIf("l", ResolveItemFromIdOrName(item.Database, device.Value <string>("layoutId"), device.Value <string>("layoutName"))); foreach (var rendering in device.Value <JArray>("renderings").OfType <JObject>()) { var uniqueId = rendering.Value <string>("uniqueId"); if (string.IsNullOrEmpty(uniqueId)) { uniqueId = ID.NewID.ToString(); } output.WriteStartElement("r"); output.WriteAttributeString("id", ResolveItemFromIdOrName(item.Database, rendering.Value <string>("renderingId"), rendering.Value <string>("renderingName"))); output.WriteAttributeString("uid", uniqueId); output.WriteAttributeString("ds", rendering.Value <string>("datasource")); output.WriteAttributeString("ph", rendering.Value <string>("placeholder")); output.WriteAttributeStringIf("cac", rendering.Value <bool>("cacheable")); output.WriteAttributeStringIf("vbd", rendering.Value <bool>("varyByData")); output.WriteAttributeStringIf("vbdev", rendering.Value <bool>("varyByDevice")); output.WriteAttributeStringIf("vbl", rendering.Value <bool>("varyByLogin")); output.WriteAttributeStringIf("vbp", rendering.Value <bool>("varyByParameters")); output.WriteAttributeStringIf("vbqs", rendering.Value <bool>("varyByQueryString")); output.WriteAttributeStringIf("vbu", rendering.Value <bool>("varyByUser")); var parametersArray = rendering.Value <JArray>("parameters"); if (parametersArray != null && parametersArray.Count > 0) { var parameters = new UrlString(); foreach (var parm in parametersArray.OfType <JObject>()) { var key = parm.Value <string>("key"); var value = parm.Value <string>("value") ?? string.Empty; parameters.Parameters[key] = value; } output.WriteAttributeString("par", parameters.ToString()); } output.WriteEndElement(); } output.WriteEndElement(); } output.WriteEndElement(); return(writer.ToString()); }