setTimezone(new \DateTimeZone(DATETIME_STORAGE_TIMEZONE)); $query = \Drupal::entityQuery('node') ->condition('status', 1) ->condition('type', 'evenement') ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '>=') ->sort('field_date'); $this->future_nids = $query->execute(); $this->future_nodes = entity_load_multiple('node', $this->future_nids); // $this->next_event_node = array_shift($this->future_nodes); $query = \Drupal::entityQuery('node') ->condition('status', 1) ->condition('type', 'evenement') ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '<') ->sort('field_date', 'DESC'); $this->past_nids = $query->execute(); $this->past_nodes = entity_load_multiple('node', $this->past_nids); } private function toRenderable(){ $this->query(); // dpm($this->next_event_node); return array( "#theme"=>'edlp_agenda', // '#next_event_node' => $this->next_event_node, "#coming_events_nodes" => $this->future_nodes, "#past_events_nodes" => $this->past_nodes, ); } /** * Display agenda as a page. * * @return renderable array */ public function agenda() { return $this->toRenderable(); } /** * Get agenda data as json through ajax. * * @return json */ public function agendajson() { $renderable = $this->toRenderable(); // $rendered = render($renderable); // We can't render directly the entity as it throw an exception with cachable data //http://blog.dcycle.com/blog/2018-01-24/caching-drupal-8-rest-resource/#the-dreaded-leaked-metadata-error $rendered = \Drupal::service('renderer')->executeInRenderContext(new RenderContext(), function () use ($renderable) { return render($renderable); }); $data = [ 'rendered'=> $rendered, 'title'=>'Agenda', ]; // translations links // use Drupal\Core\Url; // use Drupal\Core\Language\LanguageInterface; $route_name = 'edlp_agenda.agenda'; $links = \Drupal::languageManager()->getLanguageSwitchLinks(LanguageInterface::TYPE_URL, Url::fromRoute($route_name)); if (isset($links->links)) { $translations_build = [ '#theme' => 'links__language_block', '#links' => $links->links, '#attributes' => ['class' => ["language-switcher-{$links->method_id}",],], '#set_active_class' => TRUE, ]; $translations_rendered = \Drupal::service('renderer')->executeInRenderContext(new RenderContext(), function () use ($translations_build) {return render($translations_build);}); $data['translations_links'] = $translations_rendered; } $data['#cache'] = [ 'max-age' => \Drupal\Core\Cache\Cache::PERMANENT, 'tags' => ['edlp-agenda-cache'], 'contexts' => [ 'languages:language_content' ] ]; // $response = new JsonResponse(); // $response->setData($data); $response = new CacheableJsonResponse($data); $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($data)); $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($renderable)); return $response; } }