Projekt

Obecné

Profil

Stáhnout (12.8 KB) Statistiky
| Větev: | Tag: | Revize:
1 3f8f3bd6 Filip Jani
<?php
2
3
4
namespace App\AdminModule\Components;
5
6
7 f0d8e0f6 Jan Šedivý
use App\Enum\EFlashMessage;
8
use App\Enum\ESurfaceTypes;
9 3f8f3bd6 Filip Jani
use App\Model\Repository\BookRepository;
10
use App\Model\Repository\BookTypeRepository;
11 f0d8e0f6 Jan Šedivý
use App\Model\Repository\LineRepository;
12 3f8f3bd6 Filip Jani
use App\Model\Repository\MuseumRepository;
13
use App\Model\Repository\OriginRepository;
14
use App\Model\Repository\TransliterationRepository;
15
use App\Utils\DataGrid\DataGrid;
16
use Nette\Database\Table\ActiveRow;
17
use Nette\Database\Table\Selection;
18 42c20ae6 Jan Šedivý
use Tracy\Debugger;
19 3f8f3bd6 Filip Jani
use Ublaboo\DataGrid\Exception\DataGridException;
20
21
class TransliterationGrid extends DataGrid
22
{
23
    /**
24
     * @var TransliterationRepository
25
     */
26
    private $transliterationRepository;
27
    /**
28
     * @var BookRepository
29
     */
30
    private $bookRepository;
31
    /**
32
     * @var MuseumRepository
33
     */
34
    private $museumRepository;
35
    /**
36
     * @var OriginRepository
37
     */
38
    private $originRepository;
39
    /**
40
     * @var BookTypeRepository
41
     */
42
    private $bookTypeRepository;
43 f0d8e0f6 Jan Šedivý
    /**
44
     * @var LineRepository
45
     */
46
    private $lineRepository;
47
48
    const EXPORT_FILE_PATH = __DIR__ . '/../../../../temp/export/';
49
    const EXPORT_FILE_TYPE = '.txt';
50 3f8f3bd6 Filip Jani
51
    public function __construct(TransliterationRepository $transliterationRepository,
52
                                BookRepository $bookRepository,
53
                                MuseumRepository $museumRepository,
54
                                OriginRepository $originRepository,
55 f0d8e0f6 Jan Šedivý
                                BookTypeRepository $bookTypeRepository,
56
                                LineRepository $lineRepository
57 3f8f3bd6 Filip Jani
    )
58
    {
59
        $this->transliterationRepository = $transliterationRepository;
60
        $this->bookRepository = $bookRepository;
61
        $this->museumRepository = $museumRepository;
62
        $this->originRepository = $originRepository;
63
        $this->bookTypeRepository = $bookTypeRepository;
64 f0d8e0f6 Jan Šedivý
        $this->lineRepository = $lineRepository;
65 3f8f3bd6 Filip Jani
66
        parent::__construct(FALSE);
67
    }
68
69
    /**
70
     * Abstraktní metoda, slouží k nastavení primárního klíče a nastavení datasource
71
     *  1. $this->setPrimaryKey();
72
     *  2. $this->setDataSource();
73
     *
74
     * @throws DataGridException
75
     */
76
    public function init()
77
    {
78
        $this->setPrimaryKey(TransliterationRepository::COLUMN_ID);
79
        $this->setDataSource($this->transliterationRepository->findAll());
80
    }
81
82
    /**
83
     * Definice sloupečků, akcí, vyhledávácích filtrů gridu
84
     *
85
     * @throws DataGridException
86
     */
87
    public function define()
88
    {
89
        $bookRepository = $this->bookRepository;
90
        $museumRepository = $this->museumRepository;
91
92
        // ==================
93
        // Definice sloupečků
94
        // ==================
95
        $this->addColumnNumber(TransliterationRepository::COLUMN_ID, 'ID')->setDefaultHide(TRUE);
96
        $this->addColumnLink(TransliterationRepository::COLUMN_BOOK_ID, 'Book')
97
            ->setRenderer(function (ActiveRow $activeRow)
98
            {
99 1cc8ab3c Filip Jani
                return $this->getRenderer(
100
                    $activeRow,
101
                    BookRepository::TABLE_NAME,
102
                    BookRepository::COLUMN_ID,
103
                    BookRepository::COLUMN_BOOK_ABREV,
104 5257d326 Filip Jani
                    TransliterationRepository::COLUMN_BOOK_ID,
105
                    'Book:edit'
106 1cc8ab3c Filip Jani
                );
107 3f8f3bd6 Filip Jani
            });
108
        $this->addColumnNumber(TransliterationRepository::COLUMN_CHAPTER, 'Chapter');
109
        $this->addColumnLink(TransliterationRepository::COLUMN_MUSEUM_ID, 'Museum')
110
            ->setRenderer(function (ActiveRow $activeRow)
111
            {
112 1cc8ab3c Filip Jani
                return $this->getRenderer(
113
                    $activeRow,
114
                    MuseumRepository::TABLE_NAME,
115
                    MuseumRepository::COLUMN_ID,
116
                    MuseumRepository::COLUMN_NAME,
117 5257d326 Filip Jani
                    TransliterationRepository::COLUMN_MUSEUM_ID,
118
                    'Museum:edit'
119 1cc8ab3c Filip Jani
                );
120 3f8f3bd6 Filip Jani
            });
121
        $this->addColumnText(TransliterationRepository::COLUMN_MUSEUM_NO, 'Museum No');
122
        $this->addColumnLink(TransliterationRepository::COLUMN_ORIGIN_ID, 'Origin')
123
            ->setRenderer(function (ActiveRow $activeRow)
124
            {
125 1cc8ab3c Filip Jani
                return $this->getRenderer(
126
                    $activeRow,
127
                    OriginRepository::TABLE_NAME,
128
                    OriginRepository::COLUMN_ID,
129
                    OriginRepository::COLUMN_ORIGIN,
130 5257d326 Filip Jani
                    TransliterationRepository::COLUMN_ORIGIN_ID,
131
                    'Origin:edit'
132 1cc8ab3c Filip Jani
                );
133 3f8f3bd6 Filip Jani
            });
134
        $this->addColumnLink(TransliterationRepository::COLUMN_BOOK_TYPE_ID, 'Book Type')
135
            ->setRenderer(function (ActiveRow $activeRow)
136
            {
137 1cc8ab3c Filip Jani
                return $this->getRenderer(
138
                    $activeRow,
139
                    BookTypeRepository::TABLE_NAME,
140
                    BookTypeRepository::COLUMN_ID,
141
                    BookTypeRepository::COLUMN_BOOK_TYPE,
142 5257d326 Filip Jani
                    TransliterationRepository::COLUMN_BOOK_TYPE_ID,
143
                    'BookType:edit'
144 1cc8ab3c Filip Jani
                );
145 3f8f3bd6 Filip Jani
            });
146
        $this->addColumnText(TransliterationRepository::COLUMN_REG_NO, 'Reg No');
147
        $this->addColumnText(TransliterationRepository::COLUMN_DATE, 'Date');
148
149
        // ===============
150
        // Definice filtrů
151
        // ===============
152
        $this->addFilterText(TransliterationRepository::COLUMN_BOOK_ID, 'Book')
153
            ->setCondition(function (Selection $selection, $value) use ($bookRepository)
154
            {
155
                $bookIds = $bookRepository->getBooksLikeBookAbbrev($value)->fetchField(BookRepository::COLUMN_ID);
156
                $bookIds = $bookIds ? $bookIds : NULL;
157
158
                $selection->where(BookRepository::COLUMN_ID, $bookIds);
159
            });
160
        $this->addFilterText(TransliterationRepository::COLUMN_CHAPTER, 'Chapter');
161
        $this->addFilterText(TransliterationRepository::COLUMN_MUSEUM_ID, 'Museum')
162
            ->setCondition(function (Selection $selection, $value) use ($museumRepository)
163
            {
164
                $museumIds = $museumRepository->getMuseumsLikeName($value)->fetchField(MuseumRepository::COLUMN_ID);
165
                $museumIds = $museumIds ? $museumIds : NULL;
166
167
                $selection->where(MuseumRepository::COLUMN_ID, $museumIds);
168
            });
169
        $this->addFilterText(TransliterationRepository::COLUMN_MUSEUM_NO, 'Museum No');
170 1cc8ab3c Filip Jani
        $this->addFilterSelect(TransliterationRepository::COLUMN_ORIGIN_ID, 'Origin', $this->getOriginFilterArray());
171
        $this->addFilterSelect(TransliterationRepository::COLUMN_BOOK_TYPE_ID, 'Book Type', $this->getBookTypeFilterArray());
172 3f8f3bd6 Filip Jani
        $this->addFilterText(TransliterationRepository::COLUMN_REG_NO, 'Reg No');
173
        $this->addFilterText(TransliterationRepository::COLUMN_DATE, 'Date');
174
175 1cc8ab3c Filip Jani
        // Zakázání zobrazení všech položek, protože jinak se grid sekne a nelze resetovat
176
        $this->setItemsPerPageList([10, 20, 50, 100], FALSE);
177
178 3f8f3bd6 Filip Jani
        // =============
179
        // Definice akcí
180
        // =============
181 2d22b618 hard456
        $this->addAction('edit', 'edit', 'Transliteration:edit', ['id' => TransliterationRepository::COLUMN_ID])
182
            ->setTitle('Edit');
183 3f8f3bd6 Filip Jani
184
        $this->addAction('delete', 'delete', 'deleteTransliteration!', ['id' => TransliterationRepository::COLUMN_ID])
185
            ->setConfirm('Do you really want to delete transliteration?')
186
            ->setTitle('Delete')
187
            ->setClass('btn btn-xs btn-danger ajax');
188 f0d8e0f6 Jan Šedivý
189
        $this->addExportCallback(
190
            'Export dat',
191
            function ($dataSource, $grid)
192
            {
193
                $this->exportData($dataSource, $grid);
194
            },
195
            TRUE);
196 3f8f3bd6 Filip Jani
    }
197 1cc8ab3c Filip Jani
198
    /**
199
     * Vrací pole s možnostmi pro combobox filtr místa původu
200
     *
201
     * @return array
202
     */
203
    private function getOriginFilterArray()
204
    {
205 98f9c8ed Filip Jani
        $array = $this->originRepository->findAll()->order(OriginRepository::COLUMN_ORIGIN)->fetchPairs(OriginRepository::COLUMN_ID, OriginRepository::COLUMN_ORIGIN);
206 1cc8ab3c Filip Jani
        return $array;
207
    }
208
209
    /**
210
     * Vrací pole s možnostmi pro combobox filtr typu knihy
211
     *
212
     * @return array
213
     */
214
    private function getBookTypeFilterArray()
215
    {
216 98f9c8ed Filip Jani
        $array = $this->bookTypeRepository->findAll()->order(BookTypeRepository::COLUMN_BOOK_TYPE)->fetchPairs(BookTypeRepository::COLUMN_ID, BookTypeRepository::COLUMN_BOOK_TYPE);
217 1cc8ab3c Filip Jani
        return $array;
218
    }
219
220
    /**
221
     * Vrací renderer pro vlastní zobrazení názvu místo ID cizího klíče v gridu
222
     *
223
     * @param ActiveRow $activeRow
224
     * @param string $key
225
     * @param string $throughColumn
226
     * @param string $titleColumn
227
     * @param string $idColumn
228 5257d326 Filip Jani
     * @param string $destination
229 1cc8ab3c Filip Jani
     * @return string
230
     * @throws \Nette\Application\UI\InvalidLinkException
231
     */
232 5257d326 Filip Jani
    private function getRenderer(ActiveRow $activeRow, string $key, string $throughColumn, string $titleColumn, string $idColumn, string $destination)
233 1cc8ab3c Filip Jani
    {
234
        $ref = $activeRow->ref($key, $throughColumn);
235
236
        if ($ref)
237
        {
238
            $title = $ref->{$titleColumn};
239 5257d326 Filip Jani
            return $this->getRendererWithLink($activeRow, $title, $destination, $activeRow->{$idColumn});
240 1cc8ab3c Filip Jani
        } else
241
        {
242
            return "";
243
        }
244
    }
245 f0d8e0f6 Jan Šedivý
246
    /**
247
     * @param $dataSource
248
     * @param DataGrid $grid
249
     */
250
    private function exportData($dataSource, $grid)
251
    {
252
        $exportData = [];
253 42c20ae6 Jan Šedivý
254
        try
255 f0d8e0f6 Jan Šedivý
        {
256 42c20ae6 Jan Šedivý
            /** @var ActiveRow $activeRow */
257
            foreach ($dataSource as $activeRow)
258 f0d8e0f6 Jan Šedivý
            {
259 42c20ae6 Jan Šedivý
                //Přeskočí transliterace které nejsou přiřazené k žádné knížce
260
                if(!$activeRow->ref('id_book'))
261
                {
262
                    continue;
263
                }
264
                $lines = $this->lineRepository->getAllLinesForTransliteration($activeRow->getPrimary());
265
                $chapterLines = [];
266
                foreach ($lines as $line)
267
                {
268
                    $chapterLines[$line->object_type][$line->surface_type][] = array('transliteration' => $line->transliteration, 'line_number' => $line->line_number);
269
                }
270
                $exportData[] = [
271
                    'bookName' => $activeRow->ref('id_book')->book_abrev,
272
                    'chapter' => $activeRow->chapter,
273
                    'transliterationData' => $chapterLines
274
                ];
275 f0d8e0f6 Jan Šedivý
            }
276
277 42c20ae6 Jan Šedivý
            $uniqueBooks = array_unique(array_map(function ($i) { return $i['bookName']; }, $exportData));
278
279
            $currentDate = new \DateTime();
280
            $exportFileName =  'text-export-' .
281
                $currentDate->format('Y-m-d-H-i-s') .
282
                self::EXPORT_FILE_TYPE;
283 f0d8e0f6 Jan Šedivý
284
            if (!file_exists(self::EXPORT_FILE_PATH)) {
285
                mkdir(self::EXPORT_FILE_PATH, 0777, true);
286
            }
287
            $exportFile = fopen(self::EXPORT_FILE_PATH . $exportFileName, 'w');
288
            foreach ($uniqueBooks as $book)
289
            {
290
                $bookData = [];
291
                foreach ($exportData as $data)
292
                {
293
                    if ($data['bookName'] == $book)
294
                    {
295
                        $bookData[] = $data;
296
                    }
297
                }
298
                fwrite($exportFile, "|" . $book . "\n");
299
                foreach ($bookData as $chapterData)
300
                {
301
                    fwrite($exportFile, "|" . $chapterData['chapter'] . "\n");
302
                    foreach ($chapterData['transliterationData'] as $surfaces)
303
                    {
304
                        foreach ($surfaces as $type => $surface)
305
                        {
306
                            for ($i = 0; $i < sizeof($surface); $i++)
307
                            {
308
                                $line =
309
                                    $surface[$i][LineRepository::COLUMN_LINE_NUMBER] .
310
                                    " " .
311
                                    $surface[$i][LineRepository::COLUMN_TRANSLITERATION];
312
                                if($i == 0 && $type != ESurfaceTypes::OBVERSE) {
313
                                    $line .= " " . ESurfaceTypes::getTypeAbbrevForExport($type);
314
                                }
315
                                fwrite($exportFile, $line . "\n");
316
                            }
317
                        }
318
                    }
319
                }
320
                fwrite($exportFile, "\n");
321
            }
322
323
            fclose($exportFile);
324
            header("Content-type: text/plain");
325
            header("Content-disposition: attachment; filename = " . $exportFileName);
326
            readfile(self::EXPORT_FILE_PATH . $exportFileName);
327
            die();
328
        }
329
        catch (\Exception $e)
330
        {
331
            $this->presenter->flashMessage('There was an error creating the export file', EFlashMessage::ERROR);
332 42c20ae6 Jan Šedivý
            Debugger::log($e, 'export-error');
333 f0d8e0f6 Jan Šedivý
        }
334
335
        $this->presenter->flashMessage('There was an error downloading the export file', EFlashMessage::ERROR);
336
    }
337 3f8f3bd6 Filip Jani
}
338
339
interface ITransliterationGridFactory
340
{
341
    /**
342
     * @return TransliterationGrid
343
     */
344
    public function create();
345
}