• DETAIL17398
  • DETAIL17399
  • DETAIL17403
  • DETAIL17404
  • DETAIL24910

Marker Schneider Maxx 224 M 1.0mm marker permanent OHP

Cod produs: MKO024-Rosu

Marker permanent universal.
Grosime de scriere medie M de circa 1,0 mm.
Pentru folii transparente (OHP), hartie, plastic, sticla, metal, ceramica etc.
Uscare rapida, culoare intensa.
Cerneala inodora, fara toluen si xilen.
Sistem Cap-off: cerneala nu se usuca 2-3 zile fara capac.
Marker subtire dotat cu capac cu clema.
Corp din plastic reciclat 92% (vezi certificare).

Culoare

in stoc

* Imaginile si informatiile prezentate au caracter informativ, iar in unele cazuri pot contine inadvertente cauzate de actualizarea datelor de catre furnizor. Pentru orice neclaritati sau intrebari te rugam sa ne contactezi.

Descriere

Marker permanent universal, pentru scris pe folii transparente retroproiector (OHP), hartie, plastic, sticla, metal, portelan, ceramica si alte materiale.

Este un marker subtire, cu grosime de scriere medie M de circa 1,0 mm. Poate fi tinut in buzunar si este dotat cu un capac detasabil, cu clema robusta.

Acest marker Schneider Maxx 224 M are o culoare intensa, iar cerneala sa nu contine toluen si xilen, fiind inodora. Cerneala se usuca rapid, este rezistenta la apa si la lumina. Beneficiaza de sistem Cap-off: cerneala nu se usuca, chiar daca markerul este lasat fara capact timp de 2-3 zile.

Culoarea de scriere este indicata pe capac si in capatul carcasei. Markerul Schneider Maxx 224 M are corpul fabricat din plastic reciclat in proportie de peste 90% (vezi certificare).

