Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 95 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 1 |
OlzKarteDetail | |
0.00% |
0 / 95 |
|
0.00% |
0 / 3 |
272 | |
0.00% |
0 / 1 |
getSearchTitle | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
getSearchResults | |
0.00% |
0 / 14 |
|
0.00% |
0 / 1 |
20 | |||
getHtml | |
0.00% |
0 / 80 |
|
0.00% |
0 / 1 |
132 |
1 | <?php |
2 | |
3 | namespace Olz\Karten\Components\OlzKarteDetail; |
4 | |
5 | use Olz\Components\Common\OlzEditableText\OlzEditableText; |
6 | use Olz\Components\Common\OlzLocationMap\OlzLocationMap; |
7 | use Olz\Components\Common\OlzRootComponent; |
8 | use Olz\Components\Page\OlzFooter\OlzFooter; |
9 | use Olz\Components\Page\OlzHeader\OlzHeader; |
10 | use Olz\Entity\Karten\Karte; |
11 | |
12 | /** @extends OlzRootComponent<array<string, mixed>> */ |
13 | class OlzKarteDetail extends OlzRootComponent { |
14 | public function getSearchTitle(): string { |
15 | return 'Karten'; |
16 | } |
17 | |
18 | public function getSearchResults(array $terms): array { |
19 | $results = []; |
20 | $code_href = $this->envUtils()->getCodeHref(); |
21 | $karte_repo = $this->entityManager()->getRepository(Karte::class); |
22 | $karten = $karte_repo->search($terms); |
23 | foreach ($karten as $karte) { |
24 | $id = $karte->getId(); |
25 | $results[] = $this->searchUtils()->getScoredSearchResult([ |
26 | 'link' => "{$code_href}karten/{$id}", |
27 | 'icon' => "{$code_href}assets/icns/link_map_16.svg", |
28 | 'date' => null, |
29 | 'title' => $karte->getName() ?: '?', |
30 | 'text' => $karte->getPlace() ?: null, |
31 | ], $terms); |
32 | } |
33 | return $results; |
34 | } |
35 | |
36 | public function getHtml(mixed $args): string { |
37 | $code_href = $this->envUtils()->getCodeHref(); |
38 | $data_href = $this->envUtils()->getDataHref(); |
39 | $karten_repo = $this->entityManager()->getRepository(Karte::class); |
40 | $user = $this->authUtils()->getCurrentUser(); |
41 | $id = $args['id'] ?? null; |
42 | |
43 | $karte = $karten_repo->findOneBy([ |
44 | 'id' => $id, |
45 | 'on_off' => 1, |
46 | ]); |
47 | |
48 | if (!$karte) { |
49 | $this->httpUtils()->dieWithHttpError(404); |
50 | throw new \Exception('should already have failed'); |
51 | } |
52 | |
53 | $name = $karte->getName(); |
54 | $kind = $karte->getKind(); |
55 | $scale = $karte->getScale(); |
56 | $year = $karte->getYear(); |
57 | $place = $karte->getPlace(); |
58 | $kartennr = $karte->getKartenNr(); |
59 | $latitude = $karte->getLatitude(); |
60 | $longitude = $karte->getLongitude(); |
61 | $preview_image_id = $karte->getPreviewImageId(); |
62 | |
63 | $pretty_kind = [ |
64 | 'ol' => "🌳 Wald-OL-Karte", |
65 | 'stadt' => "🏘️ Stadt-OL-Karte", |
66 | 'scool' => "🏫 sCOOL-Schulhaus-Karte", |
67 | ][$kind] ?? "Unbekannter Kartentyp"; |
68 | |
69 | $title = $karte->getName(); |
70 | $back_link = "{$code_href}karten"; |
71 | $maybe_place = $place ? "Ort: {$place}, " : ''; |
72 | $out = OlzHeader::render([ |
73 | 'back_link' => $back_link, |
74 | 'title' => "{$title} - Karten", |
75 | 'description' => "OL-Karte {$name} ({$pretty_kind}), Masstab: {$scale}, Stand {$year}, {$maybe_place}Herausgeber: OL Zimmerberg.", |
76 | ]); |
77 | |
78 | $out .= <<<'ZZZZZZZZZZ' |
79 | <div class='content-right'> |
80 | </div> |
81 | <div class='content-middle'> |
82 | ZZZZZZZZZZ; |
83 | $out .= "<div class='olz-karte-detail'>"; |
84 | |
85 | $out .= OlzLocationMap::render([ |
86 | 'name' => $name, |
87 | 'latitude' => $latitude, |
88 | 'longitude' => $longitude, |
89 | 'zoom' => 12, |
90 | ]); |
91 | |
92 | // Editing Tools |
93 | $is_owner = $user && intval($karte->getOwnerUser()?->getId() ?? 0) === intval($user->getId()); |
94 | $has_karten_permissions = $this->authUtils()->hasPermission('karten'); |
95 | $can_edit = $is_owner || $has_karten_permissions; |
96 | if ($can_edit) { |
97 | $json_id = json_encode($id); |
98 | $out .= <<<ZZZZZZZZZZ |
99 | <div> |
100 | <button |
101 | id='edit-karte-button' |
102 | class='btn btn-primary' |
103 | onclick='return olz.editKarte({$json_id})' |
104 | > |
105 | <img src='{$code_href}assets/icns/edit_white_16.svg' class='noborder' /> |
106 | Bearbeiten |
107 | </button> |
108 | </div> |
109 | ZZZZZZZZZZ; |
110 | } |
111 | |
112 | $maybe_place = $place ? "<div>Ort: {$place}</div>" : ''; |
113 | |
114 | $maybe_solv_link = ''; |
115 | if ($kartennr) { |
116 | // SOLV-Kartenverzeichnis-Link zeigen |
117 | $maybe_solv_link .= "<div><a href='https://www.swiss-orienteering.ch/karten/kartedetail.php?kid={$kartennr}' target='_blank' class='linkol'>SOLV Karten-Nr. {$kartennr}</a></div>\n"; |
118 | } |
119 | |
120 | $maybe_omap_link = ''; |
121 | if ($latitude !== null && $longitude !== null) { |
122 | // OMap-Kartenverzeichnis-Link zeigen |
123 | $maybe_omap_link .= "<div><a href='https://omap.ch/map.php#7/{$latitude}/{$longitude}' target='_blank' class='linkol'>Karte auf omap.ch</a></div>\n"; |
124 | } |
125 | |
126 | $out .= <<<ZZZZZZZZZZ |
127 | <h1>OL-Karte {$name}</h1> |
128 | <div><b>{$pretty_kind}</b></div> |
129 | <div>Masstab: {$scale}</div> |
130 | <div>Stand: {$year}</div> |
131 | {$maybe_place} |
132 | {$maybe_solv_link} |
133 | {$maybe_omap_link} |
134 | <div>Herausgeber: OL Zimmerberg</div> |
135 | ZZZZZZZZZZ; |
136 | |
137 | if ($preview_image_id) { |
138 | $img_href = "{$data_href}img/karten/{$id}/img/{$preview_image_id}"; |
139 | |
140 | $out .= <<<ZZZZZZZZZZ |
141 | <h3>Vorschau</h3> |
142 | <div class='olz-karte-preview'> |
143 | <img |
144 | src='{$img_href}' |
145 | alt='OL-Karte {$name}' |
146 | class='noborder' |
147 | /> |
148 | </div> |
149 | ZZZZZZZZZZ; |
150 | } |
151 | |
152 | $out .= "<h2>Kartenverkauf</h2>"; |
153 | $out .= OlzEditableText::render(['snippet_id' => 12]); |
154 | |
155 | $out .= "</div>"; // olz-karte-detail |
156 | $out .= "</div>"; // content-middle |
157 | |
158 | $out .= OlzFooter::render(); |
159 | |
160 | return $out; |
161 | } |
162 | } |