HomeController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace Drupal\edlp_home\Controller;
  3. use Drupal\Core\Controller\ControllerBase;
  4. use Drupal\Core\Datetime\DrupalDateTime;
  5. use Drupal\taxonomy\Entity\Term;
  6. use Drupal\workflow\Entity\WorkflowManager;
  7. use Drupal\Core\Url;
  8. use Drupal\Core\Language\LanguageInterface;
  9. // use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Drupal\Core\Cache\CacheableJsonResponse;
  11. use Drupal\Core\Cache\CacheableMetadata;
  12. use Drupal\core\render\RenderContext;
  13. class HomeController extends ControllerBase {
  14. /**
  15. * Display home as a page.
  16. *
  17. * @return renderable array
  18. */
  19. public function home() {
  20. // $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
  21. $contents = array("#theme"=>'edlp_home');
  22. // first get static pages
  23. $query = \Drupal::entityQuery('node')
  24. ->condition('status', 1)
  25. ->condition('field_afficher_en_page_d_acceuil', 1)
  26. ->condition('type', 'static');
  27. $promoted_nids = $query->execute();
  28. $contents["#promoted_nodes"] = entity_load_multiple('node', $promoted_nids);
  29. // then get production pages
  30. $query = \Drupal::entityQuery('node')
  31. ->condition('status', 1)
  32. ->condition('field_afficher_en_page_d_acceuil', 1)
  33. ->condition('type', 'page');
  34. $promoted_nids = $query->execute();
  35. $contents["#promoted_nodes"] += entity_load_multiple('node', $promoted_nids);
  36. // presentation
  37. // $query = \Drupal::entityQuery('node')
  38. // ->condition('status', 1)
  39. // ->condition('nid', 12242);
  40. // // TODO: présentation nid should be a setting
  41. //
  42. // $pres_nid = $query->execute();
  43. // $contents["#presentation_node"] = entity_load('node', array_pop($pres_nid));
  44. // last fil
  45. // $query = \Drupal::entityQuery('node')
  46. // ->condition('status', 1)
  47. // ->condition('type', 'fil')
  48. // ->sort('created', 'DESC')
  49. // ->range(0,1);
  50. //
  51. // $fil = $query->execute();
  52. // $contents["#last_fil_node"] = entity_load('node', array_pop($fil));
  53. // $contents["#last_fil_node"] = array('#markup'=>'En développement.');
  54. // last production
  55. // $query = \Drupal::entityQuery('node')
  56. // ->condition('status', 1)
  57. // ->condition('type', 'page')
  58. // ->condition('field_page_type', array('1168'), 'NOT IN')
  59. // ->sort('created', 'DESC')
  60. // ->range(0,1);
  61. //
  62. // $prod = $query->execute();
  63. // $contents["#last_production_node"] = entity_load('node', array_pop($prod));
  64. // last documents
  65. $query = \Drupal::entityQuery('node')
  66. ->condition('status', 1)
  67. ->condition('type', 'enregistrement')
  68. ->sort('created', 'DESC')
  69. ->range(0,50);
  70. $nodes = $query->execute();
  71. $lastdocs = [];
  72. $i = 0;
  73. foreach ($nodes as $node) {
  74. // remove masqué
  75. $sid = WorkflowManager::getCurrentStateId($node, 'field_workflow');
  76. if($sid != 'corpus_documents_publie') continue;
  77. $lastdocs[] = $node;
  78. $i++;
  79. if($i>9) break;
  80. }
  81. $contents["#lastdocs_items"] = entity_load_multiple('node', $lastdocs);
  82. // dsm($contents["#lastdocs_items"], "#lastdocs_items");
  83. // agenda
  84. $now = new DrupalDateTime('now');
  85. $now->setTimezone(new \DateTimeZone(DATETIME_STORAGE_TIMEZONE));
  86. $query = \Drupal::entityQuery('node')
  87. ->condition('status', 1)
  88. ->condition('type', 'evenement')
  89. ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '>=')
  90. ->range(0,5)
  91. ->sort('field_date');
  92. $events = $query->execute();
  93. $contents['#agenda_items'] = entity_load_multiple('node', $events);
  94. return $contents;
  95. }
  96. /**
  97. * Display home mobile as a page.
  98. *
  99. * @return renderable array
  100. */
  101. public function toMobileHomeRenderable() {
  102. // $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
  103. $renderable = array("#theme"=>'edlp_home');
  104. // first get static pages
  105. $query = \Drupal::entityQuery('node')
  106. ->condition('status', 1)
  107. ->condition('field_afficher_en_page_d_acceuil', 1)
  108. ->condition('type', 'static');
  109. $promoted_nids = $query->execute();
  110. $renderable["#promoted_nodes"] = entity_load_multiple('node', $promoted_nids);
  111. // then get production pages
  112. $query = \Drupal::entityQuery('node')
  113. ->condition('status', 1)
  114. ->condition('field_afficher_en_page_d_acceuil', 1)
  115. ->condition('type', 'page');
  116. $promoted_nids = $query->execute();
  117. $renderable["#promoted_nodes"] += entity_load_multiple('node', $promoted_nids);
  118. // last fil
  119. // $query = \Drupal::entityQuery('node')
  120. // ->condition('status', 1)
  121. // ->condition('type', 'fil')
  122. // ->sort('created', 'DESC')
  123. // ->range(0,1);
  124. //
  125. // $fil = $query->execute();
  126. // $renderable["#last_fil_node"] = entity_load('node', array_pop($fil));
  127. // $renderable["#last_fil_node"] = array('#markup'=>'En développement.');
  128. // agenda
  129. $now = new DrupalDateTime('now');
  130. $now->setTimezone(new \DateTimeZone(DATETIME_STORAGE_TIMEZONE));
  131. $query = \Drupal::entityQuery('node')
  132. ->condition('status', 1)
  133. ->condition('type', 'evenement')
  134. ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '>=')
  135. ->range(0,5)
  136. ->sort('field_date');
  137. $events = $query->execute();
  138. $renderable['#agenda_items'] = entity_load_multiple('node', $events);
  139. // Collection
  140. // TODO: get the link to mobile collection page
  141. $collection_url = Url::fromRoute('edlp_corpus.collection');
  142. $renderable['#collection_link'] = array(
  143. 'url' => $collection_url,
  144. 'internal_path' => $collection_url->getInternalPath(),
  145. );
  146. return $renderable;
  147. }
  148. public function home_mobile() {
  149. return $this->toMobileHomeRenderable();
  150. }
  151. /**
  152. * Get home mobile data as json through ajax.
  153. *
  154. * @return json
  155. */
  156. // NOT NEEDED ANY MORE
  157. public function home_mobilejson() {
  158. $renderable = $this->toMobileHomeRenderable();
  159. // $rendered = render($renderable);
  160. // We can't render directly the entity as it throw an exception with cachable data
  161. //http://blog.dcycle.com/blog/2018-01-24/caching-drupal-8-rest-resource/#the-dreaded-leaked-metadata-error
  162. $rendered = \Drupal::service('renderer')->executeInRenderContext(new RenderContext(), function () use ($renderable) {
  163. return render($renderable);
  164. });
  165. $data = [
  166. 'rendered'=> $rendered,
  167. 'title'=>'Home Mobile',
  168. ];
  169. // translations links
  170. // use Drupal\Core\Url;
  171. // use Drupal\Core\Language\LanguageInterface;
  172. $route_name = 'edlp_home.home_mobile';
  173. $links = \Drupal::languageManager()->getLanguageSwitchLinks(LanguageInterface::TYPE_URL, Url::fromRoute($route_name));
  174. if (isset($links->links)) {
  175. $translations_build = [
  176. '#theme' => 'links__language_block',
  177. '#links' => $links->links,
  178. '#attributes' => ['class' => ["language-switcher-{$links->method_id}",],],
  179. '#set_active_class' => TRUE,
  180. ];
  181. $translations_rendered = \Drupal::service('renderer')->executeInRenderContext(new RenderContext(), function () use ($translations_build) {return render($translations_build);});
  182. $data['translations_links'] = $translations_rendered;
  183. }
  184. $data['#cache'] = [
  185. 'max-age' => \Drupal\Core\Cache\Cache::PERMANENT,
  186. 'tags' => ['edlp-home-cache'],
  187. 'contexts' => [
  188. 'languages:language_content'
  189. ]
  190. ];
  191. // $response = new JsonResponse();
  192. // $response->setData($data);
  193. $response = new CacheableJsonResponse($data);
  194. $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($data));
  195. $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($renderable));
  196. return $response;
  197. }
  198. }