Beispiel #1
0
        private static string GetUrl(PlainArticleField field)
        {
            if (field == null) return null;
            var value = field.Value;

            if (value == null) return null;

            if
            (field.FieldId.HasValue &&
                !string.IsNullOrEmpty(field.Value)
                && (field.PlainFieldType == PlainFieldType.File
                    || field.PlainFieldType == PlainFieldType.DynamicImage
                    || field.PlainFieldType == PlainFieldType.Image)
            )
            {
                string baseUri = ObjectFactoryBase.Resolve<IDBConnector>().GetUrlForFileAttribute(field.FieldId.Value);
                return $"{baseUri}/{field.Value}";
            }
            else if (field.PlainFieldType == PlainFieldType.String || field.PlainFieldType == PlainFieldType.StringEnum)
            {
                return field.Value;
            }
            else
            {
                return null;
            }
        }
 private static bool HasEqualNativeValues(
     PlainArticleField plainArticleField, PlainArticleField otherPlainArticleField)
 {
     return(plainArticleField.NativeValue == null
             ? otherPlainArticleField.NativeValue == null
             : plainArticleField.NativeValue.Equals(otherPlainArticleField.NativeValue));
 }
Beispiel #3
0
        private void ComparePlainArticleField(PlainArticleField dbField, PlainArticleField tntField, string path)
        {
            Assert.Multiple(() =>
            {
                CompareArticleField(dbField, tntField, path);

                Assert.That(dbField.Value, Is.EqualTo(tntField.Value), $"{path}_Value");
                Assert.That(dbField.NativeValue, Is.EqualTo(tntField.NativeValue), $"{path}_NativeValue");
                Assert.That(dbField.PlainFieldType, Is.EqualTo(tntField.PlainFieldType), $"{path}_PlainFieldType");
            });
        }
Beispiel #4
0
 public string GetFileUrl(PlainArticleField field)
 {
     if (field != null &&
         field.FieldId.HasValue &&
         !string.IsNullOrEmpty(field.Value) &&
         (field.PlainFieldType == PlainFieldType.File ||
          field.PlainFieldType == PlainFieldType.DynamicImage ||
          field.PlainFieldType == PlainFieldType.Image))
     {
         string baseUri = ObjectFactoryBase.Resolve <IDBConnector>().GetUrlForFileAttribute(field.FieldId.Value);
         return($"{baseUri}/{field.Value}");
     }
     else
     {
         return("javascript:void();");
     }
 }
        private object GetPlainArticleFieldValue(PlainArticleField plainArticleField)
        {
            var fieldId = plainArticleField.FieldId ?? 0;
            var shortFieldUrl = _dbConnector.GetUrlForFileAttribute(fieldId, true, true);
            var longFieldUrl = _dbConnector.GetUrlForFileAttribute(fieldId, false, false);

            var value = plainArticleField.Value;
            
            if (plainArticleField.NativeValue == null || string.IsNullOrWhiteSpace(value))
            {
                return null;
            }
            
            switch (plainArticleField.PlainFieldType)
            {
                case PlainFieldType.File:
                {
                    var valueUrl = $@"{shortFieldUrl}/{value}";
                    var size = Common.GetFileSize(_factory, _loaderProperties, _dbConnector, fieldId, value, $"{longFieldUrl}/{value}");

                    return new PlainFieldFileInfo
                    {
                        Name = Common.GetFileNameByUrl(_dbConnector, fieldId, valueUrl),
                        FileSizeBytes = size,
                        AbsoluteUrl = valueUrl 
                    };
                }

                case PlainFieldType.Image:
                case PlainFieldType.DynamicImage:
                {
                    return $@"{shortFieldUrl}/{value}";
                }

                case PlainFieldType.Boolean:
                    return (decimal)plainArticleField.NativeValue == 1;

                default:
                    return plainArticleField.NativeValue;
            }
        }
Beispiel #6
0
        private object ConvertPlainField(PlainArticleField plainArticleField)
        {
            if (plainArticleField.NativeValue == null)
            {
                return(null);
            }

            switch (plainArticleField.PlainFieldType)
            {
            case PlainFieldType.Boolean:
                return((decimal)plainArticleField.NativeValue == 1);

            case PlainFieldType.O2MRelation:
                return((int)plainArticleField.NativeValue);

            case PlainFieldType.Classifier:
                return(_contentService.Read((int)(decimal)plainArticleField.NativeValue).NetName);

            default:
                return(plainArticleField.NativeValue);
            }
        }
