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));
        }
Esempio n. 3
0
        /// <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);
                    }
                }
            }
        }