Plato OceanIX
La forma estrecha y los colores claros de Plato son la esencia del diseño danés, expresado sin palabras a través del cuello y la parte posterior de forma cónica y el radio de tamaño reducido.
Error executing template "Designs/Swift/Paragraph/Swift_ProductComponentSlider.cshtml" System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=21039; handshake=0; ---> System.ComponentModel.Win32Exception (258): The wait operation timed out. at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.Open() at Dynamicweb.Data.DatabaseConnectionProvider.CreateNamedConnection(String connectionName, Boolean open) at Dynamicweb.Data.Database.CreateDataReader(CommandBuilder commandBuilder, IDbConnection connection, IDbTransaction transaction, Int32 commandTimeout, String connectionName) at Dynamicweb.Ecommerce.Products.ProductRepository.GetProductsBySql(CommandBuilder query) at Dynamicweb.Ecommerce.Products.ProductRepository.GetProductsByProductIDsAndVariantIDs(IEnumerable`1 idCombinations, IEnumerable`1 productLanguageIds) at Dynamicweb.Ecommerce.Products.ProductRepository.BulkGetProductsByProductIDsAndVariantIDs(List`1 idCombinations, String productLanguageId) at Dynamicweb.Ecommerce.Products.Internal.ProductServiceCacheStorage.FetchMissingProducts(IEnumerable`1 keys) at Dynamicweb.Caching.ServiceCache`2.GetCache(IEnumerable`1 keys) at Dynamicweb.Ecommerce.Products.ProductService.GetActiveRelations(String productId, String variantId, String languageId, String shopId, String countryCode) at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetRelatedGroups(ProductViewModelSettings settings, Product product) at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at CompiledRazorTemplates.Dynamic.RazorEngine_e5a9278a62574353b9164b534bbe30b8.ExecuteAsync() at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate() ClientConnectionId:e0f59e81-8051-4257-99dd-37fa5505db0b Error Number:-2,State:0,Class:11
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Core 3 @using Dynamicweb.Ecommerce.ProductCatalog 4 5 @{ 6 ProductViewModel product = null; 7 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 8 { 9 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 10 } 11 else if (Pageview.Page.Item["DummyProduct"] != null && Pageview.IsVisualEditorMode) 12 { 13 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); 14 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); 15 16 if (productList?.Products is object) 17 { 18 product = productList.Products[0]; 19 } 20 } 21 22 string layout = Model.Item.GetRawValueString("Layout") == "slider" ? "ProductSliderComponent" : "ProductGridComponent"; 23 string lazyHeight = Model.Item.GetBoolean("SetMinHeightForLazyLoading") ? "min-height: 360px" : ""; 24 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 25 26 //Link generation 27 string pageId = Model.Item.GetLink("ProductSliderServicePage") != null ? Model.Item.GetLink("ProductSliderServicePage").PageId.ToString() : ""; 28 string servicePageByNavigationTag = GetPageIdByNavigationTag("ProductSliderService") != 0 ? GetPageIdByNavigationTag("ProductSliderService").ToString() : ""; 29 pageId = pageId == "" ? servicePageByNavigationTag : pageId; 30 31 string url = "/Default.aspx?ID=" + pageId; 32 33 if (Pageview.IsVisualEditorMode) 34 { 35 url += "&VisualEdit=True"; 36 } 37 38 bool isLazyLoadingForProductInfoEnabled = Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsLazyLoadingForProductInfoEnabled"]); 39 if (isLazyLoadingForProductInfoEnabled) 40 { 41 url += "&getproductinfo=true"; 42 } 43 44 url += $"&ProductListPartial={layout}"; //Use this to render either a slider or a grid 45 46 //Source type 47 string sourceType = Model.Item.GetRawValueString("RelationType", "trending"); 48 IList<string> relateFromProductIds = new List<string> { }; 49 IList<string> relateFromProductVariantIds = new List<string> { }; 50 IList<string> relateFromGroupIds = new List<string> { }; 51 bool hasVariants = false; 52 53 54 ProductListViewModel relateToViewModel = Model.Item.GetValue<ProductListViewModel>("RelateTo"); 55 56 //--- PRODUCTS --- 57 if (sourceType == "variants" || sourceType == "frequently" || sourceType == "selected") 58 { 59 if (relateToViewModel?.Products != null) 60 { 61 hasVariants = relateToViewModel.Products.Any(p => !string.IsNullOrEmpty(p.VariantId)); 62 foreach (var fromProduct in relateToViewModel.Products) 63 { 64 if (hasVariants) 65 { 66 if (!string.IsNullOrEmpty(fromProduct.VariantId)) 67 { 68 relateFromProductVariantIds.Add($"{fromProduct.Id} {fromProduct.VariantId}"); 69 } 70 else 71 { 72 relateFromProductVariantIds.Add($"{fromProduct.Id}"); 73 } 74 } 75 relateFromProductIds.Add($"{fromProduct.Id}"); 76 } 77 } 78 } 79 80 //--- GROUPS --- 81 if (sourceType == "most-sold" || sourceType == "trending" || sourceType == "latest" || sourceType == "custom") 82 { 83 var groupsToRelateTo = Model.Item.GetList("RelateTo")?.GetRawValue().OfType<string>().ToList(); 84 85 if (groupsToRelateTo != null) { 86 foreach (var fromGroup in groupsToRelateTo) 87 { 88 var groupId = fromGroup.Length > 2 ? fromGroup.Remove(0, 2) : fromGroup; 89 90 if (!fromGroup.Contains("p_")) 91 { 92 relateFromGroupIds.Add(groupId); 93 } 94 } 95 } 96 97 if (relateToViewModel?.Products != null) 98 { 99 foreach (var fromProduct in relateToViewModel.Products) 100 { 101 var groupId = fromProduct.PrimaryOrDefaultGroup.Id; 102 relateFromGroupIds.Add(groupId); 103 } 104 } 105 } 106 107 string relationGroupId = Model.Item.GetRawValueString("RelationGroup", string.Empty); 108 109 //--- RELATED GROUP --- 110 if (sourceType == "related") 111 { 112 if (relateToViewModel?.Products != null) 113 { 114 product = relateToViewModel.Products.FirstOrDefault(); 115 } 116 117 if (product?.RelatedGroups != null) 118 { 119 foreach (var relationGroup in product.RelatedGroups) 120 { 121 if (relationGroup.Id == relationGroupId) { 122 hasVariants = relationGroup.Products.Any(p => !string.IsNullOrEmpty(p.VariantId)); 123 foreach (var fromProduct in relationGroup.Products) 124 { 125 if (hasVariants) 126 { 127 if (!string.IsNullOrEmpty(fromProduct.VariantId)) 128 { 129 relateFromProductVariantIds.Add($"{fromProduct.ProductId} {fromProduct.VariantId}"); 130 } 131 else 132 { 133 relateFromProductVariantIds.Add($"{fromProduct.ProductId}"); 134 } 135 } 136 relateFromProductIds.Add($"{fromProduct.ProductId}"); 137 } 138 } 139 } 140 } 141 } 142 143 144 //Create group id collection and products id collection strings 145 string productIds = relateFromProductIds.Count > 0 ? string.Join(",", relateFromProductIds) : ""; 146 string productVariantIds = relateFromProductVariantIds.Count > 0 ? string.Join(",", relateFromProductVariantIds) : ""; 147 string groupIds = relateFromGroupIds.Count > 0 ? string.Join(",", relateFromGroupIds) : ""; 148 149 if (product is object) 150 { 151 if (string.IsNullOrEmpty(productIds) && (sourceType == "variants" || sourceType == "frequently" || sourceType == "selected" || sourceType == "custom")) 152 { 153 productIds = product.Id; 154 } 155 156 if (string.IsNullOrEmpty(groupIds) && (sourceType == "most-sold" || sourceType == "trending" || sourceType == "latest")) 157 { 158 groupIds = product.PrimaryOrDefaultGroup.Id; 159 } 160 } 161 } 162 163 @*Container element for the request*@ 164 @if (!string.IsNullOrEmpty(productIds) || !string.IsNullOrEmpty(groupIds) || (string.IsNullOrEmpty(productIds) && string.IsNullOrEmpty(groupIds) && sourceType != "related")) 165 { 166 <form method="post" action="@url" id="ComponentSliderProductsForm_@Model.ID" data-response-target-element="ComponentSliderProducts_@Model.ID" data-preloader="inline" data-update-url="false" class="item_@Model.Item.SystemName.ToLower()"> 167 <input type="hidden" name="ParagraphId" value="@Model.ID" /> 168 <input type="hidden" name="SortOrder" value="DESC"> 169 <input type="hidden" name="SourceType" value="@sourceType"> 170 171 @if (!string.IsNullOrEmpty(groupIds)) 172 { 173 <input type="hidden" name="GroupId" value="@groupIds"> 174 } 175 @if (sourceType != "frequently" && !string.IsNullOrEmpty(productIds) && !hasVariants) 176 { 177 <input type="hidden" name="MainProductId" value="@productIds"> 178 } 179 @if (sourceType != "frequently" && hasVariants) 180 { 181 <input type="hidden" name="ProductVariantId" value="@productVariantIds"> 182 } 183 184 @if (Model.Item.GetInt32("ProductsCount") != 0) 185 { 186 <input type="hidden" name="PageSize" value="@Model.Item.GetInt32("ProductsCount")"> 187 } 188 189 @if (sourceType == "variants") 190 { 191 <input type="hidden" name="isVariant" value="true"> 192 } 193 @if (sourceType == "most-sold") 194 { 195 <input type="hidden" name="SortBy" value="OrderCount"> 196 } 197 @if (sourceType == "trending") 198 { 199 <input type="hidden" name="SortBy" value="OrderCountGrowth"> 200 } 201 @if (sourceType == "frequently" && !string.IsNullOrEmpty(productIds)) 202 { 203 <input type="hidden" name="BoughtWithProductIds" value="[@productIds]"> 204 } 205 @if (sourceType == "latest") 206 { 207 <input type="hidden" name="SortBy" value="Created"> 208 } 209 </form> 210 211 <script type="module" src="/Files/Templates/Designs/Swift/Assets/js/swiffy-slider.js"></script> 212 <script> 213 window.addEventListener("load", () => { 214 swift.AssetLoader.Load('/Files/Templates/Designs/Swift/Assets/css/swiffy-slider.min.css', 'css'); 215 }); 216 </script> 217 218 <div class="w-100 h-100@(theme)"> 219 <div id="@Model.ID" class="user-select-none" style="scroll-margin-top:var(--header-height,150px)"></div> 220 <div id="ComponentSliderProducts_@Model.ID" class="h-100" style="@lazyHeight"></div> 221 </div> 222 223 <script type="module"> 224 const productSliderContainer = document.querySelector("#ComponentSliderProducts_@Model.ID"); 225 const productSliderForm = document.querySelector("#ComponentSliderProductsForm_@Model.ID"); 226 227 swift.PageUpdater.Update(productSliderForm); 228 productSliderForm.addEventListener("updated.swift.pageupdater", function(e){ 229 if (e.detail.html === "") { 230 productSliderContainer.closest("[data-col-size]").classList.add("d-none"); 231 } 232 }); 233 </script> 234 } 235 else if (Pageview.IsVisualEditorMode == true) 236 { 237 <div class="alert alert-dark" role="alert"> 238 <span>@Translate("Product component slider: The slider will be rendered here, if there is anything to show")</span> 239 </div> 240 } 241
Error executing template "Designs/Swift/Components/VariantSelector.cshtml" System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=21039; handshake=0; ---> System.ComponentModel.Win32Exception (258): The wait operation timed out. at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.Open() at Dynamicweb.Data.DatabaseConnectionProvider.CreateNamedConnection(String connectionName, Boolean open) at Dynamicweb.Data.Database.CreateDataReader(CommandBuilder commandBuilder, IDbConnection connection, IDbTransaction transaction, Int32 commandTimeout, String connectionName) at Dynamicweb.Ecommerce.Products.ProductRepository.GetProductsBySql(CommandBuilder query) at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetBulkVariants(IEnumerable`1 productIds, String languageId) at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass17_1.<BulkCreateView>b__6() at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at Dynamicweb.Ecommerce.ProductCatalog.ProductViewModelExtensions.VariantGroups(ProductViewModel productViewModel) at CompiledRazorTemplates.Dynamic.RazorEngine_153afdf6e2fb4b379559f8a64b4c6896.ExecuteAsync() at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate() ClientConnectionId:e0f59e81-8051-4257-99dd-37fa5505db0b Error Number:-2,State:0,Class:11
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using System.Collections.Generic 3 @using System.Linq 4 @using Dynamicweb.Ecommerce.ProductCatalog 5 @using Dynamicweb.Ecommerce.Variants 6 @using Dynamicweb.Frontend 7 8 @functions { 9 //Find contrast color (white, black) 10 public static string GetContrastColor(string hexString) 11 { 12 System.Drawing.Color bg = System.Drawing.ColorTranslator.FromHtml(hexString); 13 14 int nThreshold = 105; 15 int bgDelta = Convert.ToInt32((bg.R * 0.299) + (bg.G * 0.587) + 16 (bg.B * 0.114)); 17 18 string foreColor = (255 - bgDelta < nThreshold) ? "#333" : "#fff"; 19 return foreColor; 20 } 21 22 public string GetLayoutForVariantGroup(string variantGroupId) 23 { 24 string showVariantGroups = Model.Item?.GetRawValueString("ShowVariantGroupOptions"); 25 var selectedVariantGroupsList = Model.Item?.GetItems("VariantGroups") ?? new List<ItemViewModel>(); 26 bool showAllVariantGroupsDefault = string.IsNullOrEmpty(showVariantGroups) || selectedVariantGroupsList == null || !selectedVariantGroupsList.Any(); 27 string defaultVariantGroupLayout = Model.Item?.GetRawValueString("DefaultVariantGroupLayout"); 28 defaultVariantGroupLayout = !string.IsNullOrEmpty(defaultVariantGroupLayout) ? defaultVariantGroupLayout : "button"; 29 30 if (showAllVariantGroupsDefault) return defaultVariantGroupLayout; 31 32 foreach (var selectedVariantGroupListItem in selectedVariantGroupsList) 33 { 34 var variantGroups = selectedVariantGroupListItem.GetList("VariantGroups").GetRawValue().OfType<string>().ToList(); 35 if (variantGroups.Any(s => s.Equals(variantGroupId))) return selectedVariantGroupListItem.GetRawValueString("VariantGroupLayout"); 36 } 37 38 return defaultVariantGroupLayout; 39 } 40 41 //Collect all variant images 42 public static Dictionary<string, string> GetVariantImages(List<VariantInfoViewModel> variantInfo, Dictionary<string, string> list) 43 { 44 foreach (var variantGroup in variantInfo) 45 { 46 if (variantGroup.Image?.Value != null && !list.ContainsKey(variantGroup.OptionID)) 47 { 48 list.Add(variantGroup.OptionID, variantGroup.Image.Value); 49 } 50 51 if (variantGroup.VariantInfo != null) 52 { 53 GetVariantImages(variantGroup.VariantInfo, list); 54 } 55 } 56 57 return list; 58 } 59 60 private string GetDefaultOrVariantGroupValue(string variantGroupId, string itemField, string itemFieldDefaultValue, Dictionary<string, string> fieldValueMapping) 61 { 62 if (!string.IsNullOrEmpty(variantGroupId)) { 63 string itemFieldValue = Model.Item?.GetRawValueString(itemField, itemFieldDefaultValue); 64 string itemFieldParameter = GetViewParameterString(itemField); 65 itemFieldValue = string.IsNullOrEmpty(itemFieldValue) && !string.IsNullOrEmpty(itemFieldParameter) ? itemFieldParameter : itemFieldValue; 66 67 if (fieldValueMapping != null && !string.IsNullOrEmpty(itemFieldValue) && fieldValueMapping.Any()) { 68 itemFieldValue = fieldValueMapping.ContainsKey(itemFieldValue) ? fieldValueMapping[itemFieldValue] : itemFieldValue; 69 } 70 71 // If no variantGroup (i.e. Visual Editor), return default value 72 if (string.IsNullOrEmpty(variantGroupId)) return itemFieldValue; 73 74 string showVariantGroups = Model.Item?.GetString("ShowVariantGroupOptions", "all"); 75 var selectedVariantGroupsList = Model.Item?.GetItems("VariantGroups") ?? new List<ItemViewModel>(); 76 // If no exceptions or settings are all the same, return default value 77 if (showVariantGroups == "all" || selectedVariantGroupsList == null || !selectedVariantGroupsList.Any()) return itemFieldValue; 78 79 // Get specific value for variant group 80 foreach (var selectedVariantGroupListItem in selectedVariantGroupsList) 81 { 82 var variantGroups = selectedVariantGroupListItem.GetList("VariantGroups").GetRawValue().OfType<string>().ToList(); 83 if (!variantGroups.Any(s => s.Equals(variantGroupId))) continue; 84 85 itemFieldValue = selectedVariantGroupListItem.GetRawValueString(itemField, itemFieldDefaultValue); 86 itemFieldValue = fieldValueMapping.ContainsKey(itemFieldValue) ? fieldValueMapping[itemFieldValue] : itemFieldValue; 87 } 88 89 return itemFieldValue; 90 } 91 else 92 { 93 return string.Empty; 94 } 95 } 96 97 private bool GetDefaultOrVariantGroupValue(string variantGroupId, string itemField) 98 { 99 if (!string.IsNullOrEmpty(variantGroupId)) { 100 bool itemFieldValue = Model.Item?.GetBoolean(itemField) ?? false; 101 102 // If no variantGroup (i.e. Visual Editor), return default value 103 if (string.IsNullOrEmpty(variantGroupId)) return itemFieldValue; 104 105 string showVariantGroups = Model.Item?.GetString("ShowVariantGroupOptions", "all"); 106 var selectedVariantGroupsList = Model.Item?.GetItems("VariantGroups") ?? new List<ItemViewModel>(); 107 // If no exceptions or settings are all the same, return default value 108 if (showVariantGroups == "all" || selectedVariantGroupsList == null || !selectedVariantGroupsList.Any()) return itemFieldValue; 109 110 // Get specific value for variant group 111 foreach (var selectedVariantGroupListItem in selectedVariantGroupsList) 112 { 113 var variantGroups = selectedVariantGroupListItem.GetList("VariantGroups").GetRawValue().OfType<string>().ToList(); 114 if (!variantGroups.Any(s => s.Equals(variantGroupId))) continue; 115 116 itemFieldValue = selectedVariantGroupListItem.GetBoolean(itemField); 117 } 118 119 return itemFieldValue; 120 } 121 else 122 { 123 return false; 124 } 125 } 126 } 127 128 @{ 129 ProductViewModel product = null; 130 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 131 { 132 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 133 } 134 else if (Pageview.Page.Item["DummyProduct"] != null && Pageview.IsVisualEditorMode) 135 { 136 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); 137 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); 138 139 if (productList?.Products is object) 140 { 141 product = productList.Products[0]; 142 } 143 } 144 } 145 146 @if ((product is object)) 147 { 148 bool hideGroupHeaders = !string.IsNullOrEmpty(Model?.Item?.GetString("HideGroupHeaders")) ? Model.Item.GetBoolean("HideGroupHeaders") : false; 149 var productVariantGroups = product.VariantGroups(); 150 151 string itemId = Model?.Item?.SystemName != null ? $"item_{Model.Item.SystemName.ToLower()}" : string.Empty; 152 153 bool isModalSelector = Model?.Item == null; 154 string target = isModalSelector ? "data-response-target-element=\"DynamicModalContent\"" : string.Empty; 155 156 string variantSelectorServicePageId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("VariantSelectorServicePage")) ? Dynamicweb.Context.Current.Request.Form.Get("VariantSelectorServicePage") : string.Empty; 157 string formAction = isModalSelector ? $"action=\"/Default.aspx?ID={variantSelectorServicePageId}\"" : string.Empty; 158 159 string getProductInfo = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form["getproductinfo"]) ? Dynamicweb.Context.Current.Request.Form["getproductinfo"] : string.Empty; 160 161 if (productVariantGroups.Any() && product?.VariantInfo?.VariantInfo != null) 162 { 163 string[] variantId = product.VariantId.Split('.'); 164 int groupNumber = 1; 165 166 string baseUrl = $"Default.aspx?ID={GetPageIdByNavigationTag("Shop")}&GroupID={product.PrimaryOrDefaultGroup.Id}&ProductID={product.Id}"; 167 string variantUrl = string.Empty; 168 if (!string.IsNullOrEmpty(product.VariantId) && !isModalSelector) 169 { 170 variantUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl($"Default.aspx?ID={GetPageIdByNavigationTag("Shop")}&GroupID={product.PrimaryOrDefaultGroup.Id}&ProductID={product.Id}&VariantID={product.VariantId}"); 171 } 172 173 Dictionary<string, string> variantImages = new Dictionary<string, string>(); 174 variantImages = GetVariantImages(product.VariantInfo.VariantInfo, variantImages); 175 176 <form @formAction class="d-flex flex-column gap-2 js-variant-selector @itemId" @target data-combinations="@string.Join(",", product.VariantCombinations())" data-base-url="@baseUrl" data-friendly-url="@variantUrl"> 177 @if (isModalSelector) 178 { 179 <input type="hidden" name="productId" value="@product.Id"> 180 <input type="hidden" name="variantid" value="@product.VariantId"> 181 <input type="hidden" name="QuantitySelector" value="true"> 182 <input type="hidden" name="VariantSelectorServicePage" value="@variantSelectorServicePageId"> 183 <input type="hidden" name="ViewType" value="ModalContent"> 184 185 if (GetViewParameter("ButtonLayout") != null) { 186 <input type="hidden" name="ButtonLayout" value="@GetViewParameter("ButtonLayout")"> 187 } 188 189 if (GetViewParameter("ButtonAspectRatio") != null) { 190 <input type="hidden" name="ButtonAspectRatio" value="@GetViewParameter("ButtonAspectRatio")"> 191 } 192 193 if (!string.IsNullOrEmpty(getProductInfo)) 194 { 195 <input type="hidden" name="getproductinfo" value="@getProductInfo"> 196 } 197 } 198 199 @foreach (var variantGroup in productVariantGroups) 200 { 201 VariantGroupViewModel group = variantGroup; 202 string variantGroupLayout = GetLayoutForVariantGroup(variantGroup.Id) ?? "button"; 203 string horizontalAlign = GetDefaultOrVariantGroupValue(variantGroup.Id, "HorizontalAlignment", "", new Dictionary<string, string> { { "center", "justify-content-center" }, { "end", "justify-content-end" } }); 204 string horizontalTextAlign = GetDefaultOrVariantGroupValue(variantGroup.Id, "HorizontalAlignment", "", new Dictionary<string, string> { { "center", "text-center" }, { "end", "text-end" } }); 205 bool showSelectedOptionName = GetDefaultOrVariantGroupValue(variantGroup.Id, "ShowSelectedOptionName"); 206 207 <div> 208 @if (!hideGroupHeaders) 209 { 210 <h3 class="h6 @horizontalTextAlign"> 211 @group.Name 212 213 @if (showSelectedOptionName) 214 { 215 string selectedOptionName = group.Options.FirstOrDefault(opt => variantId.Contains(opt.Id))?.Name ?? string.Empty; 216 <span class="fw-light px-1 swift-selected-option-name">@selectedOptionName</span> 217 } 218 </h3> 219 } 220 <div class="d-flex gap-2 @horizontalAlign flex-wrap js-variant-group" data-group-id="@groupNumber"> 221 @if (variantGroupLayout == "button") 222 { 223 foreach (var option in group.Options) 224 { 225 string active = variantId != null && variantId.Contains(option.Id) ? "active" : string.Empty; 226 string buttonId = $"{product.Id}_{option.Id}_{Pageview.CurrentParagraph.ID}"; 227 string contrastColor = string.Empty; 228 string buttonAspectRatio = GetDefaultOrVariantGroupValue(variantGroup.Id, "ButtonAspectRatio", "100%", new Dictionary<string, string> { { "100%", "--bs-aspect-ratio:100%" }, { "56%", "--bs-aspect-ratio:56%" }, { "177%", "--bs-aspect-ratio:177%" }, { "75%", "--bs-aspect-ratio:75%" }, { "133%", "--bs-aspect-ratio:133%" } }); 229 buttonAspectRatio = buttonAspectRatio == string.Empty ? "--bs-aspect-ratio:100%" : buttonAspectRatio; 230 231 string buttonLayout = GetDefaultOrVariantGroupValue(variantGroup.Id, "ButtonLayout", "rounded-circle", new Dictionary<string, string> { { "round", "rounded-circle" }, { "square", "rounded-0" }, { "square-rounded", "rounded-3" } }); 232 string buttonTextLayout = GetDefaultOrVariantGroupValue(variantGroup.Id, "ButtonTextLayout", "", new Dictionary<string, string> { { "default", "" }, { "square", "rounded-0" }, { "square-rounded", "rounded-3" } }); 233 var displayType = group.DisplayType; 234 displayType = displayType == VariantGroupDisplayType.NothingSelected && !string.IsNullOrEmpty(option.Color) ? VariantGroupDisplayType.VariantColor : displayType; 235 displayType = displayType == VariantGroupDisplayType.NothingSelected && string.IsNullOrEmpty(option.OptionImage.Value) && string.IsNullOrEmpty(option.Color) ? VariantGroupDisplayType.VariantName : displayType; 236 displayType = displayType == VariantGroupDisplayType.NothingSelected && !string.IsNullOrEmpty(option.OptionImage.Value) ? VariantGroupDisplayType.VariantOptionImage : displayType; 237 238 var btnWidth = displayType == VariantGroupDisplayType.VariantColor || displayType == VariantGroupDisplayType.VariantImage || displayType == VariantGroupDisplayType.VariantOptionImage ? $"style=\"width:64px\"" : string.Empty; 239 var btnClasses = string.Empty; 240 241 btnClasses = displayType == VariantGroupDisplayType.VariantColor ? $"overflow-hidden colorbox colorbox-auto p-0 border {buttonLayout}" : btnClasses; 242 btnClasses = displayType == VariantGroupDisplayType.VariantImage ? $"overflow-hidden p-0 {buttonLayout}" : btnClasses; 243 btnClasses = displayType == VariantGroupDisplayType.VariantOptionImage ? $"overflow-hidden colorbox colorbox-auto {buttonLayout} p-0" : btnClasses; 244 btnClasses = displayType == VariantGroupDisplayType.VariantName ? $"btn-secondary {buttonTextLayout}" : btnClasses; 245 246 <button type="button" class="btn @btnClasses d-inline-block variant-option js-variant-option @active" @btnWidth onclick="swift.VariantSelector.OptionClick(event); swift.RelatedProductSelector.UpdateSavedVariantId(@option.Id);" data-variant-id="@option.Id" id="@(product.Id)_@(option.Id)_@Pageview.CurrentParagraph.ID"> 247 <div class="@(displayType == VariantGroupDisplayType.VariantName ? string.Empty : "ratio")" style="@(buttonAspectRatio)"> 248 249 @switch (displayType) 250 { 251 case VariantGroupDisplayType.VariantOptionImage: 252 if (!string.IsNullOrEmpty(option.OptionImage.Value)) 253 { 254 <img style="object-fit:cover;--variantoption-check-color:@(contrastColor)" src="/Admin/Public/GetImage.ashx?image=@(option.OptionImage.Value)&width=64&format=webp"> 255 } 256 else if (!string.IsNullOrEmpty(option.Color)) 257 { 258 <span class="" style="background-color:@(option.Color);--variantoption-check-color:@(contrastColor)"><span class="visually-hidden">@option.Color</span></span> 259 } 260 else 261 { 262 <span class="d-flex align-items-center justify-content-center">@(option.Name)</span> 263 } 264 break; 265 266 case VariantGroupDisplayType.VariantImage: 267 string variantImage = string.Empty; 268 variantImages.TryGetValue(option.Id, out variantImage); 269 <img class="theme" style="object-fit:contain" src="/Admin/Public/GetImage.ashx?image=@(variantImage)&width=64&format=webp"> 270 break; 271 272 case VariantGroupDisplayType.VariantColor: 273 contrastColor = GetContrastColor(option.Color); 274 <span class="" style="background-color:@(option.Color);--variantoption-check-color:@(contrastColor)"><span class="visually-hidden">@option.Color</span></span> 275 break; 276 277 case VariantGroupDisplayType.VariantName: 278 <span class="d-flex align-items-center justify-content-center">@(option.Name)</span> 279 break; 280 281 } 282 </div> 283 </button> 284 } 285 } 286 else 287 { 288 <select class="form-select" id="VariantDropdown_@variantGroup.Id" aria-label="@variantGroup.Name" onchange="swift.VariantSelector.OptionClick(event)"> 289 @if (string.IsNullOrEmpty(product.VariantId)) 290 { 291 <option value="" class="variant-option js-variant-option" data-variant-id="">@Translate("Nothing selected")</option> 292 } 293 294 @foreach (var option in variantGroup.Options) 295 { 296 string active = variantId != null && variantId.Contains(option.Id) ? "active" : ""; 297 var selected = variantId != null && variantId.Contains(option.Id) ? "selected" : ""; 298 var value = $"{product.Id}_{option.Id}"; 299 300 <option value="@(value)" class="variant-option js-variant-option @active" data-variant-id="@option.Id" id="@(value)_@(Pageview.CurrentParagraph.ID)" @selected>@option.Name</option> 301 } 302 </select> 303 } 304 </div> 305 </div> 306 307 groupNumber++; 308 } 309 </form> 310 311 <script type="module"> 312 swift.VariantSelector.init(); 313 </script> 314 } 315 else if (Pageview.IsVisualEditorMode) 316 { 317 string horizontalAlign = GetDefaultOrVariantGroupValue("", "HorizontalAlignment", "", new Dictionary<string, string> { { "center", "justify-content-center" }, { "end", "justify-content-end" } }); 318 string horizontalTextAlign = GetDefaultOrVariantGroupValue("", "HorizontalAlignment", "", new Dictionary<string, string> { { "center", "text-center" }, { "end", "text-end" } }); 319 320 <form class="d-flex flex-column js-variant-selector @itemId" data-combinations="VO1,VO2,VO3,VO4"> 321 <div> 322 @if (!hideGroupHeaders) 323 { 324 <h3 class="h6 @horizontalTextAlign">@Translate("Sizes")</h3> 325 } 326 <div class="mb-3 @horizontalAlign js-variant-group" data-group-id="0"> 327 <button type="button" class="btn btn-secondary d-inline-block mb-2 variant-option js-variant-option" onclick="swift.VariantSelector.OptionClick(event)" data-variant-id="VO1" id="@(product.Id)_VO1_@Pageview.CurrentParagraph.ID">S</button> 328 <button type="button" class="btn btn-secondary d-inline-block mb-2 variant-option js-variant-option" onclick="swift.VariantSelector.OptionClick(event)" data-variant-id="VO2" id="@(product.Id)_VO2_@Pageview.CurrentParagraph.ID">M</button> 329 <button type="button" class="btn btn-secondary d-inline-block mb-2 variant-option js-variant-option" onclick="swift.VariantSelector.OptionClick(event)" data-variant-id="VO3" id="@(product.Id)_VO3_@Pageview.CurrentParagraph.ID">L</button> 330 <button type="button" class="btn btn-secondary d-inline-block mb-2 variant-option js-variant-option" onclick="swift.VariantSelector.OptionClick(event)" data-variant-id="VO4" id="@(product.Id)_VO4_@Pageview.CurrentParagraph.ID">XL</button> 331 </div> 332 </div> 333 </form> 334 335 <script type="module"> 336 swift.VariantSelector.init(); 337 </script> 338 } 339 } 340 else if (Pageview.IsVisualEditorMode) 341 { 342 <div class="alert alert-dark m-0" role="alert"> 343 <span>@Translate("No products available")</span> 344 </div> 345 } 346
Especificaciones
| Acabado ID | 86 |
| Acabado | Negro teñido |
| Material | OceanIX Plastix |
| Tipo de producto | Pomo |
| Diámetro | 42,1 |