/src/Provider/Controller/Project.php

https://github.com/igorw-forks/marketplace · PHP · 245 lines · 158 code · 54 blank · 33 comment · 5 complexity · b7a75332a3aac9c1c590fc9bad44b5ea MD5 · raw file

  1. <?php
  2. namespace Provider\Controller;
  3. use Silex\ControllerProviderInterface;
  4. use Silex\Application;
  5. use Silex\ControllerCollection;
  6. use Form;
  7. class Project implements ControllerProviderInterface
  8. {
  9. public function connect(Application $app)
  10. {
  11. $controllers = new ControllerCollection();
  12. /**
  13. * Adds a comment to a project
  14. */
  15. $controllers->post('/{id}/comment', function($id) use ($app) {
  16. $form = $app['form.factory']->create(new Form\CommentType());
  17. $form->bindRequest($app['request']);
  18. if ($form->isValid()) {
  19. $comment = $form->getData();
  20. unset($comment['id']);
  21. $comment['project_id'] = $id;
  22. $comment['username'] = $app['session']->get('username');
  23. $comment['content_html'] = $app['markdown']($comment['content']);
  24. $app['comments']->insert($comment);
  25. $app['projects']->update(array('last_commented_at' => date('Y-m-d H:i:s')), array('id' => $id));
  26. return $app->redirect($app['url_generator']->generate('project_show', array('id' => $id)));
  27. }
  28. $project = $app['projects']->find($id);
  29. $comments = $app['comments']->findByProjectId($id);
  30. return $app['twig']->render('Project/show.html.twig', array(
  31. 'form' => $form->createView(),
  32. 'project' => $project,
  33. 'comments' => $comments,
  34. ));
  35. })->bind('project_comment');
  36. /**
  37. * Adds a link to a project
  38. */
  39. $controllers->post('/{id}/link', function($id) use ($app) {
  40. $form = $app['form.factory']->create(new Form\ProjectLinkType());
  41. $form->bindRequest($app['request']);
  42. if ($form->isValid()) {
  43. $projectLink = $form->getData();
  44. unset($projectLink['id']);
  45. $projectLink['project_id'] = $id;
  46. $app['project_links']->insert($projectLink);
  47. return $app->redirect($app['url_generator']->generate('project_show', array('id' => $id)));
  48. }
  49. $project = $app['projects']->find($id);
  50. $comments = $app['comments']->findByProjectId($id, 0);
  51. $commentForm = $app['form.factory']->create(new Form\CommentType());
  52. $voters = $app['project_votes']->findByProjectId($id);
  53. $links = $app['project_links']->findByProjectId($id);
  54. return $app['twig']->render('Project/show.html.twig', array(
  55. 'link_form' => $form->createView(),
  56. 'comment_form' => $commentForm->createView(),
  57. 'project' => $project,
  58. 'comments' => $comments,
  59. 'skipped_comments' => 0,
  60. 'voters' => $voters,
  61. 'links' => $links,
  62. 'show_link_form' => true,
  63. ));
  64. })->bind('project_link');
  65. /**
  66. * Deletes a project
  67. */
  68. $controllers->post('/{id}/delete', function($id) use ($app) {
  69. $app['projects']->delete(array('id' => $id));
  70. return $app->redirect($app['url_generator']->generate('homepage'));
  71. })->bind('project_delete');
  72. /**
  73. * Shows the edit form for a project
  74. */
  75. $controllers->get('/{id}/edit', function($id) use ($app) {
  76. $project = $app['projects']->find($id);
  77. $form = $app['form.factory']->create(new Form\ProjectType(), $project, array(
  78. 'categories' => $app['project.categories']
  79. ));
  80. return $app['twig']->render('Project/edit.html.twig', array(
  81. 'form' => $form->createView(),
  82. 'project' => $project
  83. ));
  84. })->bind('project_edit');
  85. /**
  86. * Actually updates a project
  87. */
  88. $controllers->post('/{id}', function($id) use ($app) {
  89. $project = $app['projects']->find($id);
  90. $form = $app['form.factory']->create(new Form\ProjectType(), $project, array(
  91. 'categories' => $app['project.categories']
  92. ));
  93. $form->bindRequest($app['request']);
  94. if ($form->isValid()) {
  95. $project = $form->getData();
  96. $project['id'] = $id;
  97. $project['description_html'] = $app['markdown']($project['description']);
  98. $app['projects']->update($project, array('id' => $id));
  99. return $app->redirect($app['url_generator']->generate('project_show', array('id' => $id)));
  100. }
  101. return $app['twig']->render('Project/edit.html.twig', array(
  102. 'form' => $form->createView(),
  103. 'project' => $project,
  104. ));
  105. })->bind('project_update');
  106. /**
  107. * Project creation form
  108. */
  109. $controllers->get('/new', function() use ($app) {
  110. $form = $app['form.factory']->create(new Form\ProjectType(), array(), array(
  111. 'categories' => $app['project.categories']
  112. ));
  113. return $app['twig']->render('Project/new.html.twig', array(
  114. 'form' => $form->createView(),
  115. ));
  116. })->bind('project_new');
  117. /**
  118. * Project show
  119. */
  120. $controllers->get('/{id}/{allComments}', function($id, $allComments = false) use ($app) {
  121. $project = $app['projects']->findWithHasVoted($id, $app['session']->get('username'));
  122. $comments = $app['comments']->findByProjectId($id, $allComments ? 0 : 5);
  123. $nbComments = $app['comments']->countByProjectId($id);
  124. $voters = $app['project_votes']->findByProjectId($id);
  125. $links = $app['project_links']->findByProjectId($id);
  126. $commentForm = $app['form.factory']->create(new Form\CommentType());
  127. $linkForm = $app['form.factory']->create(new Form\ProjectLinkType());
  128. return $app['twig']->render('Project/show.html.twig', array(
  129. 'comment_form' => $commentForm->createView(),
  130. 'link_form' => $linkForm->createView(),
  131. 'project' => $project,
  132. 'comments' => $comments,
  133. 'skipped_comments' => $nbComments - count($comments),
  134. 'voters' => $voters,
  135. 'links' => $links,
  136. ));
  137. })->bind('project_show')->value('allComments', 0)->assert('allComments', '\d+');
  138. /**
  139. * Project creation
  140. */
  141. $controllers->post('', function() use ($app) {
  142. $form = $app['form.factory']->create(new Form\ProjectType(), array(), array(
  143. 'categories' => $app['project.categories']
  144. ));
  145. $form->bindRequest($app['request']);
  146. if ($form->isValid()) {
  147. $project = $form->getData();
  148. unset($project['id']);
  149. $project['username'] = $app['session']->get('username');
  150. $project['description_html'] = $app['markdown']($project['description']);
  151. $app['projects']->insert($project);
  152. return $app->redirect('/');
  153. }
  154. return $app['twig']->render('Project/new.html.twig', array(
  155. 'form' => $form->createView(),
  156. ));
  157. })->bind('project_create');
  158. /**
  159. * Deletes a comment
  160. */
  161. $controllers->post('/comment/{id}/delete', function($id) use ($app) {
  162. $comment = $app['comments']->find($id);
  163. $app['comments']->delete(array('id' => $id));
  164. return $app->redirect($app['url_generator']->generate('project_show', array('id' => $comment['project_id'])));
  165. })->bind('comment_delete');
  166. /**
  167. * Vote for project
  168. */
  169. $controllers->get('/{id}/vote', function($id) use ($app) {
  170. $username = $app['session']->get('username');
  171. if (!$app['project_votes']->existsForProjectAndUser($id, $username)) {
  172. $app['project_votes']->insert(array(
  173. 'username' => $username,
  174. 'project_id' => $id,
  175. ));
  176. }
  177. return $app->redirect(urldecode($app['request']->query->get('return_url', '/')));
  178. })->bind('project_vote');
  179. /**
  180. * Unvote project
  181. */
  182. $controllers->get('/{id}/unvote', function($id) use ($app) {
  183. $app['project_votes']->delete(array(
  184. 'project_id' => $id,
  185. 'username' => $app['session']->get('username'),
  186. ));
  187. return $app->redirect(urldecode($app['request']->query->get('return_url', '/')));
  188. })->bind('project_unvote');
  189. return $controllers;
  190. }
  191. }