Ejemplo n.º 1
0
        private string FormatFieldValue(DataRow article, string value, Field field, IReadOnlyDictionary <string, Dictionary <int, string> > valuesWithRelation)
        {
            if (value.Contains("\""))
            {
                value = value.Replace("\"", "\"\"");
            }

            if (field != null && !string.IsNullOrEmpty(value))
            {
                if (field.Type.DbType == DbType.String || field.Type.DbType == DbType.StringFixedLength)
                {
                    value = $"\"{value}\"";
                }
                else if (field.ExactType == FieldExactTypes.Boolean)
                {
                    value = MultistepActionHelper.BoolFormat(value);
                }
                else if (field.Type.DbType == DbType.Date || field.Type.DbType == DbType.DateTime || field.Type.DbType == DbType.DateTime2)
                {
                    value = MultistepActionHelper.DateCultureFormat(value, CultureInfo.CurrentCulture.Name, _settings.Culture);
                }
                else if ((field.Type.DbType == DbType.Double || field.Type.DbType == DbType.Decimal) && field.RelationType != RelationType.ManyToMany)
                {
                    value = MultistepActionHelper.NumericCultureFormat(value, CultureInfo.CurrentCulture.Name, _settings.Culture);
                    if (value.Contains(_settings.Delimiter))
                    {
                        value = $"\"{value}\"";
                    }
                }
            }

            if (field != null && (field.RelationType == RelationType.ManyToMany || field.RelationType == RelationType.ManyToOne))
            {
                value = string.Empty;
                var mapValue = field.RelationType == RelationType.ManyToMany ? field.LinkId.Value.ToString() : article["content_Item_id"] + "_" + field.Id;
                if (valuesWithRelation.TryGetValue(mapValue, out var mappings) && mappings.Any())
                {
                    var key = field.ContentId == _contentId ? IdentifierFieldName : string.Format(FieldNameHeaderTemplate, field.Content.Name, IdentifierFieldName);
                    if (int.TryParse(article[key].ToString(), out var id))
                    {
                        if (mappings.TryGetValue(id, out var items))
                        {
                            value = items.Replace(",", ";");
                        }
                    }
                }

                value = $"\"{value}\"";
            }

            if (string.IsNullOrEmpty(value) || value == "\"\"")
            {
                value = "NULL";
            }

            return(value);
        }
Ejemplo n.º 2
0
        private void FormatFieldValue(Field field, string value, ref FieldValue fieldDbValue)
        {
            switch (field.ExactType)
            {
            case FieldExactTypes.Numeric:
                fieldDbValue.Value = MultistepActionHelper.NumericCultureFormat(value, _importSettings.Culture, "en-US");
                break;

            case FieldExactTypes.Date:
                fieldDbValue.Value = MultistepActionHelper.DateCultureFormat(value, _importSettings.Culture, "en-US");
                break;

            case FieldExactTypes.Time:
                fieldDbValue.Value = MultistepActionHelper.DateCultureFormat(value, _importSettings.Culture, "en-US");
                break;

            case FieldExactTypes.DateTime:
                fieldDbValue.Value = MultistepActionHelper.DateCultureFormat(value, _importSettings.Culture, "en-US");
                break;

            case FieldExactTypes.O2MRelation:
                fieldDbValue.Value = MultistepActionHelper.O2MFormat(value);
                break;

            case FieldExactTypes.M2MRelation:
                fieldDbValue.NewRelatedItems = MultistepActionHelper.M2MFormat(value).ToArray();
                fieldDbValue.Value           = field.LinkId?.ToString();
                break;

            case FieldExactTypes.M2ORelation:
                break;

            default:
                fieldDbValue.Value = value;
                break;
            }
        }