Beispiel #7
0
        private object ConvertValue(PlainArticleField article, CallContext ctx)
        {
            var renderFileAsImage = GetBoolProperty(article, RenderFileFieldAsImage);

            var value = article.Value;

            if (article.PlainFieldType == PlainFieldType.VisualEdit || article.PlainFieldType == PlainFieldType.Textbox)
            {
                if (GetBoolProperty(article, RenderTextFieldAsXmlName))
                {
                    XElement parsedElement;

                    try
                    {
                        parsedElement = XElement.Parse("<r>" + value + "</r>");
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(string.Format("Ошибка при парсинге xml из поля {0}: {1}", article.FieldId, ex.Message), ex);
                    }

                    return(parsedElement.Nodes());
                }
                return(new XCData(value));
            }

            if (article.PlainFieldType == PlainFieldType.DateTime || article.PlainFieldType == PlainFieldType.Date)
            {
                if (!string.IsNullOrWhiteSpace(value))
                {
                    if (DateTime.TryParse(value, out var dt))
                    {
                        return(dt.ToString("yyyy-MM-ddTHH:mm:ss"));
                    }
                }
            }
            if (article.PlainFieldType == PlainFieldType.Numeric)
            {
                if (!string.IsNullOrWhiteSpace(value))
                {
                    if (decimal.TryParse(value, out var dt))
                    {
                        return(dt.ToString(CultureInfo.InvariantCulture).Replace(",", "."));
                        //при десериализации всегда нужна точка
                    }
                }
            }

            var fieldId = article.FieldId ?? 0;

            if (!string.IsNullOrWhiteSpace(value) && (
                    article.PlainFieldType == PlainFieldType.Image ||
                    article.PlainFieldType == PlainFieldType.DynamicImage ||
                    article.PlainFieldType == PlainFieldType.File
                    ))
            {
                var cnn           = ctx.Cnn;
                var fieldUrl      = cnn.GetUrlForFileAttribute(fieldId, false, false);
                var shortFieldUrl = cnn.GetUrlForFileAttribute(fieldId, true, true);
                var valueUrl      = $@"{shortFieldUrl}/{value}";

                if (article.PlainFieldType == PlainFieldType.File && !renderFileAsImage)
                {
                    var size = Common.GetFileSize(_factory, _loaderProperties, cnn, fieldId, value, $@"{fieldUrl}/{value}");
                    return(new[]
                    {
                        new XElement("Name", Common.GetFileNameByUrl(cnn, fieldId, valueUrl)),
                        new XElement("FileSizeBytes", size),
                        new XElement("AbsoluteUrl", valueUrl)
                    });
                }

                return(valueUrl);
            }

            return(value);
        }
        private ArticleField DeserializePlainField(Quantumart.QP8.BLL.Field plainFieldFromQP, IProductDataSource productDataSource, DBConnector connector)
        {
            var field = new PlainArticleField
            {
                PlainFieldType = (PlainFieldType)plainFieldFromQP.ExactType
            };

            switch (field.PlainFieldType)
            {
            case PlainFieldType.Date:
            case PlainFieldType.DateTime:

                DateTime?dt = productDataSource.GetDateTime(plainFieldFromQP.Name);

                if (dt.HasValue)
                {
                    field.Value = dt.ToString();

                    field.NativeValue = dt;
                }
                break;

            case PlainFieldType.Numeric:
            case PlainFieldType.O2MRelation:
            {
                object number;
                if (plainFieldFromQP.IsInteger ||
                    plainFieldFromQP.RelationType == RelationType.OneToMany)
                {
                    number = productDataSource.GetInt(plainFieldFromQP.Name);
                }
                else
                {
                    var dec = productDataSource.GetDecimal(plainFieldFromQP.Name);
                    number = !plainFieldFromQP.IsDecimal && dec.HasValue ? (object)Convert.ToDouble(dec) : dec;
                }

                if (number != null)
                {
                    field.Value = number.ToString();

                    field.NativeValue = number;
                }
            }
            break;

            case PlainFieldType.Image:
                string imageUrl = productDataSource.GetString(plainFieldFromQP.Name);

                if (imageUrl != null)
                {
                    string imageName = Common.GetFileNameByUrl(connector, plainFieldFromQP.Id, imageUrl);
                    field.NativeValue = field.Value = imageName;
                }
                break;

            case PlainFieldType.File:
                if (productDataSource is EditorJsonProductDataSource)
                {
                    string fileName = productDataSource.GetString(plainFieldFromQP.Name);
                    field.NativeValue = field.Value = fileName;
                }
                else
                {
                    IProductDataSource fileContainer = productDataSource.GetContainer(plainFieldFromQP.Name);

                    if (fileContainer != null)
                    {
                        string fileUrl  = fileContainer.GetString("AbsoluteUrl");
                        string fileName = Common.GetFileNameByUrl(connector, plainFieldFromQP.Id, fileUrl);
                        field.NativeValue = field.Value = fileName;
                    }
                }
                break;

            case PlainFieldType.Boolean:
            {
                decimal?number = productDataSource.GetDecimal(plainFieldFromQP.Name);

                if (number != null)
                {
                    field.Value = number.ToString();

                    field.NativeValue = number;
                }
            }
            break;

            default:
                field.NativeValue = field.Value = productDataSource.GetString(plainFieldFromQP.Name);
                break;
            }

            field.Value = field.Value ?? string.Empty;

            return(field);
        }
