Changes between Version 12 and Version 13 of Имплементација


Ignore:
Timestamp:
11/21/21 14:10:16 (3 years ago)
Author:
151545
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Имплементација

    v12 v13  
    6363    Route::group(['middleware' => 'permission:manage_all_departments'], function () {
    6464        Route::post("/departments/store", "Dashboard\DepartmentsController@store")->name("dashboard.departments.store");
    65         Route::get("/departments/{id}/edit", "Dashboard\DepartmentsController@editShow")->name("dashboard.departments.editShow");
    6665        Route::patch("/departments/{id}/edit", "Dashboard\DepartmentsController@edit")->name("dashboard.departments.edit");
    6766     });
     
    6968
    7069''Листа на рути за оддели''\\
    71 Секој повик во Laravel потребно е да има посебна рута. Рутата со име index ја дефинирав посебно за да се ограничи пристапот за корисници кои имаат ролја во која не е дозволено да управуваат со оддели. Рутата store служи за креирање на нов оддел. Методот во оваа рута секогаш треба да е post затоа што се запишуваат нови податоци т.е. се креира нов оддел. Кога се работи за приказ или влечење на податоци од табела се користи методот get како што е рутата editShow која служи за приказ на еден оддел. Методот patch се повикува кога се прави ажурирање на податоците во база за веќе креиран оддел што во овој случај е рутата со име edit. На двете рути за да прикажат и ажурираат оддел потребно им е да се додели вредност id која според id-то во база ќе го најде конкретниот оддел.
     70Секој повик во Laravel потребно е да има посебна рута. Рутата со име index ја дефинирав посебно за да се ограничи пристапот за корисници кои имаат ролја во која не е дозволено да управуваат со оддели. Рутата store служи за креирање на нов оддел. Методот во оваа рута секогаш треба да е post затоа што се запишуваат нови податоци т.е. се креира нов оддел. Методот patch се повикува кога се прави ажурирање на податоците во база за веќе креиран оддел што во овој случај е рутата со име edit. На двете рути за да прикажат и ажурираат оддел потребно им е да се додели вредност id која според id-то во база ќе го најде конкретниот оддел.
    7271
    7372
     
    141140}}}
    142141''Интерфејсот за приказ на пораките''\\
    143 Во првиот дел проверуваме дали има грешка и ја враќаме пораката од сесија и типот го поставуваме да е секогаш грешка за да биде соодветно на пораката додека во вториот дел проверувам дали во сесија има објект alert т.е. дали се враќа одговор од серверот и ја прикажуваме пораката и типот на одговорот според сесија.
    144 
    145 
    146 
     142Во првиот дел проверуваме дали има грешка и ја враќаме пораката од сесија и типот го поставуваме да е секогаш грешка за да биде соодветно на пораката додека во вториот дел проверувам дали во сесија има објект alert т.е. дали се враќа одговор од серверот и ја прикажуваме пораката и типот на одговорот според сесија.\\
     143
     144{{{
     145public 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{{{
     187public 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{{{
     209public 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