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); }
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; } }
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; }
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; }