我试图将内容类型的列表/数组与产品相关联,即我有几种内容类型,在创建产品时,在Sitefinity电子商务中,我需要将此产品与多种内容类型相关联。 到目前为止,我创建了一个动态字段选择器来选择产品上的几种conten类型,直到我尝试保存它并且引发序列化错误的时候这种方法正常工作,因为我无法将此字段的类型设置为Guid [],就像内容类型字段一样,所以我选择了长文本。但由于它试图将Guid []转换为字符串,因此会引发错误。
任何关于如何做到这一点或提示的任何想法,以便我可以跟进?
答案 0 :(得分:0)
不幸的是,您无法在内置的Sitefinity内容模块中指定自定义Guid []字段以使用选择器,但是Falafel的人员有一篇博文,其中显示了如何通过代码添加选择器:{{3 }}
答案 1 :(得分:0)
好的,我认为我的工作正常...我基本上是在这个网站上提供我的解决方案:http://www.konstrui.nl/en/about-us/blog/daniel-plomp/2013/11/13/add-a-dynamic-content-selector-to-a-user-profile和http://blog.falafel.com/blogs/josh-morales/2013/07/09/selecting-dynamic-content-in-native-sitefinity-modules-with-custom-fields以编程方式添加字段。
但由于某种原因,它没有为视图添加字段(编辑和插入),所以我不得不手动添加它们。下面我将更详细地展示我的所作所为。
首先我通过Sitefinity Thunder生成了Sitefinity动态项目字段控件选择器,有关如何执行此操作的更多信息,请参阅第二个链接。
在Global.asax.cs上,我添加了以下代码:
private void Bootstrapper_Initialized(object sender, Telerik.Sitefinity.Data.ExecutedEventArgs e)
{
// Register the dynamic field selector
if (e.CommandName == "Bootstrapped")
{
RegisterFieldForProduct<AssetsSelectorElement>("Telerik.Sitefinity.DynamicTypes.Model.sf_ec_prdct_skillsoftpack", "Assets");
}
}
public static void RegisterFieldForProduct<T>(string productType, string fieldName)
where T : FieldControlDefinitionElement
{
// Check if the field is not already present for this content type
var catalogManager = CatalogManager.GetManager();
var itemClrType = TypeResolutionService.ResolveType(productType);
// Specify the persistent filed CLR type (e.g. String, Guid[], ContentLink).
// Please ensure your custom field has been properly implemented to work with that CLR type
var persistentFieldType = typeof(Guid[]);
var itemType = itemClrType.FullName;
// Check to see if the field exists
var fieldExists = GetMetaFieldsForType(itemType).SingleOrDefault(f => f.FieldName == fieldName) != null;
if (fieldExists) return;
// Add the metafield that will hold the data
App.WorkWith()
.DynamicData()
.Type(itemClrType)
.Field()
.TryCreateNew(fieldName, persistentFieldType)
.SaveChanges(true);
// Get correct module configuration depending on item type
var manager = ConfigManager.GetManager();
// Suppress the security
var suppressSecurityChecks = manager.Provider.SuppressSecurityChecks;
manager.Provider.SuppressSecurityChecks = true;
// Get Backend views(e.g. Edit, Create) configuration from ProductsBackendDefinitionName
var section = Config.Get<ContentViewConfig>();
const string definitionName = "ProductsBackendDefinitionName";
var backendSection = section.ContentViewControls[definitionName];
var views = backendSection.ViewsConfig.Values.Where(v => v.ViewType == typeof(DetailFormView));
foreach (DetailFormViewElement view in views)
{
if (view.ViewName.Contains("sf_ec_prdct_skillsoftpack") == true)
{
// If there are no custom fields added before, the new field will be placed in the CustomFieldsSection
var sectionToInsert = CustomFieldsContext.GetSection(view, CustomFieldsContext.customFieldsSectionName, itemType);
var fieldConfigElementType = TypeResolutionService.ResolveType(typeof(T).FullName);
// Create a new instance of our field configuration in the current view configuration
var newElement = Activator.CreateInstance(fieldConfigElementType, new object[] { sectionToInsert.Fields }) as T;
// Populate custom field values
if (newElement == null) continue;
newElement.DataFieldName = fieldName;
newElement.FieldName = fieldName;
newElement.Title = fieldName;
newElement.DisplayMode = FieldDisplayMode.Write;
sectionToInsert.Fields.Add(newElement);
manager.SaveSection(section);
}
}
// Save and restart the application
catalogManager.SaveChanges();
manager.Provider.SuppressSecurityChecks = suppressSecurityChecks;
SystemManager.RestartApplication(true);
}
在Sitefinity BackEnd上我必须手动添加字段视图,管理 - >设置 - >高级 - >目录 - &gt;控件 - &gt; ProductsBackendDefinitonName-&gt;视图 - &gt; {插入_视图} - &gt; Sections-&gt; Main Section-&gt; Fields
这里我选择了new new,选择AssetsDefinitionName(我的内容类型定义名称),然后我只在这个字段中添加了信息:
然后我重复相同的视图(edit_view)。
在此之后,我可以将内容类型列表与特定产品相关联。 我认为这就是这个,希望我没有忘记任何一步。