public override void Install(SiteInitializer initializer)
         {
             base.Install(initializer);
  
             string resourceAssembly = this.GetType().Assembly.FullName;
             string customTemplatesArea = "Product catalog SDK sample";
             string friendlyWidgetName = "Products catalog sample widget";
              
             initializer.RegisterControlTemplate(MasterListView.titlesOnlyLayoutTemplateName, typeof(MasterListView).FullName, ProductsDefinitions.FrontendTitlesOnlyListViewName, null, customTemplatesArea, Presentation.AspNetTemplate, friendlyControlName:friendlyWidgetName );
             initializer.RegisterControlTemplate(MasterListView.titlesDatesLayoutTemplateName, typeof(MasterListView).FullName, ProductsDefinitions.FrontendTitlesDatesListViewName, null, customTemplatesArea, Presentation.AspNetTemplate, friendlyControlName: friendlyWidgetName);
             initializer.RegisterControlTemplate(MasterListView.titlesDatesSummariesLayoutTemplateName, typeof(MasterListView).FullName, ProductsDefinitions.FrontendTitlesDatesSummariesListViewName, null, customTemplatesArea, Presentation.AspNetTemplate, friendlyControlName: friendlyWidgetName);
             initializer.RegisterControlTemplate(MasterListView.titlesDatesContentsLayoutTemplateName, typeof(MasterListView).FullName, ProductsDefinitions.FrontendTitlesDatesContentsListViewName, null, customTemplatesArea, Presentation.AspNetTemplate, friendlyControlName: friendlyWidgetName);
             initializer.RegisterControlTemplate(ProductDetailsView.layoutTemplateName, typeof(ProductDetailsView).FullName, ProductsDefinitions.FrontendFullProductItemDetailViewName, null, customTemplatesArea, Presentation.AspNetTemplate, resourceAssembly, friendlyWidgetName);
  
             this.InstallCustomVirtualPaths(initializer);
             this.InstallCustomTaxonomies(initializer);
         }
  
         private void InstallCustomVirtualPaths(SiteInitializer initializer)
         {
             var virtualPathConfig = initializer.Context.GetConfig<VirtualPathSettingsConfig>();
             ConfigManager.Executed += new EventHandler<ExecutedEventArgs>(ConfigManager_Executed);
             var productsModuleVirtualPathConfig = new VirtualPathElement(virtualPathConfig.VirtualPaths)
             {
                 VirtualPath = ProductsModule.ProductsVirtualPath + "*",
                 ResolverName = "EmbeddedResourceResolver",
                 ResourceLocation = "ProductCatalogSample"
             };
             if (!virtualPathConfig.VirtualPaths.ContainsKey(ProductsModule.ProductsVirtualPath + "*"))
                 virtualPathConfig.VirtualPaths.Add(productsModuleVirtualPathConfig);
         }
  
         private void ConfigManager_Executed(object sender, Telerik.Sitefinity.Data.ExecutedEventArgs args)
         {
             if (args.CommandName == "SaveSection")
             {
                 var section = args.CommandArguments as VirtualPathSettingsConfig;
                 if (section != null)
                 {
                     // Reset the VirtualPathManager whenever we save the VirtualPathConfig section.
                     // This is needed so that our prefixes for the widget templates in the module assembly are taken into account.
                     VirtualPathManager.Reset();
                 }
             }
         }
  
 protected void InstallCustomTaxonomies(SiteInitializer initializer)
         {
             //installs the default Tags and Category taxonomies
             this.InstallTaxonomy(initializer, typeof(ProductItem));
  
  
             var metaMan = initializer.MetadataManager;
             var taxMan = initializer.TaxonomyManager;
  
             var flatTaxonomy = this.CreateTaxonomy<FlatTaxonomy>(initializer, "Colors", ColorsTaxonomyId, "Color");
  
             //if the module is reinstalled the taxa will be re-added so a check is needed
             if (initializer.TaxonomyManager.GetTaxonomy<FlatTaxonomy>(ColorsTaxonomyId).Taxa.Count() == 0)
             {
                 var taxon1 = initializer.TaxonomyManager.CreateTaxon<FlatTaxon>();
                 taxon1.Title = "Red";
                 taxon1.Name = "Red";
                 var taxon2 = initializer.TaxonomyManager.CreateTaxon<FlatTaxon>();
                 taxon2.Title = "Blue";
                 taxon2.Name = "Blue";
                 flatTaxonomy.Taxa.Add(taxon1);
                 flatTaxonomy.Taxa.Add(taxon2);
             }
  
             var type = metaMan.GetMetaType(typeof(ProductItem));
             if (type == null)
             {
                 type = metaMan.CreateMetaType(typeof(ProductItem));
             }
  
             if (!type.Fields.ToList().Any(fld => fld.FieldName == "Colors"))
             {
                 var field = metaMan.CreateMetafield("Colors");
                 field.TaxonomyProvider = taxMan.Provider.Name;
                 field.TaxonomyId = ColorsTaxonomyId;
                 field.IsSingleTaxon = false;
                 type.Fields.Add(field);
             }
  
             if (!type.Fields.ToList().Any(fld => fld.FieldName == "ProductImage"))
             {
                 type.Fields.Add(ContentLinksExtensions.CreateContentLinkField("ProductImage", "OpenAccessDataProvider", metaMan, RelationshipType.OneToOne));
             }
              
  
         }