143 | | Во првиот дел проверуваме дали има грешка и ја враќаме пораката од сесија и типот го поставуваме да е секогаш грешка за да биде соодветно на пораката додека во вториот дел проверувам дали во сесија има објект alert т.е. дали се враќа одговор од серверот и ја прикажуваме пораката и типот на одговорот според сесија. |
144 | | |
145 | | |
146 | | |
| 142 | Во првиот дел проверуваме дали има грешка и ја враќаме пораката од сесија и типот го поставуваме да е секогаш грешка за да биде соодветно на пораката додека во вториот дел проверувам дали во сесија има објект alert т.е. дали се враќа одговор од серверот и ја прикажуваме пораката и типот на одговорот според сесија.\\ |
| 143 | |
| 144 | {{{ |
| 145 | public function edit(UpdateDepartmentRequest $request, $id) |
| 146 | { |
| 147 | $department = Department::findOrFail($id); |
| 148 | |
| 149 | $folders = $department->folder; |
| 150 | $oldLocation = DIRECTORY_SEPARATOR . 'Departments' . DIRECTORY_SEPARATOR . $department->code; |
| 151 | |
| 152 | $department->name = $request->name; |
| 153 | $department->code = $request->code; |
| 154 | $department->updated_at = Carbon::now(); |
| 155 | |
| 156 | if($department->isDirty('code')) |
| 157 | { |
| 158 | $location = 'Departments' . DIRECTORY_SEPARATOR . $request->code; |
| 159 | |
| 160 | if(!Storage::disk('local')->has($location)){ |
| 161 | Storage::disk('local')->move($oldLocation, $location); |
| 162 | $department->location = $location; |
| 163 | } |
| 164 | |
| 165 | foreach ($folders as $folder) { |
| 166 | $currArchId = explode('/', $folder->arch_id)[1]; |
| 167 | $folder->arch_id = $department->code . '/' . $currArchId; |
| 168 | $folder->save(); |
| 169 | foreach($folder->files as $file) { |
| 170 | $file->location = $location . DIRECTORY_SEPARATOR . $folder->name . DIRECTORY_SEPARATOR . $file->name; |
| 171 | $file->save(); |
| 172 | } |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | $department->save(); |
| 177 | |
| 178 | Alert::flash("Department edited successfully"); |
| 179 | |
| 180 | return redirect()->route("dashboard.departments.index"); |
| 181 | } |
| 182 | }}} |
| 183 | ''Метод од контролерот DepartmentsController за уредување на оддел''\\ |
| 184 | Со помош на методот edit може да се смени името на одделот или кодот. Во случај кога ќе се прави измена во кодот потребно е името на фолдерот каде што се наоѓаат сите датотеки од тој оддел да се преименува. Со таа цел преку функцијата isDirty() со која може да се дознае дали моделот е уреден пред да се запише во база проверувам дали има промена и доколку има прво го поместуваме одделот во нов директориум а потоа во две итерации ги изминуваме сите фолдери и датотеки и нивните патеки во база ги заменуваме со новата. На крај ги зачувуваме и прикажувам соодветна порака за извршена акција како и го враќам корисникот во страницата со сите оддели.\\ |
| 185 | |
| 186 | {{{ |
| 187 | public function destroy($id) |
| 188 | { |
| 189 | $department = Department::find($id); |
| 190 | //$department->delete(); |
| 191 | $folders = $department->folder()->count(); |
| 192 | |
| 193 | if($folders > 0){ |
| 194 | Alert::flash($department->name . " has " . $folders . " document/s associated", "error"); |
| 195 | } |
| 196 | else { |
| 197 | $department->delete(); |
| 198 | |
| 199 | Alert::flash($department->name . " deleted successfully"); |
| 200 | } |
| 201 | |
| 202 | return redirect()->route("dashboard.departments.index"); |
| 203 | } |
| 204 | }}} |
| 205 | ''Метод од контролерот DepartmentsController за бришење на оддел''\\ |
| 206 | Покрај уредување на оддел корисникот со привилегии администратор или референт има можност да избрише еден оддел што значи да се одстранат сите записи од база како и сите фолдери и датотеки за истиот. Корисникот има можност да го избрише одделот само ако тој оддел е празен т.е. доколку во него не постои ниту еден фолдер. Во спротивно, се фрла порака дека тој оддел има асоцирани фолдери со него и не ја дозволува акцијата да се изврши.\\ |
| 207 | |
| 208 | {{{ |
| 209 | public function downloadDepartment($id) |
| 210 | { |
| 211 | $department = Department::find($id); |
| 212 | $folders = Folder::where('department_id', $id)->get(); |
| 213 | $flag = false; |
| 214 | |
| 215 | foreach($folders as $folder){ |
| 216 | if($folder->no_of_files > 0) |
| 217 | $flag=true; |
| 218 | break; |
| 219 | } |
| 220 | |
| 221 | if($flag) { |
| 222 | $zip_file=Storage::disk('local')->path('Department.zip'); |
| 223 | $zip = new \ZipArchive(); |
| 224 | $zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE); |
| 225 | $path = Storage::disk('local')->path($department->location); |
| 226 | |
| 227 | $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path)); |
| 228 | |
| 229 | foreach ($files as $file) { |
| 230 | |
| 231 | if (!$file->isDir()) { |
| 232 | $filePath = $file->getRealPath(); |
| 233 | $relativePath = substr($filePath, strlen($path) + 1); |
| 234 | $zip->addFile($filePath, $relativePath); |
| 235 | } |
| 236 | } |
| 237 | |
| 238 | $zip->close(); |
| 239 | $headers = array('Content-Type' => 'application/octet-stream'); |
| 240 | $zip_new_name = Carbon::now()->format('d.m.Y - ') . $department->name . '.zip'; |
| 241 | return response()->download($zip_file, $zip_new_name, $headers); |
| 242 | } |
| 243 | else { |
| 244 | Alert::flash("This department has no files", "warning"); |
| 245 | return redirect()->back(); |
| 246 | } |
| 247 | } |
| 248 | }}} |
| 249 | ''Метод од контролерот DepartmentsController за симнување на фолдери и датотеки од оддел''\\ |
| 250 | За потребите на компанијата додаден е метод за симнување на сите фолдери со нивните датотеки од еден оддел преку кој се креира zip кој ги содржи сите фолдери од еден оддел со истата структура како што се тие запишани на сервер. На почеток проверуваме дали има празни фолдери со цел тие да ги игнорираме затоа што не содржат ниту една датотека.Класата RecursiveIteratorIterator која што е тип на итератор кој ни овозможува рекурзивно да ги поминеме сите патеки ми помогна да ги најдам потребните фолдери и датотеки. За разлика од обичен итератор кој што пребарува низ листа RecursiveIteratorIterator може да се каже дека пребарува низ дрво и ја олеснува работата кога се работи за неколку патеки во еден директориум. За секоја пронајдена датотека ја добиваме патеката од Storage и ја додаваме во zip. На крај ја симнуваме датотеката со доделено име, прикажуваме соодветна порака и се враќаме назад. Во овој дел клуч е патеката која ја запишувам при креирање на оддел. На истиот начин направив и функција за симнување на сите оддели со нивните фолдери и датотеки при што се игнорираат празните оддели и фолдери.\\ |
| 251 | |
| 252 | {{{ |
| 253 | |
| 254 | }}} |
| 255 | |