Beispiel #9
0
        private Article GetProduct(JToken productToken, JToken contentToken)
        {
            int    contentId    = contentToken.Value <int>("ContentId");
            int    statusTypeId = productToken.Value <int>("STATUS_TYPE_ID");
            string statusName   = _statusProvider.GetStatusName(statusTypeId);
            bool   isPublished  = statusName == PublishedStatusd;

            var product = new Article
            {
                Id                 = productToken.Value <int>("Id"),
                Archived           = productToken.Value <bool>("ARCHIVE"),
                Visible            = productToken.Value <bool>("VISIBLE"),
                IsPublished        = isPublished,
                Status             = statusName,
                Created            = productToken.Value <DateTime>("CREATED"),
                Modified           = productToken.Value <DateTime>("MODIFIED"),
                ContentId          = contentId,
                ContentName        = contentToken.Value <string>("ContentName"),
                ContentDisplayName = contentToken.Value <string>("ContentDisplayName"),
            };

            foreach (var fieldToken in contentToken["PlainField"])
            {
                var plainField = new PlainArticleField
                {
                    ContentId      = product.ContentId,
                    PlainFieldType = GetFieldType(fieldToken)
                };

                var numberType = GetNumberType(fieldToken);
                UpdateField(plainField, fieldToken);
                SetValue(plainField, productToken, numberType);
                product.Fields[plainField.FieldName] = plainField;
            }

            foreach (var fieldToken in contentToken["EntityField"])
            {
                var fieldType = GetFieldType(fieldToken);

                if (fieldType == PlainFieldType.M2MRelation || fieldType == PlainFieldType.M2ORelation)
                {
                    var multiField = new MultiArticleField {
                        ContentId = product.ContentId
                    };
                    UpdateField(multiField, fieldToken);
                    var articleTokens = productToken[multiField.FieldName];

                    if (articleTokens != null)
                    {
                        foreach (var articleToken in articleTokens)
                        {
                            var childContentToken = fieldToken["Content"];
                            var article           = GetProduct(articleToken, childContentToken);
                            multiField.Items.Add(article.Id, article);
                        }
                    }

                    product.Fields[multiField.FieldName] = multiField;
                }
                else if (fieldType == PlainFieldType.O2MRelation)
                {
                    var singleField = new SingleArticleField {
                        ContentId = product.ContentId
                    };
                    UpdateField(singleField, fieldToken);

                    var articleToken = productToken[singleField.FieldName];

                    if (articleToken != null)
                    {
                        var childContentToken = fieldToken["Content"];
                        var article           = GetProduct(articleToken, childContentToken);
                        singleField.Item = article;
                    }

                    product.Fields[singleField.FieldName] = singleField;
                }
                else
                {
                    throw new Exception($"EntityField has unsupportable type {fieldType}");
                }
            }

            foreach (var fieldToken in contentToken["ExtensionField"])
            {
                var extensionField = new ExtensionArticleField {
                    ContentId = product.ContentId
                };
                UpdateField(extensionField, fieldToken);

                var extensionId       = productToken.Value <int>(extensionField.FieldName);
                var childContentToken = fieldToken["Contents"].FirstOrDefault(c => c.Value <int>("ContentId") == extensionId);

                if (childContentToken != null)
                {
                    var article = GetProduct(productToken, childContentToken);
                    article.Id           = 0;
                    extensionField.Value = childContentToken.Value <string>("ContentId");
                    extensionField.Item  = article;
                    product.Fields[extensionField.FieldName] = extensionField;
                }
            }

            foreach (var fieldToken in contentToken["BackwardRelationField"])
            {
                var backwardField = new BackwardArticleField
                {
                    ContentId = product.ContentId,
                };

                UpdateField(backwardField, fieldToken);
                var articleToken = productToken[backwardField.FieldName];

                if (articleToken != null)
                {
                    foreach (var t in articleToken)
                    {
                        var childContentToken = fieldToken["Content"];
                        var article           = GetProduct(t, childContentToken);
                        backwardField.Items.Add(article.Id, article);
                    }
                }

                product.Fields[backwardField.FieldName] = backwardField;
            }

            return(product);
        }
