Skip to content

Commit d0ed471

Browse files
committed
Use an object for discontinued training data, instead of an array
More precise types.
1 parent d324dd8 commit d0ed471

File tree

12 files changed

+226
-81
lines changed

12 files changed

+226
-81
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
declare(strict_types = 1);
3+
4+
namespace MichalSpacekCz\Training\Discontinued;
5+
6+
class DiscontinuedTraining
7+
{
8+
9+
/**
10+
* @param list<string> $trainings
11+
*/
12+
public function __construct(
13+
private readonly string $description,
14+
private readonly array $trainings,
15+
private readonly string $newHref,
16+
) {
17+
}
18+
19+
20+
public function getDescription(): string
21+
{
22+
return $this->description;
23+
}
24+
25+
26+
/**
27+
* @return list<string>
28+
*/
29+
public function getTrainings(): array
30+
{
31+
return $this->trainings;
32+
}
33+
34+
35+
public function getNewHref(): string
36+
{
37+
return $this->newHref;
38+
}
39+
40+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
declare(strict_types = 1);
3+
4+
namespace MichalSpacekCz\Training\Discontinued;
5+
6+
use MichalSpacekCz\ShouldNotHappenException;
7+
use Nette\Database\Explorer;
8+
9+
class DiscontinuedTrainings
10+
{
11+
12+
public function __construct(
13+
private readonly Explorer $database,
14+
) {
15+
}
16+
17+
18+
/**
19+
* Get all discontinued trainings with description.
20+
*
21+
* @return list<DiscontinuedTraining>
22+
*/
23+
public function getAllDiscontinued(): array
24+
{
25+
$query = $this->database->fetchAll(
26+
'SELECT
27+
td.id_trainings_discontinued AS id,
28+
td.description,
29+
t.name AS training,
30+
td.href
31+
FROM trainings_discontinued td
32+
JOIN trainings t ON t.key_discontinued = td.id_trainings_discontinued
33+
ORDER BY
34+
td.id_trainings_discontinued,
35+
t.id_training',
36+
);
37+
$trainings = [];
38+
foreach ($query as $row) {
39+
$id = $row->id;
40+
if (!is_int($id)) {
41+
throw new ShouldNotHappenException(sprintf("Discontinued training id is a %s not an integer", get_debug_type($id)));
42+
}
43+
$trainings[$id]['description'] = (string)$row->description;
44+
$trainings[$id]['href'] = (string)$row->href;
45+
if (!isset($trainings[$id]['trainings'])) {
46+
$trainings[$id]['trainings'] = [];
47+
}
48+
$trainings[$id]['trainings'][] = (string)$row->training;
49+
}
50+
$result = [];
51+
foreach ($trainings as $training) {
52+
$result[] = new DiscontinuedTraining($training['description'], $training['trainings'], $training['href']);
53+
}
54+
return $result;
55+
}
56+
57+
58+
/**
59+
* Get discontinued trainings with description.
60+
*
61+
* @param int $id
62+
* @return DiscontinuedTraining|null
63+
*/
64+
public function getDiscontinued(int $id): ?DiscontinuedTraining
65+
{
66+
$query = $this->database->fetchAll(
67+
'SELECT
68+
td.description,
69+
t.name AS training,
70+
td.href
71+
FROM trainings_discontinued td
72+
JOIN trainings t ON t.key_discontinued = td.id_trainings_discontinued
73+
WHERE
74+
td.id_trainings_discontinued = ?
75+
ORDER BY
76+
t.id_training',
77+
$id,
78+
);
79+
$trainings = [];
80+
foreach ($query as $row) {
81+
$trainings[] = $row->training;
82+
}
83+
return empty($row) ? null : new DiscontinuedTraining($row->description, $trainings, $row->href);
84+
}
85+
86+
}

site/app/Training/Trainings.php

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -245,72 +245,6 @@ public function getActionById(int $id): string
245245
}
246246

247247

248-
/**
249-
* Get all discontinued trainings with description.
250-
*
251-
* @return array<int, array<string, string|string[]>>
252-
*/
253-
public function getAllDiscontinued(): array
254-
{
255-
$result = $this->database->fetchAll(
256-
'SELECT
257-
td.id_trainings_discontinued AS id,
258-
td.description,
259-
t.name AS training,
260-
td.href
261-
FROM trainings_discontinued td
262-
JOIN trainings t ON t.key_discontinued = td.id_trainings_discontinued
263-
ORDER BY
264-
td.id_trainings_discontinued,
265-
t.id_training',
266-
);
267-
$trainings = [];
268-
foreach ($result as $row) {
269-
$id = $row->id;
270-
if (!is_int($id)) {
271-
throw new ShouldNotHappenException(sprintf("Discontinued training id is a %s not an integer", get_debug_type($id)));
272-
}
273-
$trainings[$id]['description'] = (string)$row->description;
274-
$trainings[$id]['href'] = (string)$row->href;
275-
if (!isset($trainings[$id]['trainings'])) {
276-
$trainings[$id]['trainings'] = [];
277-
}
278-
$trainings[$id]['trainings'][] = (string)$row->training;
279-
}
280-
return $trainings;
281-
}
282-
283-
284-
/**
285-
* Get discontinued trainings with description.
286-
*
287-
* @param int $id
288-
* @return array<string, string|string[]>|null
289-
*/
290-
public function getDiscontinued(int $id): ?array
291-
{
292-
$sql = 'SELECT
293-
td.description,
294-
t.name AS training,
295-
td.href
296-
FROM trainings_discontinued td
297-
JOIN trainings t ON t.key_discontinued = td.id_trainings_discontinued
298-
WHERE
299-
td.id_trainings_discontinued = ?
300-
ORDER BY
301-
t.id_training';
302-
$trainings = [];
303-
foreach ($this->database->fetchAll($sql, $id) as $row) {
304-
$trainings[] = $row->training;
305-
}
306-
return (empty($row) ? null : [
307-
'description' => $row->description,
308-
'href' => $row->href,
309-
'trainings' => $trainings,
310-
]);
311-
}
312-
313-
314248
/**
315249
* @param array<int, int> $dateIds
316250
*/