Ejemplo n.º 3
0
        private void WriteFieldValues()
        {
            var articles = GetArticlesForExport(_settings.FieldsToExpandSettings);
            var aliases  = _settings.FieldsToExpandSettings.Select(n => n.Alias).ToArray();

            var fields          = _extensionContents.SelectMany(c => c.Fields).Concat(FieldRepository.GetFullList(_contentId)).ToList();
            var ids             = articles.AsEnumerable().Select(n => (int)n.Field <decimal>("content_item_id")).ToArray();
            var extensionIdsMap = _extensionContents.ToDictionary(c => c.Id, c => articles
                                                                  .AsEnumerable()
                                                                  .Select(n => n.Field <decimal?>(string.Format(FieldNameHeaderTemplate, c.Name, IdentifierFieldName)))
                                                                  .Where(n => n.HasValue)
                                                                  .Select(n => (int)n.Value)
                                                                  .ToArray()
                                                                  );

            if (articles.Any())
            {
                var dict = fields
                           .Where(n => n.ExactType == FieldExactTypes.M2MRelation && articles[0].Table.Columns.Contains(n.ContentId == _contentId ? n.Name : string.Format(FieldNameHeaderTemplate, n.Content.Name, n.Name)))
                           .Select(n => new { LinkId = n.LinkId.Value, n.ContentId })
                           .ToDictionary(n => n.LinkId, m => ArticleRepository.GetLinkedItemsMultiple(m.LinkId, m.ContentId == _contentId ? ids : extensionIdsMap[m.ContentId]));

                foreach (var article in articles)
                {
                    _sb.AppendFormat("{0}{1}", article["content_item_id"], _settings.Delimiter);
                    foreach (DataColumn column in article.Table.Columns)
                    {
                        var value = article[column.ColumnName].ToString();
                        var field = fields.FirstOrDefault(f => f.ContentId == _contentId ? f.Name == column.ColumnName : string.Format(FieldNameHeaderTemplate, f.Content.Name, f.Name) == column.ColumnName);
                        var alias = aliases.FirstOrDefault(n => aliases.Contains(column.ColumnName));
                        if (!string.IsNullOrEmpty(alias))
                        {
                            _sb.AppendFormat("{0}{1}", FormatFieldValue(value), _settings.Delimiter);
                        }
                        else if (field != null)
                        {
                            _sb.AppendFormat("{0}{1}", FormatFieldValue(article, value, field, dict), _settings.Delimiter);
                        }
                        else if (_extensionContents.Any(c => string.Format(FieldNameHeaderTemplate, c.Name, IdentifierFieldName) == column.ColumnName))
                        {
                            _sb.AppendFormat("{0}{1}", string.IsNullOrEmpty(value) ? "NULL" : value, _settings.Delimiter);
                        }
                    }

                    if (!_settings.ExcludeSystemFields)
                    {
                        foreach (var fieldValue in new[]
                        {
                            MultistepActionHelper.DateCultureFormat(article[FieldName.Created].ToString(), CultureInfo.CurrentCulture.Name, _settings.Culture),
                            MultistepActionHelper.DateCultureFormat(article[FieldName.Modified].ToString(), CultureInfo.CurrentCulture.Name, _settings.Culture),
                            article[FieldName.UniqueId].ToString(),
                            "0"
                        })
                        {
                            _sb.Append(fieldValue);
                            _sb.Append(_settings.Delimiter);
                        }
                    }

                    _sb.Append(_settings.LineSeparator);
                }
            }

            using (var sw = new StreamWriter(_settings.UploadFilePath, true, Encoding.GetEncoding(_settings.Encoding)))
            {
                sw.Write(_sb.ToString());
            }

            _processedItemsCount = articles.Count;
        }
