コード例 #1
0
        private string GetLayoutFieldValue([NotNull] Item item, [NotNull] FieldEditorField field)
        {
            if (field.Value.TrimStart().StartsWith("{"))
            {
                return(GetLayoutFieldValueFromJson(item, field));
            }

            return(field.Value);
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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());
        }