AgendaController.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace Drupal\edlp_agenda\Controller;
  3. use Drupal\Core\Controller\ControllerBase;
  4. use Drupal\Core\Datetime\DrupalDateTime;
  5. use Drupal\Core\Url;
  6. use Drupal\Core\Language\LanguageInterface;
  7. // use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Drupal\Core\Cache\CacheableJsonResponse;
  9. use Drupal\Core\Cache\CacheableMetadata;
  10. use Drupal\core\render\RenderContext;
  11. class AgendaController extends ControllerBase {
  12. private function query() {
  13. // @see https://www.webomelette.com/query-entities-using-dates-drupal-8
  14. $now = new DrupalDateTime('now');
  15. $now->setTimezone(new \DateTimeZone(DATETIME_STORAGE_TIMEZONE));
  16. $query = \Drupal::entityQuery('node')
  17. ->condition('status', 1)
  18. ->condition('type', 'evenement')
  19. ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '>=')
  20. ->sort('field_date');
  21. $this->future_nids = $query->execute();
  22. $this->future_nodes = entity_load_multiple('node', $this->future_nids);
  23. // $this->next_event_node = array_shift($this->future_nodes);
  24. $query = \Drupal::entityQuery('node')
  25. ->condition('status', 1)
  26. ->condition('type', 'evenement')
  27. ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '<')
  28. ->sort('field_date', 'DESC');
  29. $this->past_nids = $query->execute();
  30. $this->past_nodes = entity_load_multiple('node', $this->past_nids);
  31. }
  32. private function toRenderable(){
  33. $this->query();
  34. // dpm($this->next_event_node);
  35. return array(
  36. "#theme"=>'edlp_agenda',
  37. // '#next_event_node' => $this->next_event_node,
  38. "#coming_events_nodes" => $this->future_nodes,
  39. "#past_events_nodes" => $this->past_nodes,
  40. );
  41. }
  42. /**
  43. * Display agenda as a page.
  44. *
  45. * @return renderable array
  46. */
  47. public function agenda() {
  48. return $this->toRenderable();
  49. }
  50. /**
  51. * Get agenda data as json through ajax.
  52. *
  53. * @return json
  54. */
  55. public function agendajson() {
  56. $renderable = $this->toRenderable();
  57. // $rendered = render($renderable);
  58. // We can't render directly the entity as it throw an exception with cachable data
  59. //http://blog.dcycle.com/blog/2018-01-24/caching-drupal-8-rest-resource/#the-dreaded-leaked-metadata-error
  60. $rendered = \Drupal::service('renderer')->executeInRenderContext(new RenderContext(), function () use ($renderable) {
  61. return render($renderable);
  62. });
  63. $data = [
  64. 'rendered'=> $rendered,
  65. 'title'=>'Agenda',
  66. ];
  67. // translations links
  68. // use Drupal\Core\Url;
  69. // use Drupal\Core\Language\LanguageInterface;
  70. $route_name = 'edlp_agenda.agenda';
  71. $links = \Drupal::languageManager()->getLanguageSwitchLinks(LanguageInterface::TYPE_URL, Url::fromRoute($route_name));
  72. if (isset($links->links)) {
  73. $translations_build = [
  74. '#theme' => 'links__language_block',
  75. '#links' => $links->links,
  76. '#attributes' => ['class' => ["language-switcher-{$links->method_id}",],],
  77. '#set_active_class' => TRUE,
  78. ];
  79. $translations_rendered = \Drupal::service('renderer')->executeInRenderContext(new RenderContext(), function () use ($translations_build) {return render($translations_build);});
  80. $data['translations_links'] = $translations_rendered;
  81. }
  82. $data['#cache'] = [
  83. 'max-age' => \Drupal\Core\Cache\Cache::PERMANENT,
  84. 'tags' => ['edlp-agenda-cache'],
  85. 'contexts' => [
  86. 'languages:language_content'
  87. ]
  88. ];
  89. // $response = new JsonResponse();
  90. // $response->setData($data);
  91. $response = new CacheableJsonResponse($data);
  92. $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($data));
  93. $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($renderable));
  94. return $response;
  95. }
  96. }