diff --git a/app/SculpinKernel.php b/app/SculpinKernel.php
index 250870c..090ba84 100644
--- a/app/SculpinKernel.php
+++ b/app/SculpinKernel.php
@@ -1,5 +1,6 @@
+
+
The Schedule
+
+
+ {% for slot in slots %}
+ {% set session = sessionInSlot(slot.id, sessions) %}
+ -
+
+
+ {{ session.title|default(slot.label)|default('TBA') }}
+ {% if session.speakers %}
+ {{ session.speakers|join(', ') }}
+ {% endif %}
+
+ {{ slot.time }}
+
+
+ {% endfor %}
+
+
+
diff --git a/source/_sessions/doing-good-with-drupal.md b/source/_sessions/doing-good-with-drupal.md
index c7b994e..521c70d 100644
--- a/source/_sessions/doing-good-with-drupal.md
+++ b/source/_sessions/doing-good-with-drupal.md
@@ -1,6 +1,7 @@
---
title: Doing good with Drupal
speakers: [Matt Haworth]
+slot: 15
use: [speakers]
---
More and more charities and campaigners are choosing Drupal to create websites that raise funds, find supporters and deliver content and services to those who need it most.
diff --git a/source/_sessions/real-state-of-drupal.md b/source/_sessions/real-state-of-drupal.md
index de5758e..0213b37 100644
--- a/source/_sessions/real-state-of-drupal.md
+++ b/source/_sessions/real-state-of-drupal.md
@@ -1,5 +1,6 @@
---
title: The Real State of Drupal
+slot: 3
speakers: [Dan McNamara]
use: [speakers]
---
diff --git a/source/index.html.twig b/source/index.html.twig
index 9d63c52..f23d84f 100644
--- a/source/index.html.twig
+++ b/source/index.html.twig
@@ -3,7 +3,7 @@ layout: default
twitter:
url: https://twitter.com/drupalcampbris
update_text: Early bird tickets are now available!
-use: [speakers]
+use: [sessions, speakers]
---
{% block content %}
@@ -43,4 +43,9 @@ use: [speakers]
{% include 'front-speakers' with {
speakers: data.speakers,
} %}
+
+ {% include 'schedule' with {
+ sessions: data.sessions,
+ slots: site.schedule.slots,
+ } %}
{% endblock %}
diff --git a/source/schedule.html.twig b/source/schedule.html.twig
deleted file mode 100644
index 66b419a..0000000
--- a/source/schedule.html.twig
+++ /dev/null
@@ -1,13 +0,0 @@
----
-layout: page
-title: Schedule
-use:
- - sessions
----
-
diff --git a/src/Schedule/services.yml b/src/Schedule/services.yml
new file mode 100644
index 0000000..f7d98d9
--- /dev/null
+++ b/src/Schedule/services.yml
@@ -0,0 +1,4 @@
+services:
+ App\Schedule\TwigExtension\ScheduleExtension:
+ tags:
+ - { name: twig.extension }
diff --git a/src/Schedule/src/DependencyInjection/SculpinScheduleExtension.php b/src/Schedule/src/DependencyInjection/SculpinScheduleExtension.php
new file mode 100644
index 0000000..f456765
--- /dev/null
+++ b/src/Schedule/src/DependencyInjection/SculpinScheduleExtension.php
@@ -0,0 +1,17 @@
+load('services.yml');
+ }
+}
diff --git a/src/Schedule/src/Model/Session.php b/src/Schedule/src/Model/Session.php
new file mode 100644
index 0000000..ecce4d1
--- /dev/null
+++ b/src/Schedule/src/Model/Session.php
@@ -0,0 +1,30 @@
+data = $data;
+ }
+
+ public function getSlot(): int
+ {
+ return (int) $this->data['slot'];
+ }
+
+ public function getTitle(): string
+ {
+ return $this->data['title'];
+ }
+
+ public function getSpeakers(): Collection
+ {
+ return collect($this->data['speakers']);
+ }
+}
diff --git a/src/Schedule/src/SculpinScheduleBundle.php b/src/Schedule/src/SculpinScheduleBundle.php
new file mode 100644
index 0000000..d3c7aae
--- /dev/null
+++ b/src/Schedule/src/SculpinScheduleBundle.php
@@ -0,0 +1,9 @@
+map(function ($session): ?Session {
+ return new Session($session);
+ })->first(function (?Session $session) use ($slotId): bool {
+ return $session->getSlot() == $slotId;
+ });
+ }
+}
diff --git a/src/Schedule/tests/ScheduleTest.php b/src/Schedule/tests/ScheduleTest.php
new file mode 100644
index 0000000..3cda432
--- /dev/null
+++ b/src/Schedule/tests/ScheduleTest.php
@@ -0,0 +1,38 @@
+extension = new ScheduleExtension();
+ }
+
+ /** @test */
+ public function get_a_session_for_a_slot()
+ {
+ $sessions = [
+ ['title' => 'The Real State of Drupal', 'slot' => 4],
+ ['title' => 'Using Ansible for automation', 'slot' => 1],
+ ['title' => 'Introduction to Views', 'slot' => 3],
+ ['title' => 'Doing Good with Drupal', 'slot' => 2],
+ ];
+
+ $session = $this->extension->getSessionInSlot(3, $sessions);
+
+ $this->assertInstanceOf(Session::class, $session);
+ $this->assertSame('Introduction to Views', $session->getTitle());
+ }
+}
\ No newline at end of file
diff --git a/src/Speakers/src/TwigExtension/SpeakersExtension.php b/src/Speakers/src/TwigExtension/SpeakersExtension.php
index 066ae16..b513de5 100644
--- a/src/Speakers/src/TwigExtension/SpeakersExtension.php
+++ b/src/Speakers/src/TwigExtension/SpeakersExtension.php
@@ -28,9 +28,12 @@ class SpeakersExtension extends AbstractExtension
*/
public function getSessionSpeakers($session, array $speakers): array
{
- return collect($speakers)->filter(function ($speaker) use ($session): bool {
- return collect($session['speakers'])->contains($speaker['title']);
- })->values()->toArray();
+ return collect($speakers)
+ ->filter(function ($speaker) use ($session): bool {
+ return collect($session['speakers'])->contains($speaker['title']);
+ })
+ ->values()
+ ->toArray();
}
/**
@@ -43,8 +46,11 @@ class SpeakersExtension extends AbstractExtension
*/
public function getSpeakerSessions($speaker, array $sessions): array
{
- return collect($sessions)->filter(function ($session) use ($speaker): bool {
- return collect($session['speakers'])->contains($speaker['title']);
- })->values()->toArray();
+ return collect($sessions)
+ ->filter(function ($session) use ($speaker): bool {
+ return collect($session['speakers'])->contains($speaker['title']);
+ })
+ ->values()
+ ->toArray();
}
}