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

/application/plugins/files/models/ProjectFolder.class.php

https://github.com/fb83/Project-Pier
PHP | 326 lines | 135 code | 33 blank | 158 comment | 21 complexity | 9e71879dc715e5132ee568a1eeae88dd MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, AGPL-3.0, LGPL-2.1, GPL-3.0
  1. <?php
  2. /**
  3. * ProjectFolder class
  4. *
  5. * @http://www.projectpier.org/
  6. */
  7. class ProjectFolder extends BaseProjectFolder {
  8. /**
  9. * Cached array of all folder files
  10. *
  11. * @var array
  12. */
  13. private $all_files;
  14. /**
  15. * Cached array of folder files filtered by user permissions
  16. *
  17. * @var array
  18. */
  19. private $files;
  20. /**
  21. * Cached parent folder
  22. *
  23. * @var object
  24. */
  25. private $parent;
  26. /**
  27. * Return all project files
  28. *
  29. * @param void
  30. * @return array
  31. */
  32. function getAllFiles() {
  33. if (is_null($this->all_files)) {
  34. $this->all_files = ProjectFiles::getByFolder($this, true);
  35. } // if
  36. return $this->all_files;
  37. } // getAllFiles
  38. /**
  39. * Return files
  40. *
  41. * @param void
  42. * @return array
  43. */
  44. function getFiles() {
  45. if (is_null($this->files)) {
  46. $this->files = ProjectFiles::getByFolder($this, logged_user()->isMemberOfOwnerCompany());
  47. } // if
  48. return $this->files;
  49. } // getFiles
  50. /**
  51. * Return parent folder
  52. *
  53. * @param void
  54. * @return object
  55. */
  56. function getParent() {
  57. if (is_null($this->parent)) {
  58. $this->parent = ProjectFolders::findById($this->getParentId());
  59. if (($this->parent instanceof ProjectFolder) && ($this->parent->getProjectId() <> $this->getProjectId())) {
  60. $this->parent = null;
  61. } // if
  62. } // if
  63. return $this->parent;
  64. } // getParentFolder
  65. // ---------------------------------------------------
  66. // URLs
  67. // ---------------------------------------------------
  68. /**
  69. * Return browse URL
  70. *
  71. * @param string $order_by
  72. * @param integer $page
  73. * @return string
  74. */
  75. function getBrowseUrl($order_by = null, $page = null) {
  76. trace(__FILE__,'getBrowseUrl()');
  77. // If page and order are not set use defaults
  78. if (($order_by <> ProjectFiles::ORDER_BY_NAME) && ($order_by <> ProjectFiles::ORDER_BY_POSTTIME)) {
  79. $order_by = ProjectFiles::ORDER_BY_POSTTIME;
  80. } // if
  81. // #PAGE# is reserved as a placeholder
  82. if ($page <> '#PAGE#') {
  83. $page = (integer) $page > 0 ? (integer) $page : 1;
  84. } // if
  85. return get_url('files', 'browse_folder', array(
  86. 'id' => $this->getId(),
  87. 'active_project' => $this->getProjectId(),
  88. 'order' => $order_by,
  89. 'page' => $page
  90. )); // array
  91. } // getBrowseUrl
  92. /**
  93. * Return add file URL
  94. *
  95. * @param void
  96. * @return string
  97. */
  98. function getAddFileUrl() {
  99. return get_url('files', 'add_file', array(
  100. 'folder_id' => $this->getId(),
  101. 'active_project' => $this->getProjectId()
  102. )); // array
  103. } // getAddFileUrl
  104. /**
  105. * Return add folder URL
  106. *
  107. * @param void
  108. * @return string
  109. */
  110. function getAddUrl() {
  111. return get_url('files', 'add_folder', array(
  112. 'folder_id' => $this->getId(),
  113. 'active_project' => $this->getProjectId()
  114. )); // array
  115. } // getAddFileUrl
  116. /**
  117. * Return edit folder URL
  118. *
  119. * @param void
  120. * @return string
  121. */
  122. function getEditUrl() {
  123. return get_url('files', 'edit_folder', array('id' => $this->getId(), 'active_project' => $this->getProjectId()));
  124. } // getEditUrl
  125. /**
  126. * Return delete folder URL
  127. *
  128. * @param void
  129. * @return string
  130. */
  131. function getDeleteUrl() {
  132. return get_url('files', 'delete_folder', array('id' => $this->getId(), 'active_project' => $this->getProjectId()));
  133. } // getDeleteUrl
  134. // ---------------------------------------------------
  135. // Permissions
  136. // ---------------------------------------------------
  137. /**
  138. * Check CAN_MANAGE_FILES permission
  139. *
  140. * @access public
  141. * @param User $user
  142. * @return boolean
  143. */
  144. function canManage(User $user) {
  145. trace(__FILE__,'canManage()');
  146. if (!$user->isProjectUser($this->getProject())) {
  147. return false;
  148. }
  149. if ($user->isAdministrator()) {
  150. return true;
  151. }
  152. return $user->getProjectPermission($this->getProject(), PermissionManager::CAN_MANAGE_FILES);
  153. } // canManage
  154. /**
  155. * Empty implementation of abstract method. Message determins if user have view access
  156. *
  157. * @param void
  158. * @return boolean
  159. */
  160. function canView(User $user) {
  161. return ($user->isAdministrator()) || $user->isProjectUser($this->getProject());
  162. } // canView
  163. /**
  164. * Does user have permission to add
  165. *
  166. * @param void
  167. * @return null
  168. */
  169. function canAdd(User $user, Project $project) {
  170. trace(__FILE__,'canAdd()');
  171. if (!$user->isProjectUser($project)) {
  172. return false;
  173. }
  174. if ($user->isAdministrator()) {
  175. return true;
  176. }
  177. return $user->getProjectPermission($project, PermissionManager::CAN_MANAGE_FILES);
  178. } // canAdd
  179. /**
  180. * Check if specific user can edit this file
  181. *
  182. * @access public
  183. * @param User $user
  184. * @return boolean
  185. */
  186. function canEdit(User $user) {
  187. return $this->canManage($user);
  188. } // canEdit
  189. /**
  190. * Check if specific user can delete this comment
  191. *
  192. * @access public
  193. * @param User $user
  194. * @return boolean
  195. */
  196. function canDelete(User $user) {
  197. return $this->canManage($user);
  198. } // canDelete
  199. // ---------------------------------------------------
  200. // System
  201. // ---------------------------------------------------
  202. /**
  203. * Validate before save
  204. *
  205. * @param array $errors
  206. * @return null
  207. */
  208. function validate(&$errors) {
  209. if ($this->validatePresenceOf('name')) {
  210. if (!$this->validateUniquenessOf('name', 'project_id')) {
  211. $errors[] = lang('folder name unique');
  212. }
  213. } else {
  214. $errors[] = lang('folder name required');
  215. } // if
  216. } // validate
  217. /**
  218. * Delete this folder
  219. *
  220. * @param void
  221. * @return boolean
  222. */
  223. function delete() {
  224. $files = $this->getAllFiles();
  225. if (is_array($files)) {
  226. foreach ($files as $file) {
  227. $file->delete();
  228. }
  229. } // if
  230. return parent::delete();
  231. } // delete
  232. // ---------------------------------------------------
  233. // ApplicationDataObject implementation
  234. // ---------------------------------------------------
  235. /**
  236. * Return object name
  237. *
  238. * @access public
  239. * @param void
  240. * @return string
  241. */
  242. function getObjectName($full = false) {
  243. $name = $this->getName();
  244. if ($full) {
  245. $f = $this->getParent();
  246. if (!is_null($f)) {
  247. $n = $f->getObjectName($full);
  248. return $n . '/' .$name;
  249. }
  250. }
  251. return $name;
  252. } // getObjectName
  253. /**
  254. * Return object type name
  255. *
  256. * @param void
  257. * @return string
  258. */
  259. function getObjectTypeName() {
  260. //$class = explode('\\', __CLASS__);
  261. //$class = strtolower(end($class));
  262. //$class = str_replace('project', '', $class);
  263. //return lang($class);
  264. return lang('folder');
  265. } // getObjectTypeName
  266. /**
  267. * Return object URl
  268. *
  269. * @access public
  270. * @param void
  271. * @return string
  272. */
  273. function getObjectUrl() {
  274. return $this->getBrowseUrl();
  275. } // getObjectUrl
  276. /**
  277. * Return object path (location of the object)
  278. *
  279. * @param void
  280. * @return string
  281. */
  282. function getObjectPath() {
  283. $f = $this->getParent();
  284. if (is_null($f)) {
  285. $path = parent::getObjectPath();
  286. } else {
  287. $path = $f->getObjectPath();
  288. }
  289. $path[] = $this->getObjectName();
  290. return $path;
  291. } // getObjectPath
  292. } // ProjectFolder
  293. ?>