/src/project/view/EditProject.php

https://gitlab.com/matthisstenius/php-projekt · PHP · 170 lines · 104 code · 37 blank · 29 comment · 13 complexity · c7a442f005707c33aa4ebede2cb52857 MD5 · raw file

  1. <?php
  2. namespace project\view;
  3. require_once("src/common/view/Filter.php");
  4. class EditProject {
  5. private static $projectName = "projectName";
  6. private static $projectDescription = "projectDescription";
  7. private static $makePrivate = "private";
  8. private static $errorMessage = "project::view::edit::errorMessage";
  9. /**
  10. * @var project\model\ProjectHandeler
  11. */
  12. private $projectHandeler;
  13. /**
  14. * @var project\model\Project
  15. */
  16. private $project;
  17. /**
  18. * @var common\view\Navigation
  19. */
  20. private $navigationView;
  21. /**
  22. * @param project\model\ProjectHandeler $projectHandeler
  23. * @param project\model\Project $project
  24. * @param common\view\Navigation $navigationView
  25. */
  26. public function __construct(\project\model\ProjectHandeler $projectHandeler,
  27. \project\model\Project $project) {
  28. $this->projectHandeler = $projectHandeler;
  29. $this->project = $project;
  30. $this->navigationView = new \common\view\Navigation();
  31. }
  32. /**
  33. * @return string HTML
  34. */
  35. public function getEditProjectForm() {
  36. $cleanUrl = \common\view\Filter::getCleanUrl($this->project->getName());
  37. $html = "<h1 class='new-title'>Edit " . $this->project->getName() . "</h1>";
  38. if (isset($_SESSION[self::$errorMessage])) {
  39. $html .= $_SESSION[self::$errorMessage];
  40. unset($_SESSION[self::$errorMessage]);
  41. }
  42. $editProjectSrc = $this->navigationView->getEditProjectSrc($this->project->getProjectID(),
  43. $cleanUrl);
  44. $backToProjectSrc = $this->navigationView->getProjectSrc($this->project->getProjectID(),
  45. $cleanUrl);
  46. $html .= "<form class='pure-form pure-form-stacked' action='$editProjectSrc' method='POST'>
  47. <input type='hidden' name='_method' value='put'>
  48. <input class='input-wide' id='". self::$projectName . "' type='text'
  49. name='". self::$projectName . "' value='" . $this->project->getName() . "'>
  50. <textarea class='input-wide input-content'
  51. name='". self::$projectDescription . "'>" . $this->project->getDescription() . "</textarea>
  52. <label class='make-project-private' for='" . self::$makePrivate . "'>Make this project private</label>";
  53. if ($this->project->isPrivate()) {
  54. $html .= "<input class='make-project-private' id='" . self::$makePrivate . "'
  55. type='checkbox' checked name='" . self::$makePrivate . "'>";
  56. }
  57. else {
  58. $html .= "<input class='make-project-private' id='" . self::$makePrivate . "'
  59. type='checkbox' name='" . self::$makePrivate . "'>";
  60. }
  61. $html .= "<p><button class='btn btn-add'>Save Project</button>
  62. <a href='$backToProjectSrc' class='btn btn-remove'>Cancel</a></p>
  63. </form>";
  64. return $html;
  65. }
  66. /**
  67. * @return string Clean string
  68. */
  69. private function getProjectName() {
  70. if (isset($_POST[self::$projectName])) {
  71. return \common\view\Filter::clean($_POST[self::$projectName]);
  72. }
  73. return "";
  74. }
  75. /**
  76. * @return string Clean string
  77. */
  78. private function getProjectDescription() {
  79. if (isset($_POST[self::$projectDescription])) {
  80. return \common\view\Filter::clean($_POST[self::$projectDescription]);
  81. }
  82. return "";
  83. }
  84. /**
  85. * @return boolean
  86. */
  87. private function getIsPrivate() {
  88. if (isset($_POST[self::$makePrivate])) {
  89. return (bool) $_POST[self::$makePrivate];
  90. }
  91. return false;
  92. }
  93. /**
  94. * @return void
  95. */
  96. public function saveProject() {
  97. try {
  98. $newProject = new \project\model\Project($this->project->getProjectID(), $this->getProjectName(),
  99. $this->getProjectDescription(),
  100. $this->project->getDateCreated(),
  101. $this->project->getUsername(),
  102. $this->project->getUserID(),
  103. $this->getIsPrivate());
  104. $this->projectHandeler->editProject($newProject);
  105. $this->navigationView->goToProject($newProject->getProjectID(),
  106. \common\view\Filter::getCleanUrl($newProject->getName()),
  107. $newProject->getName());
  108. }
  109. catch (\Exception $e) {
  110. $this->userInputFaulty();
  111. $this->navigationView->goToEditProject($this->project->getProjectID(), $this->project->getName());
  112. }
  113. }
  114. private function userInputFaulty() {
  115. $errorMessage = "";
  116. if ($this->getProjectName() == "") {
  117. $errorMessage .= "<p>Enter a Project name</p>";
  118. }
  119. if (strlen($this->getProjectName()) > 45) {
  120. $errorMessage .= "<p>Project name is to long. Max 45 charachters allowed.</p>";
  121. }
  122. if (preg_match('/[^\wåäöÅÄÖ]+/', $this->getProjectName())) {
  123. $errorMessage .= "<p>Invalid charachters in project name. Only alphanumeric charachters allowed.</p>";
  124. }
  125. if ($this->getProjectDescription() == "") {
  126. $errorMessage .= "<p>Enter a valid description</p>";
  127. }
  128. if (strlen($this->getProjectDescription()) > 500) {
  129. $errorMessage .= "<p>Project decoration is to long. Max 500 charachters allowed.</p>";
  130. }
  131. $_SESSION[self::$errorMessage] = $errorMessage;
  132. }
  133. }