Exemplo n.º 1
0
 public ActionResult Create(BasicWidget widget, string ReturnUrl)
 {
     if (!ModelState.IsValid)
     {
         return(View(widget));
     }
     _widgetActivator.Create(widget).AddWidget(widget);
     if (widget.ActionType == ActionType.Continue)
     {
         return(RedirectToAction("Edit", new { widget.ID, ReturnUrl }));
     }
     if (!ReturnUrl.IsNullOrEmpty())
     {
         return(Redirect(ReturnUrl));
     }
     if (!widget.PageID.IsNullOrEmpty())
     {
         return(RedirectToAction("Design", "Page", new { ID = widget.PageID }));
     }
     return(RedirectToAction("LayoutWidget", "Layout"));
 }
Exemplo n.º 2
0
        public override void Remove(LayoutEntity item)
        {
            var changeTo = Get().Where(m => m.ID != item.ID).FirstOrDefault();

            if (changeTo != null)
            {
                BeginTransaction(() =>
                {
                    _layoutHtmlService.Remove(m => m.LayoutId == item.ID && m.PageId == null);
                    _zoneService.Remove(m => m.LayoutId == item.ID && m.PageId == null);
                    var widgets = _widgetService.Get(m => m.LayoutID == item.ID);
                    widgets.Each(m =>
                    {
                        using (var widgetService = _widgetActivator.Create(m))
                        {
                            widgetService.DeleteWidget(m.ID);
                        }
                    });

                    base.Remove(item);
                });
            }
        }
