Projekt

Obecné

Profil

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

    
3

    
4
namespace App\Model\Facade;
5

    
6
use App\Model\Repository\BookRepository;
7
use App\Model\Repository\LineRepository;
8
use App\Model\Repository\SurfaceRepository;
9
use App\Model\Repository\TransliterationRepository;
10
use Nette\Database\Context;
11
use Nette\Database\Table\ActiveRow;
12

    
13
/**
14
 * Class TransportFacade sloužící pro import/export práce s db
15
 * @package App\Model\Facade
16
 */
17
class TransportFacade
18
{
19
    /** @var BookRepository */
20
    private $bookRepository;
21

    
22
    /** @var TransliterationRepository */
23
    private $transliterationRepository;
24

    
25
    /** @var SurfaceRepository */
26
    private $surfaceRepository;
27

    
28
    /** @var LineRepository */
29
    private $lineRepository;
30

    
31
    /** @var Context */
32
    private $context;
33

    
34

    
35
    public function __construct(BookRepository $bookRepository,
36
                                TransliterationRepository $transliterationRepository,
37
                                SurfaceRepository $surfaceRepository,
38
                                LineRepository $lineRepository,
39
                                Context $context
40
    )
41
    {
42
        $this->bookRepository = $bookRepository;
43
        $this->transliterationRepository = $transliterationRepository;
44
        $this->surfaceRepository = $surfaceRepository;
45
        $this->lineRepository = $lineRepository;
46
        $this->context = $context;
47
    }
48

    
49
    /**
50
     * Uloží data transliterace z importu
51
     *
52
     * @param $data
53
     * @return bool
54
     */
55
    public function saveImportedData($data)
56
    {
57
        // Škaredý zanoření hodnot z dat v importu :( Tohle bude pro db náročný
58
        foreach ($data as $book => $chapters)
59
        {
60
            try
61
            {
62
                $bookId = $this->getBookIdByName($book);
63
                if (!$bookId)
64
                {
65
                    $bookId = $this->bookRepository->insert([BookRepository::COLUMN_BOOK_ABBREV => $book])->getPrimary();
66
                }
67
                foreach ($chapters as $chapter => $surfaces)
68
                {
69
                    $transliterationId = $this->getTransliterationIdCurrentBookChapter($bookId, trim(explode(" ", $chapter)[0]));
70
                    if (!$transliterationId)
71
                    {
72
                        $chapterReg = explode(" ", $chapter);
73
                        if (isset($chapterReg[1]))
74
                        {
75
                            $chapterReg[1] = str_replace(array('(', ')'), '', $chapterReg[1]);
76
                            $transliteration = $this->transliterationRepository->insert([
77
                                TransliterationRepository::COLUMN_BOOK_ID => $bookId,
78
                                TransliterationRepository::COLUMN_CHAPTER => $chapterReg[0],
79
                                TransliterationRepository::COLUMN_REG_NO => $chapterReg[1]
80
                            ]);
81
                            if($transliteration)
82
                            {
83
                                $transliterationId = $transliteration->getPrimary();
84
                            }
85
                            else continue;
86
//                            $transliterationId = $this->context->getInsertId(TransliterationRepository::COLUMN_ID);
87
                        } else
88
                        {
89
                            $transliteration = $this->transliterationRepository->insert([
90
                                TransliterationRepository::COLUMN_BOOK_ID => $bookId,
91
                                TransliterationRepository::COLUMN_CHAPTER => $chapterReg[0]
92
                            ]);
93
                            if($transliteration)
94
                            {
95
                                $transliterationId = $transliteration->getPrimary();
96
                            }
97
                            else continue;
98
//                            $transliterationId = $this->context->getInsertId(TransliterationRepository::COLUMN_ID);
99
                        }
100
                    }
101
                    foreach ($surfaces as $surface => $values)
102
                    {
103
                        $surfaceId = $this->getSurfaceIdByCurrentTransSurfType($transliterationId, $surface);
104
                        if (!$surfaceId)
105
                        {
106
                            $surfaceId = $this->surfaceRepository->insert([
107
                                SurfaceRepository::COLUMN_TRANSLITERATION_ID => $transliterationId,
108
                                SurfaceRepository::COLUMN_SURFACE_TYPE_ID => $surface,
109
                                SurfaceRepository::COLUMN_OBJECT_TYPE_ID => 1
110
                            ])->getPrimary();
111
                        }
112

    
113
                        foreach ($values as $line)
114
                        {
115
                            $lineId = $this->getLineIdByCurrentSurfLineNum($surfaceId, (explode(' ', $line)[0]));
116
                            if (!$lineId)
117
                            {
118
                                $this->lineRepository->insert([
119
                                    LineRepository::COLUMN_SURFACE_ID => $surfaceId,
120
                                    LineRepository::COLUMN_LINE_NUMBER => (explode(' ', $line)[0]),
121
                                    LineRepository::COLUMN_TRANSLITERATION => substr(strchr($line, " "), 1),
122
                                ])->{LineRepository::COLUMN_ID};
123
                            } else
124
                            {
125
                                $this->lineRepository->fetchById($lineId)->update([
126
                                    LineRepository::COLUMN_TRANSLITERATION => substr(strchr($line, " "), 1)
127
                                ]);
128
                            }
129
                        }
130
                    }
131
                }
132
            } catch (\Exception $exception)
133
            {
134
                \Tracy\Debugger::log($exception, 'transport-facade');
135
                return FALSE;
136
            }
137
        }
138
        return TRUE;
139
    }
140

    
141
    /**
142
     * Vrací id knihy podle jména zkratky
143
     * @param $bookName
144
     * @return bool|mixed|ActiveRow
145
     */
146
    public function getBookIdByName(string $bookName)
147
    {
148
        $book = $this->bookRepository->getBookByBookAbbrev($bookName)->fetch();
149
        if (!empty($book))
150
        {
151
            return $book->getPrimary();
152
        } else
153
        {
154
            return false;
155
        }
156
    }
157

    
158
    private function getTransliterationIdCurrentBookChapter(int $bookId, string $chapterName)
159
    {
160
        $transliteration = $this->transliterationRepository->getTransliterationByChapterNameAndBookId($bookId, $chapterName)->fetch();
161
        if (!empty($transliteration))
162
        {
163
            return $transliteration->getPrimary();
164
        } else
165
        {
166
            return false;
167
        }
168
    }
169

    
170
    private function getSurfaceIdByCurrentTransSurfType(int $transliterationId, int $surfaceId)
171
    {
172
        $surface = $this->surfaceRepository->getSurfaceByTransliterationIdAndSurfaceTypeId($transliterationId, $surfaceId)->fetch();
173

    
174
        if (!empty($surface))
175
        {
176
            return $surface->getPrimary();
177
        } else
178
        {
179
            return false;
180
        }
181
    }
182

    
183
    private function getLineIdByCurrentSurfLineNum(int $surfaceId, $lineNum)
184
    {
185
        $line = $this->lineRepository->getLineBySurfaceIdAndLineNumber($surfaceId, $lineNum)->fetch();
186
        if (!empty($line))
187
        {
188
            return $line->{LineRepository::COLUMN_ID};
189
        } else
190
        {
191
            return false;
192
        }
193
    }
194
}
(3-3/4)