Skip to content

Commit b85ad94

Browse files
authored
Progress to PHPStan Latte level 7 (#175)
[9 errors remaining](https://github.com/spaze/michalspacek.cz/actions/runs/5562124085/jobs/10160242058) and they all seem to be related one way or another to form containers, so maybe the following will help? - efabrica-team/phpstan-latte#380 Ref #141
2 parents a9d4d8a + a4ac739 commit b85ad94

File tree

21 files changed

+312
-119
lines changed

21 files changed

+312
-119
lines changed

site/app/Admin/Presenters/templates/Blog/edit.latte

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
<tbody><tr><th>{label allowedTags /}</th><td>{input allowedTags}</td></tr></tbody>
2626
<tbody><tr><th>{label omitExports: /}</th><td>{input omitExports:}</td></tr></tbody>
2727
<tbody><tr><th>{label editSummary /}</th><td>{input editSummary}<br><small>Shrnutí editace bude u článku zobrazeno jako aktualizace, ponechte prázdné pro malé editace</small></td></tr></tbody>
28-
{capture $link}{link preview}{/capture}
2928
<tr><td></td><td class="short"><p>{input submit} {input preview id => preview-button, class => lighter, formtarget => preview}</p></td></tr>
3029
</table>
3130
{/form}

site/app/Admin/Presenters/templates/Trainings/date.latte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
{/ifset}
5151
{else}{/ifset}
5252
{/capture}
53-
<small title="{$title|strip}">
53+
<small title="{(string)$title|strip}">
5454
{ifset $application->priceWithCurrency}{$application->priceWithCurrency}{if $application->price > 0 && !isset($application->paid)} <strong>!</strong>{/if}{else}{/ifset}
5555
</small>
5656
</td>

site/app/Media/Photo.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
declare(strict_types = 1);
3+
4+
namespace MichalSpacekCz\Media;
5+
6+
use Nette\Utils\Html;
7+
8+
class Photo
9+
{
10+
11+
/**
12+
* @param array<string, string> $sizes
13+
*/
14+
public function __construct(
15+
private readonly string $title,
16+
private readonly string $file,
17+
private readonly string|Html $description,
18+
private readonly array $sizes,
19+
) {
20+
}
21+
22+
23+
public function getTitle(): string
24+
{
25+
return $this->title;
26+
}
27+
28+
29+
public function getFile(): string
30+
{
31+
return $this->file;
32+
}
33+
34+
35+
public function getDescription(): string|Html
36+
{
37+
return $this->description;
38+
}
39+
40+
41+
/**
42+
* @return array<string, string>
43+
*/
44+
public function getSizes(): array
45+
{
46+
return $this->sizes;
47+
}
48+
49+
}

site/app/Pulse/Presenters/templates/PasswordsStorages/default.latte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
{define #metas}
1313
{if count($data->getSites()) === 1}
1414
{capture $currentRating}{=current($data->getSites())->getRating()|lower}{/capture}
15-
{var MichalSpacekCz\Pulse\Passwords\Algorithm $currentAlgo = current(current(current($data->getStorages())->getSites())->getAlgorithms())}
15+
{var MichalSpacekCz\Pulse\Passwords\Algorithm $currentAlgo = current($data->getSites())->getLatestAlgorithm()}
1616
<meta property="og:image" content="{="pulse/rating-$currentRating.png"|staticImageUrl}">
1717
<meta property="og:description" content="{=$currentAlgo->getId()}{if $currentAlgo->getFrom() || $currentAlgo->getLatestDisclosure()->getPublished()} ({if $currentAlgo->getFrom() && $currentAlgo->isFromConfirmed()}since {$currentAlgo->getFrom()|date:'F Y'}{/if}{if $currentAlgo->getFrom() && $currentAlgo->isFromConfirmed() && $currentAlgo->getLatestDisclosure()->getPublished()}, {/if}{if $currentAlgo->getLatestDisclosure()->getPublished()}disclosed {$currentAlgo->getLatestDisclosure()->getPublished()|date:'F Y'}{/if}){/if}">
1818
{else}

site/app/Training/DateList/trainingApplicationsList.latte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
{/ifset}
2323
{else}{/ifset}
2424
{/capture}
25-
<small title="{$title|strip}">
25+
<small title="{(string)$title|strip}">
2626
{ifset $application->priceWithCurrency}{$application->priceWithCurrency}{if $application->price > 0 && !isset($application->paid)} <strong>!</strong>{/if}{else}{/ifset}
2727
</small>
2828
</td>
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

0 commit comments

Comments
 (0)