Exemplo n.º 3
0
        public override void Remove(Rule item)
        {
            _widgetBasePartService.Get(m => m.RuleID == item.RuleID).Each(widget => { _widgetActivator.Create(widget).DeleteWidget(widget.ID); });

            base.Remove(item);
        }
        public ThemeEntity Import(string zipFile)
        {
            string themeName = null;
            List <PositionEntry> cssFiles  = new List <PositionEntry>();
            List <HtmlDocument>  documents = new List <HtmlDocument>();

            #region Decompression
            using (ZipArchive archive = ZipFile.OpenRead(zipFile))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    if (entry.FullName.StartsWith("__MACOSX/"))
                    {
                        continue;
                    }
                    if (themeName.IsNotNullAndWhiteSpace() && !entry.FullName.StartsWith(themeName))
                    {
                        new DirectoryInfo(Path.Combine(ThemeBasePath, themeName)).Delete(true);
                        throw new Exception("The package is not correct!");
                    }

                    if (entry.Length == 0 && entry.Name == string.Empty && entry.FullName.EndsWith('/'))
                    {
                        if (themeName == null)
                        {
                            themeName = entry.FullName.TrimEnd('/');
                        }

                        DirectoryInfo dir = new DirectoryInfo(Path.Combine(ThemeBasePath, entry.FullName));
                        if (dir.Exists)
                        {
                            dir.Delete(true);
                        }
                        dir.Create();
                        continue;
                    }
                    if (themeName == null)
                    {
                        return(null);
                    }

                    string extractFilePath = Path.Combine(ThemeBasePath, entry.FullName);

                    if (entry.FullName.EndsWith(".html"))
                    {
                        if (entry.FullName.IndexOf('/') != entry.FullName.LastIndexOf('/'))
                        {
                            continue;
                        }
                        HtmlDocument doc = new HtmlDocument();
                        doc.PageName = Path.GetFileName(entry.FullName).Replace(".html", string.Empty);
                        doc.Load(entry.Open());
                        documents.Add(doc);
                    }
                    else
                    {
                        entry.ExtractToFile(extractFilePath, true);
                    }
                }
            }
            #endregion

            LayoutEntity layout = CreateLayout(themeName);

            #region Create Page
            int index = 1;
            foreach (var document in documents)
            {
                var page = _pageService.GetByPath($"/{document.PageName}", true);
                if (page != null)
                {
                    _pageService.Remove(page);
                }
                string title     = document.PageName;
                var    titleNode = document.DocumentNode.SelectSingleNode("/html/head/title");
                if (titleNode != null && titleNode.InnerText.IsNotNullAndWhiteSpace())
                {
                    title = titleNode.InnerText.Trim();
                }
                page = new PageEntity
                {
                    Title    = title,
                    PageName = title,
                    ParentId = "#",
                    LayoutId = layout.ID,
                    Url      = $"~/{document.PageName}".ToLower(),
                    Status   = (int)Easy.Constant.RecordStatus.Active
                };
                if (document.PageName.Equals("index", StringComparison.OrdinalIgnoreCase))
                {
                    page.DisplayOrder = 1;
                }
                else
                {
                    page.DisplayOrder = ++index;
                }
                var addPageResult = _pageService.Add(page);
                if (addPageResult.HasViolation)
                {
                    throw new Exception(addPageResult.ErrorMessage);
                }
                #region Collect css
                var cssLinks = document.DocumentNode.SelectNodes("//link[@rel='stylesheet']");
                if (cssLinks != null)
                {
                    for (int i = 0; i < cssLinks.Count; i++)
                    {
                        string href = cssLinks[i].GetAttributeValue("href", string.Empty);

                        if (href == string.Empty)
                        {
                            continue;
                        }
                        if (!isOutSidePath(href))
                        {
                            href = ConvertToThemePath(themeName, href);
                        }
                        if (!cssFiles.Any(m => m.Entry == href))
                        {
                            foreach (var item in cssFiles)
                            {
                                if (item.Position >= i)
                                {
                                    item.Position++;
                                }
                            }
                            cssFiles.Add(new PositionEntry
                            {
                                Entry    = href,
                                Position = i
                            });
                        }
                    }
                }

                #endregion

                #region Collect Scripts
                StringBuilder pageScripts = new StringBuilder();
                var           scripts     = document.DocumentNode.SelectNodes("//script");
                if (scripts != null)
                {
                    foreach (var item in scripts)
                    {
                        string path = item.GetAttributeValue("src", string.Empty);
                        if (path.IsNotNullAndWhiteSpace() && !isOutSidePath(path))
                        {
                            item.SetAttributeValue("src", ConvertToThemePath(themeName, path));
                        }
                        string fileName = Path.GetFileName(path);
                        if (!jQueryFilter.IsMatch(fileName) && !BootstrapFilter.IsMatch(fileName))
                        {
                            pageScripts.AppendLine(item.OuterHtml.Trim());
                        }
                        item.Remove();
                    }
                }
                #endregion

                #region Collect Style
                StringBuilder pageStyle   = new StringBuilder();
                var           innerStyles = document.DocumentNode.SelectNodes("//style");
                if (innerStyles != null)
                {
                    foreach (var item in innerStyles)
                    {
                        pageStyle.AppendLine(item.InnerText);
                    }
                }
                #endregion

                #region Url fix
                var links = document.DocumentNode.SelectNodes("//a");
                if (links != null)
                {
                    foreach (var item in links)
                    {
                        string href = item.GetAttributeValue("href", string.Empty);
                        if (href.IsNotNullAndWhiteSpace() && !isOutSidePath(href) && !href.StartsWith('/'))
                        {
                            if (Easy.Image.ImageHelper.IsImage(Path.GetExtension(href)))
                            {
                                item.SetAttributeValue("href", ConvertToThemePath(themeName, href));
                            }
                            else
                            {
                                item.SetAttributeValue("href", $"/{href}");
                            }
                        }
                    }
                }
                var images = document.DocumentNode.SelectNodes("//img");
                if (images != null)
                {
                    foreach (var item in images)
                    {
                        string src = item.GetAttributeValue("src", string.Empty);
                        if (src.IsNotNullAndWhiteSpace() && !isOutSidePath(src))
                        {
                            item.SetAttributeValue("src", ConvertToThemePath(themeName, src));
                        }
                    }
                }
                #endregion

                if (pageStyle.Length > 0)
                {
                    string section = $"<style>{pageStyle.ToString().Trim()}</style>";
                    section = StyleUrl.Replace(section, evaluator =>
                    {
                        return($"url({ConvertToThemePath(themeName, evaluator.Groups[1].Value)})");
                    });
                    var styleWidget = _widgetCreatorManager.Create(section, themeName);
                    styleWidget.PageID     = page.ID;
                    styleWidget.WidgetName = "Style";
                    styleWidget.Position   = 0;
                    styleWidget.ZoneID     = "ZONE-0";
                    styleWidget.StyleClass = "full";
                    _widgetActivator.Create(styleWidget).AddWidget(styleWidget);
                }
                var sections = document.DocumentNode.SelectSingleNode("/html/body").ChildNodes;
                for (int i = 0; i < sections.Count; i++)
                {
                    var node = sections[i];
                    if (node.NodeType == HtmlAgilityPack.HtmlNodeType.Element)
                    {
                        var    tNode       = node.SelectSingleNode(".//h1|.//h2|.//h3|.//h4|.//h5|.//h6");
                        string widgetTitle = tNode?.InnerText;

                        string section = StyleUrl.Replace(node.OuterHtml, evaluator =>
                        {
                            return($"url({ConvertToThemePath(themeName, evaluator.Groups[1].Value)})");
                        });
                        var widget = _widgetCreatorManager.Create(section, themeName);
                        widget.PageID     = page.ID;
                        widget.WidgetName = (widgetTitle ?? "Html Widget").Trim();
                        widget.Position   = i;
                        widget.ZoneID     = "ZONE-1";
                        widget.StyleClass = "full";
                        _widgetActivator.Create(widget).AddWidget(widget);
                    }
                }
                if (pageScripts.Length > 0)
                {
                    var scriptWidget = _widgetCreatorManager.Create(pageScripts.ToString().Trim(), themeName);
                    scriptWidget.PageID     = page.ID;
                    scriptWidget.WidgetName = "JavaScript";
                    scriptWidget.Position   = document.DocumentNode.ChildNodes.Count;
                    scriptWidget.ZoneID     = "ZONE-2";
                    scriptWidget.StyleClass = "full";
                    _widgetActivator.Create(scriptWidget).AddWidget(scriptWidget);
                }
            }
            #endregion
            return(CreateTheme(themeName, cssFiles));
        }