PageRenderTime 42ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/BlogEngine/BlogEngine.NET/admin/Pages/EditPage.aspx.cs

#
C# | 410 lines | 262 code | 63 blank | 85 comment | 37 complexity | e9babeb20d42743ff918ff242ef54a9b MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, BSD-3-Clause
  1. // --------------------------------------------------------------------------------------------------------------------
  2. // <summary>
  3. // The page editor.
  4. // </summary>
  5. // --------------------------------------------------------------------------------------------------------------------
  6. namespace Admin.Pages
  7. {
  8. using System;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Web.UI;
  12. using System.Web.UI.HtmlControls;
  13. using System.Web.UI.WebControls;
  14. using BlogEngine.Core;
  15. using Resources;
  16. using Page = System.Web.UI.Page;
  17. using App_Code;
  18. using BlogEngine.Core.Providers;
  19. public partial class EditPage : Page, ICallbackEventHandler
  20. {
  21. protected string PageUrl
  22. {
  23. get
  24. {
  25. if (!String.IsNullOrEmpty(this.Request.QueryString["id"]) && this.Request.QueryString["id"].Length == 36)
  26. {
  27. var id = new Guid(this.Request.QueryString["id"]);
  28. BlogEngine.Core.Page pg = BlogEngine.Core.Page.GetPage(id);
  29. return pg.RelativeLink;
  30. }
  31. return string.Empty;
  32. }
  33. }
  34. #region Constants and Fields
  35. /// <summary>
  36. /// The callback.
  37. /// </summary>
  38. private string callback;
  39. #endregion
  40. #region Implemented Interfaces
  41. #region ICallbackEventHandler
  42. /// <summary>
  43. /// Returns the results of a callback event that targets a control.
  44. /// </summary>
  45. /// <returns>The result of the callback.</returns>
  46. public string GetCallbackResult()
  47. {
  48. return this.callback;
  49. }
  50. /// <summary>
  51. /// Processes a callback event that targets a control.
  52. /// </summary>
  53. /// <param name="eventArgument">A string that represents an event argument to pass to the event handler.</param>
  54. public void RaiseCallbackEvent(string eventArgument)
  55. {
  56. this.callback = Utils.RemoveIllegalCharacters(eventArgument.Trim());
  57. }
  58. #endregion
  59. #endregion
  60. #region Methods
  61. /// <summary>
  62. /// Raises the <see cref="E:System.Web.UI.Control.Init"/> event to initialize the page.
  63. /// </summary>
  64. /// <param name="e">An <see cref="T:System.EventArgs"/> that contains the event data.</param>
  65. protected override void OnInit(EventArgs e)
  66. {
  67. WebUtils.CheckRightsForAdminPagesPages(false);
  68. this.MaintainScrollPositionOnPostBack = true;
  69. if (!String.IsNullOrEmpty(this.Request.QueryString["id"]) && this.Request.QueryString["id"].Length == 36)
  70. {
  71. var id = new Guid(this.Request.QueryString["id"]);
  72. this.BindPage(id);
  73. this.BindParents(id);
  74. }
  75. else if (!String.IsNullOrEmpty(this.Request.QueryString["delete"]) &&
  76. this.Request.QueryString["delete"].Length == 36)
  77. {
  78. var id = new Guid(this.Request.QueryString["delete"]);
  79. this.DeletePage(id);
  80. }
  81. else
  82. {
  83. if (!Security.IsAuthorizedTo(Rights.CreateNewPages))
  84. {
  85. Response.Redirect(Utils.RelativeWebRoot);
  86. return;
  87. }
  88. this.BindParents(Guid.Empty);
  89. this.cbPublished.Checked = Security.IsAuthorizedTo(Rights.PublishOwnPages);
  90. }
  91. this.btnUploadFile.Click += this.BtnUploadFileClick;
  92. this.btnUploadImage.Click += this.BtnUploadImageClick;
  93. this.btnUploadVideo.Click += this.BtnUploadVideoClick;
  94. this.Page.Title = labels.pages;
  95. base.OnInit(e);
  96. }
  97. /// <summary>
  98. /// Raises the <see cref="E:System.Web.UI.Control.Load"/> event.
  99. /// </summary>
  100. /// <param name="e">The <see cref="T:System.EventArgs"/> object that contains the event data.</param>
  101. protected override void OnLoad(EventArgs e)
  102. {
  103. base.OnLoad(e);
  104. if (!this.Page.IsPostBack && !this.Page.IsCallback)
  105. {
  106. this.Page.ClientScript.GetCallbackEventReference(this, "title", "ApplyCallback", "slug");
  107. }
  108. }
  109. /// <summary>
  110. /// The bind page.
  111. /// </summary>
  112. /// <param name="pageId">
  113. /// The page id.
  114. /// </param>
  115. private void BindPage(Guid pageId)
  116. {
  117. var page = BlogEngine.Core.Page.GetPage(pageId);
  118. if (page == null || !page.CanUserEdit)
  119. {
  120. Response.Redirect(Request.Path);
  121. return;
  122. }
  123. this.txtTitle.Text = page.Title;
  124. this.txtContent.Text = page.Content;
  125. this.txtDescription.Text = page.Description;
  126. this.txtKeyword.Text = page.Keywords;
  127. this.txtSlug.Text = page.Slug;
  128. this.cbFrontPage.Checked = page.IsFrontPage;
  129. this.cbShowInList.Checked = page.ShowInList;
  130. this.cbPublished.Checked = page.IsPublished;
  131. }
  132. /// <summary>
  133. /// The bind parents.
  134. /// </summary>
  135. /// <param name="pageId">
  136. /// The page id.
  137. /// </param>
  138. private void BindParents(Guid pageId)
  139. {
  140. foreach (var page in BlogEngine.Core.Page.Pages.Where(page => pageId != page.Id))
  141. {
  142. this.ddlParent.Items.Add(new ListItem(page.Title, page.Id.ToString()));
  143. }
  144. this.ddlParent.Items.Insert(0, string.Format("-- {0} --", labels.noParent));
  145. if (pageId == Guid.Empty)
  146. {
  147. return;
  148. }
  149. var parent = BlogEngine.Core.Page.GetPage(pageId);
  150. if (parent != null)
  151. {
  152. this.ddlParent.SelectedValue = parent.Parent.ToString();
  153. }
  154. }
  155. /// <summary>
  156. /// Builds the child page list.
  157. /// </summary>
  158. /// <param name="page">The page to make a child list for.</param>
  159. /// <returns>The page list.</returns>
  160. private HtmlGenericControl BuildChildPageList(BlogEngine.Core.Page page)
  161. {
  162. var ul = new HtmlGenericControl("ul");
  163. foreach (var childPage in BlogEngine.Core.Page.Pages.FindAll(p => p.Parent == page.Id))
  164. {
  165. var cLi = new HtmlGenericControl("li");
  166. cLi.Attributes.CssStyle.Add("font-weight", "normal");
  167. var cA = new HtmlAnchor { HRef = string.Format("?id={0}", childPage.Id), InnerHtml = childPage.Title };
  168. var childText = new LiteralControl(string.Format(" ({0}) ", childPage.DateCreated.ToString("yyyy-dd-MM HH:mm")));
  169. const string DeleteText = "Are you sure you want to delete the page?";
  170. var delete = new HtmlAnchor { InnerText = labels.delete };
  171. delete.Attributes["onclick"] = string.Format("if (confirm('{0}')){{location.href='?delete={1}'}}", DeleteText, childPage.Id);
  172. delete.HRef = "javascript:void(0);";
  173. delete.Style.Add(HtmlTextWriterStyle.FontWeight, "normal");
  174. cLi.Controls.Add(cA);
  175. cLi.Controls.Add(childText);
  176. cLi.Controls.Add(delete);
  177. if (childPage.HasChildPages)
  178. {
  179. cLi.Attributes.CssStyle.Remove("font-weight");
  180. cLi.Attributes.CssStyle.Add("font-weight", "bold");
  181. cLi.Controls.Add(this.BuildChildPageList(childPage));
  182. }
  183. ul.Controls.Add(cLi);
  184. }
  185. return ul;
  186. }
  187. /// <summary>
  188. /// The delete page.
  189. /// </summary>
  190. /// <param name="pageId">
  191. /// The page id.
  192. /// </param>
  193. private void DeletePage(Guid pageId)
  194. {
  195. var page = BlogEngine.Core.Page.GetPage(pageId);
  196. if (page == null)
  197. {
  198. return;
  199. }
  200. if (!page.CanUserDelete)
  201. {
  202. Response.Redirect(Utils.RelativeWebRoot);
  203. return;
  204. }
  205. this.ResetParentPage(page);
  206. page.Delete();
  207. page.Save();
  208. this.Response.Redirect("pages.aspx");
  209. }
  210. /// <summary>
  211. /// Resets the parent page.
  212. /// </summary>
  213. /// <param name="page">The page to reset.</param>
  214. private void ResetParentPage(BlogEngine.Core.Page page)
  215. {
  216. foreach (var child in BlogEngine.Core.Page.Pages.Where(child => page.Id == child.Parent))
  217. {
  218. child.Parent = Guid.Empty;
  219. child.Save();
  220. this.ResetParentPage(child);
  221. }
  222. }
  223. /// <summary>
  224. /// Formats the size.
  225. /// </summary>
  226. /// <param name="size">The size to format.</param>
  227. /// <param name="formatString">The format string.</param>
  228. /// <returns>The formatted string.</returns>
  229. private static string SizeFormat(float size, string formatString)
  230. {
  231. if (size < 1024)
  232. {
  233. return string.Format("{0} bytes", size.ToString(formatString));
  234. }
  235. if (size < Math.Pow(1024, 2))
  236. {
  237. return string.Format("{0} kb", (size / 1024).ToString(formatString));
  238. }
  239. if (size < Math.Pow(1024, 3))
  240. {
  241. return string.Format("{0} mb", (size / Math.Pow(1024, 2)).ToString(formatString));
  242. }
  243. if (size < Math.Pow(1024, 4))
  244. {
  245. return string.Format("{0} gb", (size / Math.Pow(1024, 3)).ToString(formatString));
  246. }
  247. return size.ToString(formatString);
  248. }
  249. /// <summary>
  250. /// Uploads the specified virtual folder.
  251. /// </summary>
  252. /// <param name="virtualFolder">The virtual folder.</param>
  253. /// <param name="control">The control.</param>
  254. /// <param name="fileName">Name of the file.</param>
  255. private void Upload(string virtualFolder, FileUpload control, string fileName)
  256. {
  257. var folder = this.Server.MapPath(virtualFolder);
  258. if (!Directory.Exists(folder))
  259. {
  260. Directory.CreateDirectory(folder);
  261. }
  262. control.PostedFile.SaveAs(folder + fileName);
  263. }
  264. /// <summary>
  265. /// Handles the Click event of the btnSave control.
  266. /// </summary>
  267. /// <param name="sender">The source of the event.</param>
  268. /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
  269. private void BtnSaveClick(object sender, EventArgs e)
  270. {
  271. if (!this.Page.IsValid)
  272. {
  273. throw new InvalidOperationException("One or more validators are invalid.");
  274. }
  275. var page = this.Request.QueryString["id"] != null ? BlogEngine.Core.Page.GetPage(new Guid(this.Request.QueryString["id"])) : new BlogEngine.Core.Page();
  276. if (string.IsNullOrEmpty(this.txtContent.Text))
  277. {
  278. this.txtContent.Text = "[No text]";
  279. }
  280. page.Title = this.txtTitle.Text;
  281. page.Content = this.txtContent.Text;
  282. page.Description = this.txtDescription.Text;
  283. page.Keywords = this.txtKeyword.Text;
  284. if (this.cbFrontPage.Checked)
  285. {
  286. foreach (var otherPage in BlogEngine.Core.Page.Pages.Where(otherPage => otherPage.IsFrontPage))
  287. {
  288. otherPage.IsFrontPage = false;
  289. otherPage.Save();
  290. }
  291. }
  292. page.IsFrontPage = this.cbFrontPage.Checked;
  293. page.ShowInList = this.cbShowInList.Checked;
  294. page.IsPublished = this.cbPublished.Checked;
  295. if (!string.IsNullOrEmpty(this.txtSlug.Text))
  296. {
  297. page.Slug = Utils.RemoveIllegalCharacters(this.txtSlug.Text.Trim());
  298. }
  299. page.Parent = this.ddlParent.SelectedIndex != 0 ? new Guid(this.ddlParent.SelectedValue) : Guid.Empty;
  300. page.Save();
  301. this.Response.Redirect(page.RelativeLink);
  302. }
  303. /// <summary>
  304. /// Handles the Click event of the btnUploadFile control.
  305. /// </summary>
  306. /// <param name="sender">The source of the event.</param>
  307. /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
  308. private void BtnUploadFileClick(object sender, EventArgs e)
  309. {
  310. var dirName = string.Format("/{0}/{1}", DateTime.Now.ToString("yyyy"), DateTime.Now.ToString("MM"));
  311. var dir = BlogService.GetDirectory(dirName);
  312. var file = BlogService.UploadFile(txtUploadFile.PostedFile.InputStream, txtUploadFile.PostedFile.FileName, dir, true);
  313. txtContent.Text += string.Format("<p><a href=\"{0}\">{1}</a></p>", file.FileDownloadPath, file.FileDescription);
  314. }
  315. /// <summary>
  316. /// Handles the Click event of the btnUploadImage control.
  317. /// </summary>
  318. /// <param name="sender">The source of the event.</param>
  319. /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
  320. private void BtnUploadImageClick(object sender, EventArgs e)
  321. {
  322. var dirName = string.Format("/{0}/{1}", DateTime.Now.ToString("yyyy"), DateTime.Now.ToString("MM"));
  323. var dir = BlogService.GetDirectory(dirName);
  324. var file = BlogService.UploadFile(txtUploadImage.PostedFile.InputStream, txtUploadImage.PostedFile.FileName, dir, true);
  325. txtContent.Text += string.Format("<img src=\"{0}\" />", file.AsImage.ImageUrl);
  326. }
  327. /// <summary>
  328. /// Handles the Click event of the btnUploadVideo control.
  329. /// </summary>
  330. /// <param name="sender">The source of the event.</param>
  331. /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
  332. protected void BtnUploadVideoClick(object sender, EventArgs e)
  333. {
  334. // default media folder
  335. var mediaFolder = "media";
  336. // get the mediaplayer extension and use it's folder
  337. var mediaPlayerExtension = BlogEngine.Core.Web.Extensions.ExtensionManager.GetExtension("MediaElementPlayer");
  338. mediaFolder = mediaPlayerExtension.Settings[0].GetSingleValue("folder");
  339. var folder = "~/" + mediaFolder + "/";
  340. var fileName = txtUploadVideo.FileName;
  341. Upload(folder, txtUploadVideo, fileName);
  342. var shortCode = "[video src=\"" + fileName + "\"]";
  343. txtContent.Text += shortCode;
  344. }
  345. #endregion
  346. }
  347. }