site/app/Www/Presenters/CompanyTrainingsPresenter.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
use MichalSpacekCz\Formatter\TexyFormatter;
77
use MichalSpacekCz\Training\CompanyTrainings;
8+
use MichalSpacekCz\Training\Discontinued\DiscontinuedTrainings;
89
use MichalSpacekCz\Training\Prices;
910
use MichalSpacekCz\Training\Reviews\TrainingReviews;
1011
use MichalSpacekCz\Training\TrainingLocales;
@@ -22,6 +23,7 @@ public function __construct(
2223
private readonly TexyFormatter $texyFormatter,
2324
private readonly Trainings $trainings,
2425
private readonly CompanyTrainings $companyTrainings,
26+
private readonly DiscontinuedTrainings $discontinuedTrainings,
2527
private readonly TrainingLocales $trainingLocales,
2628
private readonly TrainingReviews $trainingReviews,
2729
private readonly Prices $prices,
@@ -35,7 +37,7 @@ public function renderDefault(): void
3537
{
3638
$this->template->pageTitle = $this->translator->translate('messages.title.companytrainings');
3739
$this->template->trainings = $this->trainings->getNames();
38-
$this->template->discontinued = $this->trainings->getAllDiscontinued();
40+
$this->template->discontinued = $this->discontinuedTrainings->getAllDiscontinued();
3941
}
4042

4143

@@ -69,7 +71,7 @@ public function actionTraining(string $name): void
6971
$this->template->materials = $training->materials;
7072
$this->template->reviews = $this->trainingReviews->getVisibleReviews($training->trainingId, 3);
7173
if ($training->discontinuedId !== null) {
72-
$this->template->discontinued = [$this->trainings->getDiscontinued($training->discontinuedId)];
74+
$this->template->discontinued = [$this->discontinuedTrainings->getDiscontinued($training->discontinuedId)];
7375
$this->httpResponse->setCode(IResponse::S410_Gone);
7476
} else {
7577
$this->template->discontinued = null;

site/app/Www/Presenters/HomepagePresenter.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use MichalSpacekCz\Training\CompanyTrainings;
1212
use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesList;
1313
use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesListFactory;
14-
use MichalSpacekCz\Training\Trainings;
14+
use MichalSpacekCz\Training\Discontinued\DiscontinuedTrainings;
1515

1616
class HomepagePresenter extends BasePresenter
1717
{
@@ -20,8 +20,8 @@ public function __construct(
2020
private readonly Articles $articles,
2121
private readonly Interviews $interviews,
2222
private readonly Talks $talks,
23-
private readonly Trainings $trainings,
2423
private readonly CompanyTrainings $companyTrainings,
24+
private readonly DiscontinuedTrainings $discontinuedTrainings,
2525
private readonly UpcomingTrainingDatesListFactory $upcomingTrainingDatesListFactory,
2626
private readonly ArticleSummaryFactory $articleSummaryFactory,
2727
) {
@@ -38,7 +38,7 @@ public function renderDefault(): void
3838
$this->template->upcomingTalks = $this->talks->getUpcoming();
3939
$this->template->companyTrainings = $this->companyTrainings->getWithoutPublicUpcoming();
4040
$this->template->interviews = $this->interviews->getAll(5);
41-
$this->template->discontinued = $this->trainings->getAllDiscontinued();
41+
$this->template->discontinued = $this->discontinuedTrainings->getAllDiscontinued();
4242
}
4343

4444

site/app/Www/Presenters/TrainingsPresenter.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesListFactory;
1414
use MichalSpacekCz\Training\Dates\TrainingDate;
1515
use MichalSpacekCz\Training\Dates\TrainingDates;
16+
use MichalSpacekCz\Training\Discontinued\DiscontinuedTrainings;
1617
use MichalSpacekCz\Training\Exceptions\TrainingApplicationDoesNotExistException;
1718
use MichalSpacekCz\Training\Exceptions\TrainingDoesNotExistException;
1819
use MichalSpacekCz\Training\Files\TrainingFiles;
@@ -45,6 +46,7 @@ public function __construct(
4546
private readonly Trainings $trainings,
4647
private readonly FreeSeats $freeSeats,
4748
private readonly CompanyTrainings $companyTrainings,
49+
private readonly DiscontinuedTrainings $discontinuedTrainings,
4850
private readonly TrainingLocales $trainingLocales,
4951
private readonly TrainingReviews $trainingReviews,
5052
private readonly TrainingApplicationFormFactory $trainingApplicationFactory,
@@ -61,7 +63,7 @@ public function renderDefault(): void
6163
{
6264
$this->template->pageTitle = $this->translator->translate('messages.title.trainings');
6365
$this->template->companyTrainings = $this->companyTrainings->getWithoutPublicUpcoming();
64-
$this->template->discontinued = $this->trainings->getAllDiscontinued();
66+
$this->template->discontinued = $this->discontinuedTrainings->getAllDiscontinued();
6567
}
6668

6769

@@ -108,7 +110,7 @@ public function actionTraining(string $name): void
108110
$this->template->loadCompanyDataVisible = $this->companyInfo->isLoadCompanyDataVisible();
109111

110112
if ($this->training->discontinuedId !== null) {
111-
$this->template->discontinued = [$this->trainings->getDiscontinued($this->training->discontinuedId)];
113+
$this->template->discontinued = [$this->discontinuedTrainings->getDiscontinued($this->training->discontinuedId)];
112114
$this->httpResponse->setCode(IResponse::S410_Gone);
113115
} else {
114116
$this->template->discontinued = null;
@@ -221,7 +223,7 @@ public function actionReviews(string $name): void
221223
$this->template->reviews = $this->trainingReviews->getVisibleReviews($training->trainingId);
222224

223225
if ($training->discontinuedId !== null) {
224-
$this->template->discontinued = [$this->trainings->getDiscontinued($training->discontinuedId)];
226+
$this->template->discontinued = [$this->discontinuedTrainings->getDiscontinued($training->discontinuedId)];
225227
$this->httpResponse->setCode(IResponse::S410_Gone);
226228
} else {
227229
$this->template->discontinued = null;

site/app/Www/Presenters/templates/CompanyTrainings/training.latte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{define #content}
22

33
<p>{$description}</p>
4-
<div n:ifset="$discontinued" class="flash notice">{include "../Trainings/common/discontinued.latte"}</div>
4+
<div n:if="$discontinued" class="flash notice">{include "../Trainings/common/discontinued.latte"}</div>
55
<p>{icon bulb} <small>{$upsell}</small></p>
66

77
<h2 id="{_html.id.title}">{_messages.label.trainingname}</h2>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{foreach $discontinued as $training}
2-
{capture $names}{foreach $training[trainings] as $trainingName}**{$trainingName|translate}**{sep}, {/sep}{/foreach}{/capture}
3-
{_$training[description]|format:$names, $training[href]}
2+
{capture $names}{foreach $training->getTrainings() as $trainingName}**{$trainingName|translate}**{sep}, {/sep}{/foreach}{/capture}
3+
{_$training->getDescription()|format:$names, $training->getNewHref()}
44
{/foreach}

site/app/Www/Presenters/templates/Trainings/reviews.latte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
{define #content}
88
<p>
99
{$description}
10-
{if !isset($discontinued)}
10+
{if !$discontinued}
1111
<small>(<a href="{link Trainings:training $name}#{_html.id.application}">{_messages.label.lowercaseapplication}</a>, <a n:href="CompanyTrainings:training $name">{_messages.label.lowercasecompanytraining}</a>)</small>
1212
{/if}
1313
</p>
14-
<div n:ifset="$discontinued" class="flash notice">{include "common/discontinued.latte"}</div>
14+
<div n:if="$discontinued" class="flash notice">{include "common/discontinued.latte"}</div>
1515
{if $reviews}
1616
<div id="{_html.id.reviews}">
1717
<h2>{_messages.label.trainingreviews}</h2>

site/app/Www/Presenters/templates/Trainings/training.latte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
<p>{$description}</p>
9393

9494
<div n:if="$lastFreeSeats" class="flash notice"><strong>{_messages.trainings.fewseatsleft}</strong></div>
95-
<div n:ifset="$discontinued" class="flash notice">{include "common/discontinued.latte"}</div>
95+
<div n:if="$discontinued" class="flash notice">{include "common/discontinued.latte"}</div>
9696

9797
<div class="vcalendar">
9898
<h2 id="{_html.id.title}">{_messages.label.trainingname}</h2>
@@ -179,7 +179,7 @@
179179
<p><a n:href="Trainings:reviews $name">{_messages.trainings.allreviews}</a></p>
180180
{/if}
181181

182-
{if empty($discontinued)}
182+
{if !$discontinued}
183183
<hr>
184184
{if count($dates)}
185185
<h2 id="{_html.id.application}">{_messages.label.application}</h2>

0 commit comments

Comments
 (0)