Ejemplo n.º 4
0
        private void WriteFieldValues()
        {
            var articles = GetArticlesForExport(_settings.FieldsToExpandSettings);
            var aliases  = _settings.FieldsToExpandSettings.Select(n => n.Alias).ToArray();

            var fields          = _extensionContents.SelectMany(c => c.Fields).Concat(FieldRepository.GetFullList(_contentId)).ToList();
            var ids             = articles.AsEnumerable().Select(n => (int)n.Field <decimal>("content_item_id")).ToArray();
            var extensionIdsMap = _extensionContents.ToDictionary(c => c.Id, c => articles
                                                                  .AsEnumerable()
                                                                  .Select(n => n.Field <decimal?>(string.Format(FieldNameHeaderTemplate, c.Name, IdentifierFieldName)))
                                                                  .Where(n => n.HasValue)
                                                                  .Select(n => (int)n.Value)
                                                                  .ToArray()
                                                                  );

            if (articles.Any())
            {
                var dict = fields
                           .Where(n => n.ExactType == FieldExactTypes.M2MRelation && articles[0].Table.Columns.Contains(n.ContentId == _contentId ? n.Name : string.Format(FieldNameHeaderTemplate, n.Content.Name, n.Name)))
                           .Select(n => new { LinkId = n.LinkId.Value, n.ContentId })
                           .ToDictionary(n => n.LinkId.ToString(), m => ArticleRepository.GetLinkedItemsMultiple(m.LinkId, m.ContentId == _contentId ? ids : extensionIdsMap[m.ContentId], true));

                var m2oFields = fields.Where(w => w.ExactType == FieldExactTypes.M2ORelation).ToArray();
                foreach (var field in m2oFields)
                {
                    var m2ODisplayFieldName = ContentRepository.GetTitleName(field.BackRelation.ContentId);
                    var m2OValues           = ArticleRepository.GetM2OValues(articles.AsEnumerable().Select(n => (int)n.Field <decimal>("content_item_id")).ToList(),
                                                                             field.BackRelation.ContentId,
                                                                             field.Id,
                                                                             field.BackRelation.Name,
                                                                             m2ODisplayFieldName);

                    foreach (var value in m2OValues)
                    {
                        var key = value.Key.Item1 + "_" + value.Key.Item2;
                        dict.Add(key, new Dictionary <int, string>()
                        {
                            { value.Key.Item1, string.Join(",", value.Value) }
                        });
                    }
                }

                foreach (var article in articles)
                {
                    _sb.Append(_contentId);
                    _sb.Append(_settings.Delimiter);
                    _sb.AppendFormat("{0}{1}", article["content_item_id"], _settings.Delimiter);
                    foreach (DataColumn column in article.Table.Columns)
                    {
                        var value = article[column.ColumnName].ToString();
                        var field = fields.FirstOrDefault(f => f.ContentId == _contentId
                            ? string.Equals(f.Name, column.ColumnName, StringComparison.InvariantCultureIgnoreCase)
                            : string.Equals(string.Format(FieldNameHeaderTemplate, f.Content.Name, f.Name), column.ColumnName, StringComparison.InvariantCultureIgnoreCase));
                        var alias = aliases.FirstOrDefault(n => aliases.Contains(column.ColumnName, StringComparer.InvariantCultureIgnoreCase));
                        if (!string.IsNullOrEmpty(alias))
                        {
                            _sb.AppendFormat("{0}{1}", FormatFieldValue(value), _settings.Delimiter);
                        }
                        else if (field != null)
                        {
                            _sb.AppendFormat("{0}{1}", FormatFieldValue(article, value, field, dict), _settings.Delimiter);
                        }
                        else if (_extensionContents.Any(c => string.Equals(string.Format(FieldNameHeaderTemplate, c.Name, IdentifierFieldName), column.ColumnName, StringComparison.InvariantCultureIgnoreCase)))
                        {
                            _sb.AppendFormat("{0}{1}", string.IsNullOrEmpty(value) ? "NULL" : value, _settings.Delimiter);
                        }
                    }

                    if (!_settings.ExcludeSystemFields)
                    {
                        foreach (var fieldValue in new[]
                        {
                            MultistepActionHelper.DateCultureFormat(
                                article[FieldName.Created].ToString(), CultureInfo.CurrentCulture.Name, _settings.Culture),
                            MultistepActionHelper.DateCultureFormat(
                                article[FieldName.Modified].ToString(), CultureInfo.CurrentCulture.Name, _settings.Culture
                                ),
                            article[FieldName.UniqueId].ToString(),
                            "0"
                        })
                        {
                            _sb.Append(fieldValue);
                            _sb.Append(_settings.Delimiter);
                        }
                    }

                    _sb.Append(_settings.LineSeparator);
                }
            }

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            using (var sw = new StreamWriter(_settings.UploadFilePath, true, Encoding.GetEncoding(_settings.Encoding)))
            {
                sw.Write(_sb.ToString());
            }

            _processedItemsCount = articles.Count;
        }