private void RecurseClone(int parentID, WebPageDecorator parentPage, IEnumerable <WebPageDecorator> sources, string locale) { var pages = sources.Where(p => p.ParentID.Equals(parentID)).OrderByDescending(p => p.Pos); if (pages.Count() > 0) { foreach (var p in pages) { if (p.Slug.StartsWith("lists")) { continue; } var newPage = p.Clone(locale); if (parentPage != null) { newPage.MoveTo(parentPage.ID); } else { newPage.MoveTo(0); } RecurseClone(p.ID, newPage, sources, locale); } } }
/// <summary> /// Returns the widget instances of the specified page. /// </summary> /// <remarks> /// REST API: GET /api/widgets /// see : http://www.dotnetage.com/doc/dna/api-widget-list.html /// </remarks> /// <param name="url"></param> /// <returns></returns> public ActionResult Index(Uri url, int id = 0) { WebPage page = null; if (id == 0) { ///TODO: Find the custom MVC WebPage //var routeData = _context.FindRoute(url); //if (routeData != null) // page = _context.FindWebPage(url, routeData); } else { page = dataContext.WebPages.Find(id); } if (page == null) { return(Json(new { error = "Page not found" }, JsonRequestBehavior.AllowGet)); } //Auth if (page.Web.IsRoot) { if (!page.Owner.Equals(User.Identity.Name) && !App.Get().Context.HasPermisson(this, "Explorer")) { return(Json(new { error = "You have not enough permission to get this page." }, JsonRequestBehavior.AllowGet)); } } else { if (!page.Owner.Equals(User.Identity.Name)) { return(Json(new { error = "You have not enough permission to get this page." }, JsonRequestBehavior.AllowGet)); } } var p = new WebPageDecorator(page, dataContext); //var inPageWidgets=p.Widgets.ToList(); //dataContext.Where<Widget>(f=>f. return(Json(p.Widgets.Select(w => w.ToObject(HttpContext, page.Locale, this.CurrentWebName())), JsonRequestBehavior.AllowGet)); }
/// <summary> /// Create a new web page for content view /// </summary> /// <param name="view">The content view </param> /// <param name="parentId">The parent page id.</param> /// <param name="title">The page title</param> /// <param name="desc">The page description</param> /// <returns>A web page decorator object that wrapps the web page model.</returns> public WebPageDecorator CreatePage(ContentViewDecorator view, int parentId = 0, string title = "", string desc = "") { var slugFormatted = string.Format("lists/{0}/views/{1}", view.Parent.Name, view.Name); var locale = view.Parent.Locale; var existingPage = FindPage(locale, slugFormatted); if (existingPage != null) { return(new WebPageDecorator(existingPage, Context)); } var newpage = new WebPage() { Slug = slugFormatted, IsShared = false, IsStatic = false, Title = view.IsDefault ? view.Parent.Title : view.Title, Description = view.Description, ShowInMenu = false, ShowInSitemap = true, AllowAnonymous = true, Created = DateTime.Now, LastModified = DateTime.Now, WebID = this.Id, Owner = this.Owner, Dir = this.Dir, Locale = locale, ParentID = parentId }; if (!string.IsNullOrEmpty(title)) { newpage.Title = title; } if (!string.IsNullOrEmpty(desc)) { newpage.Description = desc; } Context.Add(newpage); Context.SaveChanges(); if (parentId > 0) { var parentPage = Context.Find <WebPage>(parentId); if (parentPage != null) { newpage.Path = parentPage.Path + "/" + newpage.ID.ToString(); Context.SaveChanges(); } } if (string.IsNullOrEmpty(newpage.Path)) { newpage.Path = "0/" + newpage.ID.ToString(); } #region create static widgets var app = App.Get(); var listInfoDescriptor = app.Descriptors[@"content\listinfo"]; var listInfoWidget = app.AddWidgetTo(this.Name, newpage.ID, listInfoDescriptor.ID, "ContentZone", 0); listInfoWidget.ShowHeader = false; listInfoWidget.ShowBorder = false; listInfoWidget.Title = view.Parent.Title; listInfoWidget.SetUserPreference("listName", view.Parent.Name); listInfoWidget.SetUserPreference("showTitle", false); listInfoWidget.SetUserPreference("showTools", true); listInfoWidget.Save(); //create view widget var viewDescriptor = app.Descriptors[@"content\dataview"]; var viewWidget = app.AddWidgetTo(this.Name, newpage.ID, viewDescriptor.ID, "ContentZone", 1); viewWidget.ShowHeader = false; viewWidget.ShowBorder = false; viewWidget.IsStatic = true; viewWidget.Title = view.Title; viewWidget.SetUserPreference("listName", view.Parent.Name); viewWidget.SetUserPreference("viewName", view.Name); viewWidget.SetUserPreference("allowFiltering", false); viewWidget.SetUserPreference("allowSorting", false); viewWidget.SetUserPreference("allowPaging", view.AllowPaging); viewWidget.SetUserPreference("pagingInfo", true); viewWidget.SetUserPreference("pageIndex", view.PageIndex); viewWidget.SetUserPreference("pageSize", view.PageSize); viewWidget.Save(); #endregion var pageWrapper = new WebPageDecorator(newpage, Context); if (view.Roles != null && view.Roles.Count() > 0) { pageWrapper.AddRoles(pageWrapper.Roles); } //Context.SaveChanges(); pageWrapper.UpdatePositions(); app.CurrentWeb.ClearCache(); return(pageWrapper); }
public override void OnActionExecuting(ActionExecutingContext filterContext) { var app = App.Get(); var routeData = filterContext.RequestContext.RouteData; var routeValues = routeData.Values; var controller = (string)routeValues["controller"]; var action = (string)routeValues["action"]; var locale = (routeValues.ContainsKey("locale") && routeValues["locale"] != null) ? routeValues["locale"].ToString() : App.Settings.DefaultLocale.ToLower(); var context = app.Context; var request = filterContext.HttpContext.Request; WebPageDecorator page = null; var hostName = request.Url.Host; #region Resolve www if (App.Settings.WWWResolved && !hostName.StartsWith("localhost")) { if (!ipExpr.IsMatch(hostName)) { if (!hostName.StartsWith("www") && hostName.Split('.').Count() == 1) { var resolveUrl = request.Url.Scheme + "://www." + request.Url.Authority + request.RawUrl; filterContext.Result = new RedirectResult(resolveUrl, true); return; } } } #endregion ///TODO:When the web not found redirect to web list page if (app.CurrentWeb == null) { if (app.Urls.Redirect(filterContext.HttpContext)) { filterContext.Result = new HttpStatusCodeResult(301); } else { if ((string)routeValues["website"] == "home") { filterContext.Result = new RedirectResult("~/install/index", true); } else { filterContext.Result = new RedirectResult("~/", true); } } return; } if (request.IsAuthenticated) { //Generate the user filterContext.HttpContext.User = app.User; } if (controller.Equals("DynamicUI", StringComparison.OrdinalIgnoreCase) && action.Equals("Index", StringComparison.OrdinalIgnoreCase)) { //This is a dynamic web page var slug = (string)routeValues["slug"]; page = app.CurrentWeb.FindPage(locale, slug); if (page != null) { context.Page = page.Model; filterContext.Controller.ViewBag.Page = page; } else { if (app.Urls.Redirect(filterContext.HttpContext)) { filterContext.Result = new HttpStatusCodeResult(301); } else { if (app.CurrentWeb.DefaultPage != null) { filterContext.Result = new RedirectResult(app.CurrentWeb.DefaultPage.Url); } else { filterContext.Result = new HttpNotFoundResult(); } } } } else { #region refill the parameters for action if (filterContext.ActionParameters.Count > 0) { //If the action is custom action we must generate the locale , website var _params = filterContext.ActionDescriptor.GetParameters(); foreach (var _param in _params) { if (_param.ParameterType.Equals(typeof(WebContext))) { filterContext.ActionParameters[_param.ParameterName] = context; } else { if (_param.ParameterType.Equals(typeof(string)) && _param.ParameterName.Equals("website", StringComparison.OrdinalIgnoreCase)) { filterContext.ActionParameters[_param.ParameterName] = context.Website; } if (_param.ParameterType.Equals(typeof(string)) && _param.ParameterName.Equals("locale", StringComparison.OrdinalIgnoreCase)) { filterContext.ActionParameters[_param.ParameterName] = context.Locale; } } } } #endregion //Generate the slug from route if (routeData != null && routeData.Route != null) { var route = (System.Web.Routing.Route)routeData.Route; var routeUrl = route.Url; #region format routeUrl as slug foreach (var key in routeValues.Keys) { if ((IgnoreRouteDataKeys != null) && (IgnoreRouteDataKeys.Length > 0)) { if (IgnoreRouteDataKeys.Contains(key)) { continue; //ignore } } if (routeValues[key] != null) { routeUrl = routeUrl.Replace("{" + key + "}", routeValues[key].ToString()); } else { if (route.Defaults.ContainsKey(key) && route.Defaults[key] != null) { routeUrl = routeUrl.Replace("{" + key + "}", route.Defaults[key].ToString()); } } } #endregion page = app.CurrentWeb.FindPage(locale, routeUrl); if (page == null) { var newpage = new WebPage() { Slug = routeUrl, IsShared = this.IsShared, IsStatic = true, Title = string.IsNullOrEmpty(this.Title) ? filterContext.ActionDescriptor.ActionName : this.Title, Description = this.Description, ShowInMenu = this.ShowInMenu, ShowInSitemap = this.ShowInSiteMap, AllowAnonymous = true, Created = DateTime.Now, LastModified = DateTime.Now, WebID = app.CurrentWeb.Id, Owner = app.CurrentWeb.Owner, Dir = app.CurrentWeb.Dir, Locale = locale }; app.DataContext.WebPages.Create(newpage); app.DataContext.SaveChanges(); page = app.Wrap(newpage); context.Page = newpage; } else { context.Page = page.Model; } filterContext.Controller.ViewBag.Page = page; } } if (page != null) { if (!page.IsAuthorized(filterContext.HttpContext)) { filterContext.Result = new HttpUnauthorizedResult(); return; } else { if (!string.IsNullOrEmpty(page.Description)) { filterContext.Controller.ViewBag.Description = page.Description; } if (!string.IsNullOrEmpty(page.Keywords)) { filterContext.Controller.ViewBag.Keywords = page.Keywords; } if (!string.IsNullOrEmpty(page.LinkTo)) { filterContext.Result = new RedirectResult(page.LinkTo); } } } }