Error executing template "/Designs/Swift/Paragraph/AUS_ProductSpecification.cshtml"
System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetFieldDisplayGroupValues(ProductViewModelSettings settings, Product product, String languageID, Lazy`1 productIds)
   at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass3_1.<BulkCreateView>b__51()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at CompiledRazorTemplates.Dynamic.RazorEngine_ec937ed2955c4e7a96a7423073bbd9ce.Execute() in C:\Sites\www.austral.ro\Files\Templates\Designs\Swift\Paragraph\AUS_ProductSpecification.cshtml:line 98
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Ecommerce.ProductCatalog 3 @using System; 4 @using System.Collections.Generic; 5 @using System.Linq; 6 @using Newtonsoft.Json; 7 @using Newtonsoft.Json.Linq; 8 9 @functions{ 10 11 12 public Dictionary<string, FieldValueViewModel> TransformNODSpecifications(string fieldJson) 13 { 14 // Early‑exit on null/empty 15 if (string.IsNullOrWhiteSpace(fieldJson)) 16 return new Dictionary<string, FieldValueViewModel>(); 17 18 JArray specs; 19 try 20 { 21 specs = JArray.Parse(fieldJson); 22 } 23 catch (JsonException) 24 { 25 // malformed JSON → return empty 26 return new Dictionary<string, FieldValueViewModel>(); 27 } 28 29 var options = new Dictionary<string, FieldValueViewModel>(StringComparer.Ordinal); 30 31 foreach (JObject obj in specs.OfType<JObject>()) 32 { 33 // grab the label 34 var labelToken = obj["Label"]; 35 if (labelToken == null || labelToken.Type != JTokenType.String) 36 continue; 37 38 string systemName = labelToken.Value<string>(); 39 40 // **NEW**: skip if we've already seen this key 41 if (options.ContainsKey(systemName)) 42 continue; 43 44 options.Add(systemName, new FieldValueViewModel 45 { 46 Name = systemName, 47 SystemName = systemName, 48 Type = "String", 49 Value = obj["Value"]?.ToString(), 50 ListType = 1 51 }); 52 } 53 54 return options; 55 } 56 57 } 58 @{ 59 bool isVisualEditor = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("VisualEdit")) ? Convert.ToBoolean(Dynamicweb.Context.Current.Request.QueryString.Get("VisualEdit")) : false; 60 61 ProductViewModel product = new ProductViewModel(); 62 63 ProductViewModelSettings productSetting = new ProductViewModelSettings 64 { 65 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 66 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code, 67 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2, 68 ShopId = Pageview.Area.EcomShopId 69 }; 70 71 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 72 { 73 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 74 } else if (Pageview.Item["DummyProduct"] != null) { 75 76 string dummyProductId = ""; 77 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); 78 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); 79 if (productList.Products != null) 80 { 81 foreach (var p in productList.Products) { dummyProductId = p.Id; } 82 ProductViewModel dummyProduct = dummyProductId != "" ? ViewModelFactory.CreateView(productSetting, dummyProductId) : new ProductViewModel(); 83 product = dummyProduct; 84 } else { 85 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 86 } 87 } else if (Pageview.Item["DummyProduct"] == null) { 88 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 89 } 90 } 91 92 @if (product?.Id != null) { 93 IEnumerable<string> selectedDisplayGroupIds = Model.Item.GetRawValueString("DisplayGroups").Split(',').ToList(); 94 List<CategoryFieldViewModel> displayGroups = new List<CategoryFieldViewModel>(); 95 96 foreach (var selection in selectedDisplayGroupIds) 97 { 98 foreach (CategoryFieldViewModel group in product.FieldDisplayGroups.Values) 99 { 100 if (selection == group.Id) 101 { 102 displayGroups.Add(group); 103 } 104 } 105 } 106 107 bool showProductFields = Model.Item.GetBoolean("ProductFields"); 108 109 bool hideTitle = Model.Item.GetBoolean("HideTitle"); 110 111 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 112 113 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "display-4"); 114 115 string contentPadding = Model.Item.GetRawValueString("ContentPadding", ""); 116 contentPadding = contentPadding == "small" ? "p-2 p-md-3" : contentPadding; 117 contentPadding = contentPadding == "large" ? "p-4 p-md-5" : contentPadding; 118 119 string layout = Model.Item.GetRawValueString("Layout", "list"); 120 string size = Model.Item.GetRawValueString("Size", "full"); 121 122 bool anonymousUser = Pageview.User == null; 123 124 if (Pageview.IsVisualEditorMode && displayGroups.Count() == 0) 125 { 126 product.ProductFields.Clear(); 127 product.ProductFields.Add(Translate("Width"), new FieldValueViewModel { Name = Translate("Width"), Value = "99cm" }); 128 product.ProductFields.Add(Translate("Height"), new FieldValueViewModel { Name = Translate("Height"), Value = "195cm" }); 129 showProductFields = true; 130 } 131 132 133 <div class="@(theme) h-100 item_@Model.Item.SystemName.ToLower()"> 134 <div class="@contentPadding"> 135 @if ((product.ProductFields != null && Model.Item.GetBoolean("ProductFields")) || (product.ProductCategories != null && Model.Item.GetBoolean("CategoryFields")) || (displayGroups.Count != 0)) { 136 if (!hideTitle && product.ProductCategories.Count > 0) 137 { 138 <div class="text-start pb-2 pb-lg-4"> 139 <h2 class="@titleFontSize">@Model.Item.GetString("Title")</h2> 140 </div> 141 } 142 } 143 144 @if (displayGroups.Count != 0) { 145 foreach (var group in displayGroups) { 146 bool hideHeader = Model.Item.GetBoolean("HideGroupHeaders"); 147 148 if (!hideHeader) { 149 <h4 class="h4 mb-4">@group.Name</h4> 150 } 151 //check if we have NOD specifications 152 if(group.Id == "Specificatii_NOD") 153 { 154 //separate Properties from other fields 155 var nodProperties = group.Fields["Properties"]; 156 var nodSpecifications = group.Fields.Where(i => i.Key != "Properties").ToDictionary(i => i.Key, i => i.Value); 157 if(nodSpecifications.Any()) 158 { 159 @RenderFieldsFromList(nodSpecifications, layout); 160 } 161 if(nodProperties != null) 162 { 163 var properties = TransformNODSpecifications(nodProperties.Value.ToString()); 164 @RenderFieldsFromList(properties, layout); 165 } 166 } else { 167 @RenderFieldsFromList(group.Fields, layout); 168 } 169 } 170 } 171 172 @if (product.ProductFields != null && showProductFields) { 173 if (product.ProductFields.Count > 0) { 174 @RenderFieldsFromList(product.ProductFields, layout); 175 } 176 } 177 178 @if (product.ProductCategories != null && Model.Item.GetBoolean("CategoryFields")) { 179 bool hideHeader = Model.Item.GetBoolean("HideGroupHeaders"); 180 if (product.ProductCategories.Count > 0) { 181 foreach (var group in product.ProductCategories) { 182 CategoryFieldViewModel category = group.Value; 183 184 if (!hideHeader) { 185 <h4 class="h4 mb-4">@group.Value.Name</h4> 186 } 187 188 @RenderFieldsFromList(category.Fields, layout); 189 190 } 191 } 192 } 193 @if(!anonymousUser) { 194 <div class="fs-7 opacity-85 fst-italic mt-4 mb-3">@Translate("Disclaimer msg")</div> 195 } 196 </div> 197 </div> 198 } else if (Pageview.IsVisualEditorMode) { 199 <div class="alert alert-warning m-0">@Translate("No products available")</div> 200 } 201 202 203 @helper RenderFieldsFromList(Dictionary<string, FieldValueViewModel> fields, string layout) { 204 string size = Model.Item.GetRawValueString("Size", "full"); 205 string extraMargin = size == "full" ? "mb-3" : ""; 206 bool hideFieldLabels = Model.Item.GetBoolean("HideFieldLabels"); 207 string propertiesFieldName = "Properties"; 208 //remove fields used for filtering. 209 fields = fields.Where(x=>!x.Key.Contains("f_")).ToDictionary(item => item.Key, item => item.Value); 210 211 212 <div class="@extraMargin"> 213 @if (layout == "columns") { 214 string gaps = size == "full" ? "gap-0" : "gap-2"; 215 216 <div class="grid @gaps"> 217 @foreach (var field in fields) { 218 @RenderField(field.Value, layout) 219 } 220 </div> 221 } 222 @if (layout == "list") { 223 <dl class="grid gap-0"> 224 @foreach (var field in fields) { 225 @RenderField(field.Value, layout) 226 } 227 </dl> 228 } 229 @if (layout == "table") { 230 string tableSize = size == "full" ? "" : "table-sm"; 231 232 <table class="table table-striped @tableSize"> 233 @foreach (var field in fields) { 234 @RenderField(field.Value, layout) 235 } 236 </table> 237 } 238 @if (layout == "bullets") { 239 string listSize = size == "full" ? "" : "m-0 p-0 lh-1 fs-7 opacity-75"; 240 string listStyle = size == "full" ? "" : "style=\"list-style-position: inside\""; 241 242 <ul class="@listSize" @listStyle> 243 @foreach (var field in fields) { 244 @RenderField(field.Value, layout) 245 } 246 </ul> 247 } 248 @if (layout == "commas") { 249 List<string> featuresList = new List<string>(); 250 251 foreach (var field in fields) 252 { 253 if (field.Value.Value.GetType() == typeof(System.Collections.Generic.List<FieldOptionValueViewModel>)) { 254 List<string> options = new List<string>(); 255 foreach (FieldOptionValueViewModel option in field.Value.Value as System.Collections.Generic.List<FieldOptionValueViewModel>) { 256 if (!string.IsNullOrWhiteSpace(option.Value)) { 257 if (option.Value.ToString().Contains("#") && (Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { 258 string colorSpan = "<span class=\"colorbox-sm\" style=\"background-color: " + option.Value + "\"></span>"; 259 options.Add(colorSpan); 260 } else if (!string.IsNullOrEmpty(option.Value)) { 261 options.Add(option.Name); 262 } 263 } 264 } 265 string optionsString = (string.Join(", ", options.Select(x => x.ToString()).ToArray())); 266 if ((Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { 267 optionsString = (string.Join(" ", options.Select(x => x.ToString()).ToArray())); 268 } 269 270 if (!hideFieldLabels) { 271 featuresList.Add(field.Value.Name + ": " + optionsString); 272 } else { 273 featuresList.Add(optionsString); 274 } 275 } else { 276 if (!string.IsNullOrWhiteSpace(field.Value.Value.ToString())) { 277 if (field.Value.Value.ToString().Contains("#") && (Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { 278 string colorSpan = "<span class=\"colorbox-sm\" style=\"background-color: " + field.Value.Value + "\"></span>"; 279 280 if (!hideFieldLabels) { 281 featuresList.Add(field.Value.Name + ": " + colorSpan); 282 } else { 283 featuresList.Add(colorSpan); 284 } 285 } else { 286 if (!hideFieldLabels) { 287 featuresList.Add(field.Value.Name + ": " + field.Value.Value.ToString()); 288 } else { 289 featuresList.Add(field.Value.Value.ToString()); 290 } 291 } 292 } 293 } 294 } 295 296 string featuresString = (string.Join(", ", featuresList.Select(x => x.ToString()).ToArray())); 297 298 <div class="opacity-75 fs-7">@featuresString</div> 299 } 300 </div> 301 } 302 303 @helper RenderField(FieldValueViewModel field, string layout) { 304 string size = Model.Item.GetRawValueString("Size", "full"); 305 string fieldValue = field?.Value != null ? field.Value.ToString() : ""; 306 bool hideFieldLabels = Model.Item.GetBoolean("HideFieldLabels"); 307 bool noValues = false; 308 309 if (!string.IsNullOrEmpty(fieldValue)) { 310 if (field.Value.GetType() == typeof(System.Collections.Generic.List<FieldOptionValueViewModel>)) { 311 System.Collections.Generic.List<FieldOptionValueViewModel> values = field.Value as System.Collections.Generic.List<FieldOptionValueViewModel>; 312 noValues = values.Count > 0 ? false : true; 313 } 314 } 315 316 if (!string.IsNullOrEmpty(fieldValue) && noValues == false) { 317 if (layout == "columns") { 318 <div class="grid g-col-6 g-col-lg-4"> 319 @if(!hideFieldLabels) 320 { 321 <dt class="g-col-4 py-2 fw-bold">@field.Name</dt> 322 } 323 <dd class="g-col-8 py-2 mb-0">@RenderFieldValue(field)</dd> 324 </div> 325 } 326 if (layout == "list") { 327 string extraPadding = size == "full" ? "py-2" : ""; 328 329 if (!hideFieldLabels) 330 { 331 <dt class="g-col-4 @extraPadding fw-bold">@field.Name</dt> 332 } 333 <dd class="g-col-8 @extraPadding mb-0"> 334 @RenderFieldValue(field) 335 </dd> 336 } 337 if (layout == "table") { 338 <tr> 339 @if (!hideFieldLabels) 340 { 341 <th class="fw-bold" scope="row">@field.Name</th> 342 } 343 <td>@RenderFieldValue(field)</td> 344 </tr> 345 } 346 if (layout == "bullets") { 347 <li> 348 @if (!hideFieldLabels) 349 { 350 <strong>@field.Name</strong> 351 } 352 <span>@RenderFieldValue(field)</span> 353 </li> 354 } 355 } 356 } 357 358 @helper RenderFieldValue(FieldValueViewModel field) { 359 string fieldValue = field?.Value != null ? field.Value.ToString() : ""; 360 361 bool isLink = field?.Type == "Link"; 362 bool isColor = false; 363 bool isBrandName = field?.SystemName == "Brand_name"; 364 365 fieldValue = fieldValue == "False" ? Translate("No") : fieldValue; 366 fieldValue = fieldValue == "True" ? Translate("Yes") : fieldValue; 367 368 369 if (field.Value.GetType() == typeof(System.Collections.Generic.List<Dynamicweb.Ecommerce.ProductCatalog.FieldOptionValueViewModel>)) 370 { 371 int valueCount = 0; 372 System.Collections.Generic.List<FieldOptionValueViewModel> values = field.Value as System.Collections.Generic.List<FieldOptionValueViewModel>; 373 int totalValues = values.Count; 374 375 foreach (FieldOptionValueViewModel option in values) 376 { 377 if (option.Value.Substring(0,1) == "#") { 378 isColor = true; 379 } 380 381 if (!isColor) { 382 @option.Name 383 } else { 384 <span class="colorbox-sm" style="background-color: @option.Value" title="@option.Name"></span> 385 } 386 387 if (valueCount != totalValues && valueCount < (totalValues - 1)) { 388 if (isColor) { 389 <text> </text> 390 } else { 391 <text>, </text> 392 } 393 } 394 valueCount++; 395 } 396 } 397 else 398 { 399 if (fieldValue.Substring(0,1) == "#") { 400 isColor = true; 401 } 402 403 if (!isColor) { 404 if(isLink) 405 { 406 string linktTitle = !fieldValue.Contains("aspx") ? fieldValue : Translate("Go to link"); 407 string target = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && fieldValue.Contains("http") ? "target=\"_blank\"" : string.Empty; 408 string rel = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && fieldValue.Contains("http") ? "rel=\"noopener\"" : string.Empty; 409 410 <a href="@field.Value" title="@field.Name" @target @rel>@linktTitle</a> 411 } 412 else if (isBrandName) 413 { 414 <span itemprop="brand" itemtype="https://schema.org/Brand" itemscope> 415 <span itemprop="name">@fieldValue</span> 416 </span> 417 } 418 else 419 { 420 @fieldValue 421 } 422 423 } else { 424 <span class="colorbox-sm" style="background-color: @fieldValue" title="@fieldValue"></span> 425 } 426 } 427 } 428