public void SetRequestTheme(string theme) { try { var dataTokens = _httpContext?.GetRouteData()?.DataTokens; if (dataTokens == null) { return; } if (theme.HasValue()) { dataTokens[OverriddenThemeNameKey] = theme; } else if (dataTokens.ContainsKey(OverriddenThemeNameKey)) { dataTokens.Remove(OverriddenThemeNameKey); } _currentTheme = null; } catch { } }
/// <summary> /// Validates the result SASS file by calling it's url. /// </summary> /// <param name="theme">Theme name</param> /// <param name="storeId">Stored Id</param> /// <returns>The error message when a parsing error occured, <c>null</c> otherwise</returns> private async Task <string> ValidateSassAsync(ThemeManifest manifest, int storeId) { string error = string.Empty; if (_httpContextAccessor.HttpContext == null) { return(error); } // TODO: (core) DefaultThemeVariableService.ValidateSassAsync() --> finalize theme.scss path/bundle convention and make sass validation run. var virtualPath = "~/themes/{0}/theme.scss".FormatCurrent(manifest.ThemeName); var url = "{0}?storeId={1}&theme={2}&validate=1".FormatInvariant( WebHelper.GetAbsoluteUrl(virtualPath, _httpContextAccessor.HttpContext?.Request), storeId, manifest.ThemeName); var request = await WebHelper.CreateHttpRequestForSafeLocalCallAsync(new Uri(url)); WebResponse response = null; try { response = await request.GetResponseAsync(); } catch (WebException ex) { if (ex.Response is HttpWebResponse) { var webResponse = (HttpWebResponse)ex.Response; var statusCode = webResponse.StatusCode; if (statusCode == HttpStatusCode.InternalServerError) { // Catch only 500, as this indicates a parsing error. var stream = webResponse.GetResponseStream(); using var streamReader = new StreamReader(stream); // Read the content (the error message has been put there) error = await streamReader.ReadToEndAsync(); streamReader.Close(); stream.Close(); } } } catch (Exception ex) { error = ex.Message; } finally { if (response != null) { response.Close(); } } return(error); }
protected override void OnDispose(bool disposing) { if (disposing) { Manifest = null; } }
public void SetPreviewTheme(string theme) { try { _httpContext.SetPreviewModeValueInCookie(OverriddenThemeNameKey, theme); _currentTheme = null; } catch { } }
public ThemeManifestMaterializer(ThemeDirectoryData directoryData) { Guard.NotNull(directoryData, nameof(directoryData)); _directoryData = directoryData; _manifest = new ThemeManifest { ThemeName = directoryData.Directory.Name, ConfigurationFile = directoryData.ConfigurationFile, IsSymbolicLink = directoryData.IsSymbolicLink, BaseThemeName = directoryData.BaseTheme, RootPath = directoryData.Directory.PhysicalPath }; }
public ThemeManifestMaterializer(ThemeDirectoryData directoryData) { Guard.NotNull(directoryData, nameof(directoryData)); _directoryData = directoryData; _manifest = new ThemeManifest { ThemeName = directoryData.Directory.Name, ConfigurationFile = directoryData.ConfigurationFile, Configuration = directoryData.Configuration, IsSymbolicLink = directoryData.IsSymbolicLink, BaseThemeName = directoryData.BaseTheme, FileProvider = new LocalFileSystem(directoryData.Directory.PhysicalPath), }; }
private async Task <SaveThemeVariablesResult> SaveThemeVariablesInternal(ThemeManifest manifest, int storeId, IDictionary <string, object> variables) { var result = new SaveThemeVariablesResult(); var infos = manifest.Variables; var unsavedVars = new List <string>(); var savedThemeVars = await _db.ThemeVariables .Where(v => v.StoreId == storeId && v.Theme == manifest.ThemeName) .ToDictionaryAsync(x => x.Name); bool touched = false; foreach (var v in variables) { if (!infos.TryGetValue(v.Key, out var info)) { // var not specified in metadata so don't save // TODO: (MC) delete from db also if it exists continue; } var value = v.Value == null ? string.Empty : v.Value.ToString(); var savedThemeVar = savedThemeVars.Get(v.Key); if (savedThemeVar != null) { if (value.IsEmpty() || String.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase)) { // it's either null or the default value, so delete _db.ThemeVariables.Remove(savedThemeVar); result.Deleted.Add(savedThemeVar); touched = true; } else { // update entity if (!savedThemeVar.Value.Equals(value, StringComparison.OrdinalIgnoreCase)) { savedThemeVar.Value = value; result.Updated.Add(savedThemeVar); touched = true; } } } else { if (value.HasValue() && !string.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase)) { // Insert entity (only when not default value) unsavedVars.Add(v.Key); savedThemeVar = new ThemeVariable { Theme = manifest.ThemeName, Name = v.Key, Value = value, StoreId = storeId }; _db.ThemeVariables.Add(savedThemeVar); result.Inserted.Add(savedThemeVar); touched = true; } } } if (touched) { await _db.SaveChangesAsync(); } return(result); }