Projekt

Obecné

Profil

Stáhnout (10.8 KB) Statistiky
| Větev: | Tag: | Revize:
1
<?php
2

    
3

    
4
namespace App\Model\Facade;
5

    
6

    
7
use App\Enum\EFlashMessage;
8
use App\Model\Repository\BookRepository;
9
use App\Model\Repository\LineRepository;
10
use App\Model\Repository\LitReferenceRepository;
11
use App\Model\Repository\ObjectTypeRepository;
12
use App\Model\Repository\SurfaceRepository;
13
use App\Model\Repository\SurfaceTypeRepository;
14
use App\Model\Repository\TransliterationRepository;
15
use Nette\Application\UI\Form;
16
use Nette\Database\Context;
17
use Nette\Database\Table\ActiveRow;
18
use Nette\Utils\ArrayHash;
19
use Tracy\Debugger;
20

    
21
class TransliterationFacade
22
{
23
    /**
24
     * @var SurfaceRepository
25
     */
26
    private $surfaceRepository;
27
    /**
28
     * @var LineRepository
29
     */
30
    private $lineRepository;
31
    /**
32
     * @var ObjectTypeRepository
33
     */
34
    private $objectTypeRepository;
35
    /**
36
     * @var SurfaceTypeRepository
37
     */
38
    private $surfaceTypeRepository;
39
    /**
40
     * @var Context
41
     */
42
    private $context;
43
    /**
44
     * @var TransliterationRepository
45
     */
46
    private $transliterationRepository;
47
    /**
48
     * @var LitReferenceRepository
49
     */
50
    private $litReferenceRepository;
51
    /**
52
     * @var BookFacade
53
     */
54
    private $bookFacade;
55

    
56
    public function __construct(SurfaceRepository $surfaceRepository,
57
                                LineRepository $lineRepository,
58
                                ObjectTypeRepository $objectTypeRepository,
59
                                SurfaceTypeRepository $surfaceTypeRepository,
60
                                TransliterationRepository $transliterationRepository,
61
                                LitReferenceRepository $litReferenceRepository,
62
                                Context $context,
63
                                BookFacade $bookFacade
64
    )
65
    {
66
        $this->surfaceRepository = $surfaceRepository;
67
        $this->lineRepository = $lineRepository;
68
        $this->objectTypeRepository = $objectTypeRepository;
69
        $this->surfaceTypeRepository = $surfaceTypeRepository;
70
        $this->context = $context;
71
        $this->transliterationRepository = $transliterationRepository;
72
        $this->litReferenceRepository = $litReferenceRepository;
73
        $this->bookFacade = $bookFacade;
74
    }
75

    
76
    /**
77
     * Vložení nové transliterace do databáze
78
     *
79
     * @param \App\Utils\Form $form
80
     * @return bool|void
81
     */
82
    public function saveNewTransliteration(\App\Utils\Form $form)
83
    {
84
        $data = $form->getValues();
85
        $transliteration = $this->saveTransliterationInfo($form);
86

    
87
        if ($data['bookContainer']['book'] == 0)
88
        {
89
            $bookId = $data['bookContainer'][BookRepository::COLUMN_ID];
90
        } else
91
        {
92
            $book = $this->bookFacade->saveBook($form);
93
            $bookId = $book[BookRepository::COLUMN_ID];
94
        }
95

    
96
        $transliteration->update([TransliterationRepository::COLUMN_BOOK_ID => $bookId]);
97

    
98
        if ($transliteration == null)
99
        {
100
            return FALSE;
101
        }
102

    
103
        $result = $this->saveTransliterationData($transliteration[TransliterationRepository::COLUMN_ID], $form);
104
        return $result;
105
    }
106

    
107
    /**
108
     * Uložení informací o transliteraci do databáze
109
     *
110
     * @param Form $form
111
     * @param int|null $id
112
     * @return ActiveRow|null
113
     */
114
    public function saveTransliterationInfo(Form $form, int $id = null)
115
    {
116
        $formValues = $form->getValues();
117
        $formValues = isset($formValues['infoContainer']) ? $formValues['infoContainer'] : $formValues;
118

    
119
        $references = $formValues['references'];
120
        unset($formValues['references']);
121

    
122
        $newTransliteration = $this->transliterationRepository->save($formValues, $id);
123

    
124
        if ($id != null)
125
        {
126
            $this->deleteRemovedReferences($references, $id);
127
        } else
128
        {
129
            $id = $newTransliteration[TransliterationRepository::COLUMN_ID];
130
        }
131

    
132
        foreach ($references as $item)
133
        {
134
            $item[LitReferenceRepository::COLUMN_TRANSLITERATION_ID] = $id;
135
            $this->litReferenceRepository->save($item, (int)$item[LitReferenceRepository::COLUMN_ID]);
136
        }
137

    
138
        return $newTransliteration;
139
    }
140

    
141
    /**
142
     * Zkontroluje jestli není nějaká refence prázdná
143
     *
144
     * @param $references array referencí
145
     * @return bool
146
     */
147
    public function isAnyReferenceEmpty($references)
148
    {
149
        foreach ($references as $r)
150
        {
151
            if (empty($r[LitReferenceRepository::COLUMN_SERIES]) && empty($r[LitReferenceRepository::COLUMN_NUMBER])
152
                && empty($r[LitReferenceRepository::COLUMN_PLATE]))
153
            {
154
                return true;
155
            }
156
        }
157
        return false;
158
    }
159

    
160
    /**
161
     * Odstraní odebrané reference transliterace
162
     *
163
     * @param $newReferences array nových transliterací
164
     */
165
    public function deleteRemovedReferences($newReferences, $id)
166
    {
167
        $references = $this->litReferenceRepository->findByTransliterationId($id);
168

    
169
        foreach ($references as $ref)
170
        {
171
            if ($this->isRemovedReference($ref, $newReferences))
172
            {
173
                $this->litReferenceRepository->delete($ref[LitReferenceRepository::COLUMN_ID]);
174
            }
175
        }
176

    
177
    }
178

    
179
    /**
180
     * Zkontroluje jestli je refence v poli referencí
181
     *
182
     * @param $reference ActiveRow reference ke kontrole
183
     * @param $newReferences array pole referencí
184
     * @return bool
185
     */
186
    public function isRemovedReference($reference, $newReferences)
187
    {
188
        foreach ($newReferences as $ref)
189
        {
190
            if ($ref[LitReferenceRepository::COLUMN_ID] == $reference[LitReferenceRepository::COLUMN_ID])
191
            {
192
                return false;
193
            }
194
        }
195
        return true;
196
    }
197

    
198
    /**
199
     * Uloží data transliterace
200
     *
201
     * @param int|null $id : ID transliterace
202
     * @param Form $form
203
     * @return int $id : Vrací ID transliterace
204
     */
205
    public function saveTransliterationData(int $id, Form $form): int
206
    {
207
        $formValues = $form->getValues();
208
        $formValues = isset($formValues['dataContainer']) ? $formValues['dataContainer'] : $formValues;
209

    
210
        $this->removeDeletedLines($id, $formValues);
211

    
212
        // Škaredý zanoření hodnot z formuláře v kontainerech :(
213
        foreach ($formValues as $objectTypeId => $surfaceContainers)
214
        {
215
            foreach ($surfaceContainers as $surfaceTypeId => $inputs)
216
            {
217
                foreach ($inputs as $key => $values)
218
                {
219
                    try
220
                    {
221
                        $lineId = (int)$values->{LineRepository::COLUMN_ID};
222

    
223
                        // Editace již existující řádky
224
                        if (!empty($lineId))
225
                        {
226
                            $this->lineRepository->fetchById($lineId)->update($values);
227

    
228
                        } else
229
                        {
230
                            $surface = $this->surfaceRepository->fetchSurface($id, $objectTypeId, $surfaceTypeId);
231

    
232
                            if ($surface === FALSE)
233
                            {
234
                                $surface = $this->surfaceRepository->insert(
235
                                    [
236
                                        SurfaceRepository::COLUMN_SURFACE_TYPE_ID => $surfaceTypeId,
237
                                        SurfaceRepository::COLUMN_OBJECT_TYPE_ID => $objectTypeId,
238
                                        SurfaceRepository::COLUMN_TRANSLITERATION_ID => $id
239
                                    ]
240
                                );
241
                            }
242

    
243
                            $values->{LineRepository::COLUMN_SURFACE_ID} = $surface->{SurfaceRepository::COLUMN_ID};
244
                            $this->lineRepository->insert($values);
245
                        }
246
                    } catch (\Exception $exception)
247
                    {
248
                        \Tracy\Debugger::log('Nepodařilo se uložit data transliterace. Chyba: ' . $exception->getMessage(), 'transliteration-facade');
249
                        return 0;
250
                    }
251
                }
252
            }
253
        }
254

    
255
        return $id;
256
    }
257

    
258
    /**
259
     * Vrací data transliterace pro formulář
260
     *
261
     * @param int $id : ID transliterace
262
     * @return array : pole výchozích hodnot pro formulář
263
     */
264
    public function getTransliterationData(int $id): array
265
    {
266
        $surfaces = $this->surfaceRepository->findByTransliterationId($id)->fetchAll();
267

    
268
        $defaults = array();
269

    
270
        /** @var ActiveRow $surface */
271
        foreach ($surfaces as $surface)
272
        {
273
            // Načtení všech řádek
274
            $lineRows = $surface->related(LineRepository::TABLE_NAME, SurfaceRepository::COLUMN_ID)->fetchAll();
275
            if ($lineRows === FALSE || empty($lineRows))
276
            {
277
                continue;
278
            }
279

    
280
            $objectId = $surface->{SurfaceRepository::COLUMN_OBJECT_TYPE_ID};
281
            $surfaceId = $surface->{SurfaceRepository::COLUMN_SURFACE_TYPE_ID};
282

    
283
            $defaults[$objectId][$surfaceId] = $lineRows;
284
        }
285

    
286
        return $defaults;
287
    }
288

    
289
    /**
290
     * Odstraní smazané řádky z DB
291
     *
292
     * @param int $id : ID transliterace
293
     * @param ArrayHash $formValues : hodnoty z formuláře
294
     * @return int : počet smazaných řádek
295
     */
296
    public function removeDeletedLines(int $id, ArrayHash $formValues)
297
    {
298
        $deletedIds = $this->getDeletedLineIds($id, $formValues);
299

    
300
        return $this->lineRepository->deleteLines($deletedIds);
301
    }
302

    
303
    /**
304
     * Vrací ID smazaných řádek transliterace
305
     *
306
     * @param int $id : ID transliterace
307
     * @param ArrayHash $formValues : hodnoty z formuláře
308
     * @return array
309
     */
310
    private function getDeletedLineIds(int $id, ArrayHash $formValues)
311
    {
312
        $deletedIds = [];
313
        $oldLines = $this->getTransliterationData($id);
314

    
315
        // Tohle je fakt nádhera :(
316
        foreach ($oldLines as $objectTypeId => $surfaceContainers)
317
        {
318
            foreach ($surfaceContainers as $surfaceTypeId => $activeRows)
319
            {
320
                foreach ($activeRows as $activeRow)
321
                {
322
                    if (isset($formValues[$objectTypeId][$surfaceTypeId]))
323
                    {
324
                        $oldLineFound = FALSE;
325
                        foreach ($formValues[$objectTypeId][$surfaceTypeId] as $array)
326
                        {
327
                            if ($array[LineRepository::COLUMN_ID] == $activeRow->{LineRepository::COLUMN_ID})
328
                            {
329
                                $oldLineFound = TRUE;
330
                                break;
331
                            }
332
                        }
333

    
334
                        if (!$oldLineFound)
335
                        {
336
                            $deletedIds[] = $activeRow->{LineRepository::COLUMN_ID};
337
                        }
338
                    }
339
                }
340
            }
341
        }
342

    
343
        return $deletedIds;
344
    }
345
}
(2-2/4)