Beispiel #10
0
        private object SetValue(PlainArticleField field, JToken productToken, NumberType numberType)
        {
            switch (field.PlainFieldType)
            {
            case PlainFieldType.Date:
            case PlainFieldType.Time:
            case PlainFieldType.DateTime:

                var dt = productToken.Value <DateTime?>(field.FieldName);

                if (dt.HasValue)
                {
                    field.Value = dt.Value.ToString(CultureInfo.CurrentCulture);

                    field.NativeValue = dt;
                }
                break;

            case PlainFieldType.Numeric:
            {
                object number = null;

                switch (numberType)
                {
                case NumberType.Int32:
                    number = productToken.Value <int?>(field.FieldName);
                    break;

                case NumberType.Int64:
                    number = productToken.Value <long?>(field.FieldName);
                    break;

                case NumberType.Decimal:
                    number = productToken.Value <decimal?>(field.FieldName);
                    break;

                case NumberType.Double:
                    number = productToken.Value <double?>(field.FieldName);
                    break;

                default:
                    break;
                }
                ;

                if (number != null)
                {
                    field.Value = number.ToString();

                    field.NativeValue = number;
                }
            }
            break;

            case PlainFieldType.Boolean:
            {
                var number = productToken.Value <bool?>(field.FieldName);

                if (number != null)
                {
                    var val = number.Value ? 1m : 0m;
                    field.NativeValue = val;
                    field.Value       = val.ToString(CultureInfo.InvariantCulture);
                }
            }
            break;

            default:
                field.Value       = productToken.Value <string>(field.FieldName);
                field.NativeValue = field.Value;
                break;
            }

            field.Value = field.Value ?? string.Empty;

            return(field);
        }
Beispiel #11
0
        private ArticleField CloneField(ArticleField field, string fieldName, Dictionary <Article, Article> articleMap)
        {
            var pField  = field as PlainArticleField;
            var sField  = field as SingleArticleField;
            var mField  = field as MultiArticleField;
            var eField  = field as ExtensionArticleField;
            var bField  = field as BackwardArticleField;
            var vField  = field as VirtualArticleField;
            var vmField = field as VirtualMultiArticleField;

            ArticleField clonnedField;

            if (pField != null)
            {
                clonnedField = new PlainArticleField
                {
                    NativeValue    = pField.NativeValue,
                    Value          = pField.Value,
                    PlainFieldType = pField.PlainFieldType
                };
            }
            else if (eField != null)
            {
                clonnedField = new ExtensionArticleField
                {
                    Aggregated   = eField.Aggregated,
                    SubContentId = eField.SubContentId,
                    Item         = eField.Item == null ? null : articleMap[eField.Item],
                    Value        = eField.Value
                };
            }
            else if (sField != null)
            {
                clonnedField = new SingleArticleField
                {
                    Aggregated   = sField.Aggregated,
                    SubContentId = sField.SubContentId,
                    Item         = sField.Item == null ? null : articleMap[sField.Item]
                };
            }
            else if (bField != null)
            {
                clonnedField = new BackwardArticleField
                {
                    SubContentId      = bField.SubContentId,
                    Items             = bField.Items.ToDictionary(itm => itm.Key, itm => articleMap[itm.Value]),
                    RelationGroupName = bField.RelationGroupName
                };
            }
            else if (mField != null)
            {
                clonnedField = new MultiArticleField
                {
                    SubContentId = mField.SubContentId,
                    Items        = mField.Items.ToDictionary(itm => itm.Key, itm => articleMap[itm.Value])
                };
            }
            else if (vField != null)
            {
                clonnedField = new VirtualArticleField
                {
                    Fields = vField.Fields
                };
            }
            else if (vmField != null)
            {
                clonnedField = new VirtualMultiArticleField
                {
                    VirtualArticles = vmField.VirtualArticles
                                      .Select(f => CloneField(f, fieldName, articleMap) as VirtualArticleField)
                                      .ToArray()
                };
            }
            else
            {
                throw new Exception($"Cant't process field {field.FieldName} for localization");
            }

            clonnedField.FieldName        = fieldName;
            clonnedField.ContentId        = field.ContentId;
            clonnedField.FieldId          = field.FieldId;
            clonnedField.CustomProperties = field.CustomProperties;
            clonnedField.FieldDisplayName = field.FieldDisplayName;

            return(clonnedField);
        }