Projekt

Obecné

Profil

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