123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?php
- namespace Drupal\edlp_agenda\Controller;
- use Drupal\Core\Controller\ControllerBase;
- use Drupal\Core\Datetime\DrupalDateTime;
- use Drupal\Core\Url;
- use Drupal\Core\Language\LanguageInterface;
- // use Symfony\Component\HttpFoundation\JsonResponse;
- use Drupal\Core\Cache\CacheableJsonResponse;
- use Drupal\Core\Cache\CacheableMetadata;
- use Drupal\core\render\RenderContext;
- class AgendaController extends ControllerBase {
- private function query() {
- // @see https://www.webomelette.com/query-entities-using-dates-drupal-8
- $now = new DrupalDateTime('now');
- $now->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;
- }
- }
|