如何将内容类型与Sitefinity上的目录产品相关联?

时间:2014-04-03 19:43:20

标签: sitefinity

我试图将内容类型的列表/数组与产品相关联,即我有几种内容类型,在创建产品时,在Sitefinity电子商务中,我需要将此产品与多种内容类型相关联。 到目前为止,我创建了一个动态字段选择器来选择产品上的几种conten类型,直到我尝试保存它并且引发序列化错误的时候这种方法正常工作,因为我无法将此字段的类型设置为Guid [],就像内容类型字段一样,所以我选择了长文本。但由于它试图将Guid []转换为字符串,因此会引发错误。

任何关于如何做到这一点或提示的任何想法,以便我可以跟进?

2 个答案:

答案 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-profilehttp://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(我的内容类型定义名称),然后我只在这个字段中添加了信息:

  • DataFieldName - &gt;资产(我的字段名称)
  • 直写&GT;写
  • 字段名称 - &gt;资产(我的字段名称)
  • 字段类型 - &gt; SitefinityWebApp.Fields.Assets.AssetsSelector,SitefinityWebApp(我的动态项目字段控制选择器)

然后我重复相同的视图(edit_view)。

在此之后,我可以将内容类型列表与特定产品相关联。 我认为这就是这个,希望我没有忘记任何一步。