feat: integrate with pickups planning api
This commit is contained in:
@@ -71,6 +71,12 @@ class TravelinfoController extends ActionController
|
|||||||
$travelData = [];
|
$travelData = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$pickupsPlanning = $this->apiClient->getPickupsPlanning($travelCode);
|
||||||
|
} catch (ApiException $e) {
|
||||||
|
$pickupsPlanning = [];
|
||||||
|
}
|
||||||
|
|
||||||
// extract courses from additional services
|
// extract courses from additional services
|
||||||
$courses = array_filter($travelData['additionalServices'] ?? [], function ($service) {
|
$courses = array_filter($travelData['additionalServices'] ?? [], function ($service) {
|
||||||
return 'KUR' === $service['subType'];
|
return 'KUR' === $service['subType'];
|
||||||
@@ -91,6 +97,7 @@ class TravelinfoController extends ActionController
|
|||||||
|
|
||||||
$this->view->assign('travelInfo', $travelInfo);
|
$this->view->assign('travelInfo', $travelInfo);
|
||||||
$this->view->assign('travelData', $travelData);
|
$this->view->assign('travelData', $travelData);
|
||||||
|
$this->view->assign('pickupsPlanning', $pickupsPlanning);
|
||||||
$this->view->assign('courses', $courses);
|
$this->view->assign('courses', $courses);
|
||||||
$this->view->assign('board', $board);
|
$this->view->assign('board', $board);
|
||||||
$this->view->assign('departureDayTime', $departureDayTime);
|
$this->view->assign('departureDayTime', $departureDayTime);
|
||||||
|
|||||||
@@ -117,6 +117,30 @@ class ApiClient
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws ApiException
|
||||||
|
*/
|
||||||
|
public function getPickupsPlanning(string $travelCode): array
|
||||||
|
{
|
||||||
|
$httpClient = $this->getHttpClient();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$response = $httpClient->request('GET', 'pickups-planning/' . $travelCode);
|
||||||
|
} catch (TransportExceptionInterface $e) {
|
||||||
|
throw new ApiException($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (200 !== $response->getStatusCode()) {
|
||||||
|
throw new ApiException($response->getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response->toArray(false);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
throw new ApiException($e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private function getHttpClient(): HttpClientInterface
|
private function getHttpClient(): HttpClientInterface
|
||||||
{
|
{
|
||||||
$config = GeneralUtility::makeInstance(ExtensionConfiguration::class)
|
$config = GeneralUtility::makeInstance(ExtensionConfiguration::class)
|
||||||
|
|||||||
@@ -77,27 +77,53 @@
|
|||||||
</p>
|
</p>
|
||||||
</f:else>
|
</f:else>
|
||||||
</f:if>
|
</f:if>
|
||||||
<f:if condition="{travelData.pickupsTo -> f:count()} > 0">
|
<f:if condition="{pickupsPlanning -> f:count()} > 0">
|
||||||
<f:if condition="{travelData.pickupsTo -> f:count()} <= 3">
|
<f:then>
|
||||||
<f:then>
|
<f:if condition="{pickupsPlanning -> f:count()} <= 3">
|
||||||
<f:render section="Pickups" arguments="{_all}"/>
|
<f:then>
|
||||||
</f:then>
|
<f:render section="PickupsPlanning" arguments="{_all}"/>
|
||||||
<f:else>
|
</f:then>
|
||||||
<div data-controller="autocollapse" data-autocollapse-height-value="400" data-autocollapse-offset-value="64" class="pb-4">
|
<f:else>
|
||||||
<div class="relative pb-12" data-autocollapse-target="container">
|
<div data-controller="autocollapse" data-autocollapse-height-value="400" data-autocollapse-offset-value="64" class="pb-4">
|
||||||
<f:render section="Pickups" arguments="{_all}"/>
|
<div class="relative pb-12" data-autocollapse-target="container">
|
||||||
<div class="absolute left-0 bottom-0 w-full h-12 bg-white flex items-center">
|
<f:render section="PickupsPlanning" arguments="{_all}"/>
|
||||||
<button type="button"
|
<div class="absolute left-0 bottom-0 w-full h-12 bg-white flex items-center">
|
||||||
data-autocollapse-target="button"
|
<button type="button"
|
||||||
data-action="autocollapse#toggle"
|
data-autocollapse-target="button"
|
||||||
class="hidden text-ep-primary w-10 h-10 ml-2 group toggle-more">
|
data-action="autocollapse#toggle"
|
||||||
<f:render section="Icon" arguments="{icon: 'toggle'}" />
|
class="hidden text-ep-primary w-10 h-10 ml-2 group toggle-more">
|
||||||
</button>
|
<f:render section="Icon" arguments="{icon: 'toggle'}" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</f:else>
|
||||||
</f:else>
|
</f:if>
|
||||||
</f:if>
|
</f:then>
|
||||||
|
<f:else>
|
||||||
|
<f:if condition="{travelData.pickupsTo -> f:count()} > 0">
|
||||||
|
<f:if condition="{travelData.pickupsTo -> f:count()} <= 3">
|
||||||
|
<f:then>
|
||||||
|
<f:render section="Pickups" arguments="{_all}"/>
|
||||||
|
</f:then>
|
||||||
|
<f:else>
|
||||||
|
<div data-controller="autocollapse" data-autocollapse-height-value="400" data-autocollapse-offset-value="64" class="pb-4">
|
||||||
|
<div class="relative pb-12" data-autocollapse-target="container">
|
||||||
|
<f:render section="Pickups" arguments="{_all}"/>
|
||||||
|
<div class="absolute left-0 bottom-0 w-full h-12 bg-white flex items-center">
|
||||||
|
<button type="button"
|
||||||
|
data-autocollapse-target="button"
|
||||||
|
data-action="autocollapse#toggle"
|
||||||
|
class="hidden text-ep-primary w-10 h-10 ml-2 group toggle-more">
|
||||||
|
<f:render section="Icon" arguments="{icon: 'toggle'}" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</f:else>
|
||||||
|
</f:if>
|
||||||
|
</f:if>
|
||||||
|
</f:else>
|
||||||
</f:if>
|
</f:if>
|
||||||
</f:if>
|
</f:if>
|
||||||
<f:if condition="{travelInfo.selfArrangedText}">
|
<f:if condition="{travelInfo.selfArrangedText}">
|
||||||
@@ -260,6 +286,42 @@
|
|||||||
</f:link.typolink>
|
</f:link.typolink>
|
||||||
</f:section>
|
</f:section>
|
||||||
|
|
||||||
|
<f:section name="PickupsPlanning">
|
||||||
|
<h3 class="text-white">
|
||||||
|
Bus-Zustiege
|
||||||
|
</h3>
|
||||||
|
<p>
|
||||||
|
Bitte findet euch mindestens <strong>20 Minuten vor Abfahrt</strong> an der gebuchten Haltestelle ein.
|
||||||
|
</p>
|
||||||
|
{travelInfo.busInfoText -> f:format.html()}
|
||||||
|
<table class="w-full bg-zinc-200 text-zinc-800 text-xs md:text-base mb-4">
|
||||||
|
<tr>
|
||||||
|
<th class="border-r border-white/50 px-2 py-1 md:p-2 text-left text-sm md:text-base">
|
||||||
|
Zustieg
|
||||||
|
</th>
|
||||||
|
<th class="border-r border-white/50 px-2 py-1 md:p-2 text-sm md:text-base">
|
||||||
|
Datum/Uhrzeit
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
<f:for each="{pickupsPlanning}" as="pickup">
|
||||||
|
<tr class="odd:bg-zinc-50 align-top">
|
||||||
|
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
|
||||||
|
{pickup.city}<br><span class="text-xs">{pickup.street}</span>
|
||||||
|
</td>
|
||||||
|
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
|
||||||
|
{pickup.datetime -> f:format.date(format: 'd.m.Y')}<br>{pickup.datetime -> f:format.date(format: 'H:i')} Uhr
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</f:for>
|
||||||
|
</table>
|
||||||
|
<f:if condition="{departureDayTime}">
|
||||||
|
<p>
|
||||||
|
Die Rückreise mit dem Bus startet <strong>{departureDayTime}</strong>.
|
||||||
|
</p>
|
||||||
|
</f:if>
|
||||||
|
{travelInfo.departureText -> f:format.html()}
|
||||||
|
</f:section>
|
||||||
|
|
||||||
<f:section name="Pickups">
|
<f:section name="Pickups">
|
||||||
<h3 class="text-white">
|
<h3 class="text-white">
|
||||||
Bus-Zustiege
|
Bus-Zustiege
|
||||||
|
|||||||
Reference in New Issue
Block a user