add file resource

This commit is contained in:
aslan 2024-01-26 11:15:11 +03:00
parent df05cd21f4
commit 95deb4cefe
11 changed files with 387 additions and 19 deletions

View File

@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreFileRequest;
use App\Http\Requests\StoreReceptionScreenRequest;
use App\Http\Requests\UpdateFileRequest;
use App\Http\Requests\UpdateReceptionScreenRequest;
use App\Models\File;
use App\Models\ReceptionScreen;
use App\Services\WorkWithFiles;
use Carbon\Carbon;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\Auth;
class FileController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index(): View|Application|Factory|\Illuminate\Contracts\Foundation\Application
{
abort_if(Auth::guest(), 403);
$files = File::all()->sortBy('position');
return view('files.index', compact('files'));
}
public function create($idReceptionScreen = null): View
{
abort_if(Auth::guest(), 403);
$receptionScreens = ReceptionScreen::pluck('name', 'id');
$idsReceptionScreens = $receptionScreens->keys()->toArray();
$files = File::where('reception_screen_id', '=', $idReceptionScreen)->get();
return view('files.create', compact('receptionScreens', 'idsReceptionScreens', 'idReceptionScreen', 'files'));
}
public function store(StoreFileRequest $request)
{
abort_if(Auth::guest(), 403);
$content = $request->file('url');
WorkWithFiles::saveFileToUploads($content);
$newPath = WorkWithFiles::renameFile($content);
$validated = $request->validated();
$file = new File();
$file->name = $validated['name'];
$file->url = $newPath;
$file->position = $validated['position'];
$file->reception_screen_id = $validated['idReceptionScreen'];
$file->save();
return redirect()->route('files.index');
}
public function edit(int $idFile)
{
abort_if(Auth::guest(), 403);
$file = (new File())->find($idFile);
$files = File::where('reception_screen_id', '=', $file->reception_screen_id)->get();
$receptionScreens = ReceptionScreen::pluck('name', 'id');
$idsReceptionScreens = $receptionScreens->keys()->toArray();
$idReceptionScreen = $file->reception_screen_id;
return view('files.edit', compact('receptionScreens', 'idsReceptionScreens', 'idReceptionScreen', 'files', 'file'));
}
public function update(UpdateFileRequest $request, File $file)
{
abort_if(Auth::guest(), 403);
$validated = $request->validated();
$file->name = $validated['name'];
$file->position = $validated['position'];
$file->reception_screen_id = $validated['idReceptionScreen'];
$file->save();
return redirect()->route('admin-reception-screen.index');
}
public function destroy($idFile)
{
abort_if(Auth::guest(), 403);
$file = (new File())->find($idFile);
$file->delete();
return redirect()->route('admin-reception-screen.index');
}
}

View File

@ -18,6 +18,8 @@ class ReceptionScreenController extends Controller
} }
public function index(): View|Application|Factory|\Illuminate\Contracts\Foundation\Application public function index(): View|Application|Factory|\Illuminate\Contracts\Foundation\Application
{ {
abort_if(Auth::guest(), 403);
$receptionScreens = ReceptionScreen::all()->sortBy('position'); $receptionScreens = ReceptionScreen::all()->sortBy('position');
return view('admin-reception-screen.index', compact('receptionScreens')); return view('admin-reception-screen.index', compact('receptionScreens'));
} }
@ -32,6 +34,8 @@ class ReceptionScreenController extends Controller
public function store(StoreReceptionScreenRequest $request) public function store(StoreReceptionScreenRequest $request)
{ {
abort_if(Auth::guest(), 403);
$validated = $request->validated(); $validated = $request->validated();
$receptionScreen = new ReceptionScreen(); $receptionScreen = new ReceptionScreen();
$receptionScreen->name = $validated['name']; $receptionScreen->name = $validated['name'];
@ -52,6 +56,8 @@ class ReceptionScreenController extends Controller
public function update(UpdateReceptionScreenRequest $request, $id) public function update(UpdateReceptionScreenRequest $request, $id)
{ {
abort_if(Auth::guest(), 403);
$validated = $request->validated(); $validated = $request->validated();
$receptionScreen = new ReceptionScreen(); $receptionScreen = new ReceptionScreen();
$currentReceptionScreen = $receptionScreen->find($id); $currentReceptionScreen = $receptionScreen->find($id);

View File

@ -6,10 +6,6 @@ use Illuminate\Http\Request;
class UploadFileController extends Controller class UploadFileController extends Controller
{ {
public function index()
{
return view('uploadfile');
}
public function showUploadFile(Request $request) public function showUploadFile(Request $request)
{ {
$file = $request->file('image'); $file = $request->file('image');

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreFileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'max:255',
'position' => 'int|max:255',
'url' => 'file',
'idReceptionScreen' => 'int|max:255',
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateFileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|max:255',
'position' => 'required||int|max:255',
'idReceptionScreen' => 'int|max:255',
];
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace App\Services;
use Carbon\Carbon;
class WorkWithFiles
{
public static function saveFileToUploads($content)
{
$destinationPath = 'uploads';
$content->move($destinationPath, $content->getClientOriginalName());
}
public static function renameFile($content)
{
$nameChunks = explode('.', $content->getClientOriginalName());
array_splice($nameChunks, 1);
$timestamp = Carbon::now();
$name = implode('.', $nameChunks);
$newName = "{$name}{$timestamp}.{$content->getClientOriginalExtension()}";
$dir = __DIR__;
$path = "{$dir}/../../public/uploads/";
$oldName = $content->getClientOriginalName();
rename("{$path}{$oldName}", "{$path}{$newName}");
return "{$path}{$newName}";
}
}

View File

@ -43,11 +43,11 @@
<tr> <tr>
<th scope="row">{{ $file->position }}</th> <th scope="row">{{ $file->position }}</th>
<td>{{ $file->name }}</td> <td>{{ $file->name }}</td>
<td><a href="{{ route("admin-reception-screen.edit", $file) }}" <td><a href="{{ route("files.edit", $file) }}"
class="btn btn-secondary">редактировать</a> class="btn btn-secondary">редактировать</a>
<a rel="nofollow" data-method="delete" <a rel="nofollow" data-method="delete"
data-confirm="Вы действительно хотите удалить?" data-confirm="Вы действительно хотите удалить?"
href="{{ route('admin-reception-screen.destroy', $file) }}" href="{{ route('files.destroy', $file) }}"
class="btn btn-danger"> class="btn btn-danger">
удалить удалить
</a> </a>
@ -58,7 +58,7 @@
</tbody> </tbody>
</table> </table>
<div class="mb-2"> <div class="mb-2">
<a href="{{ route('admin-reception-screen.create') }}" <a href="{{ route('files.create', $receptionScreen->id) }}"
class="btn btn-primary"> class="btn btn-primary">
Добавить файл Добавить файл
</a> </a>
@ -68,7 +68,8 @@
@else @else
<tr> <tr>
<td colspan="3"> <td colspan="3">
<a href="{{ route('admin-reception-screen.create') }}" class="btn btn-primary">Добавить @php($idReceptionScreen = $receptionScreen->id)
<a href="{{ route('files.create', $idReceptionScreen) }}" class="btn btn-primary">Добавить
файл</a> файл</a>
</td> </td>
</tr> </tr>
@ -78,11 +79,5 @@
</table> </table>
<br> <br>
<br> <br>
{{ Form::open(array('url' => route('uploadfile'), 'method' => 'POST', 'files'=>'true')) }}
Select the file to upload.
{{ Form::file('image') }}
{{ Form::submit('Upload File')}}
{{Form::close()}}
</div> </div>
@endsection @endsection

View File

@ -0,0 +1,79 @@
@extends('layouts.admin-layout')
@section('content')
@auth()
<div class="row">
<div class="col">
<h1 class="">Прикрепить файл</h1>
{{ Form::open(array('url' => route('files.store'), 'method' => 'POST', 'files'=>'true')) }}
<div class="mt-2">
{{ Form::label('url', 'Путь к файлу') }}
</div>
<div class="mt-2">
{{ Form::file('url', ['class' => 'form-control']) }}
</div>
<div>
@if ($errors->any())
{{ $errors->first('url') }}
@endif
</div>
<div class="mt-2">
{{ Form::label('name', 'Имя файла') }}
</div>
<div class="mt-2">
{{ Form::text('name', '', ['class' => 'form-control']) }}
</div>
<div>
@if ($errors->any())
{{ $errors->first('name') }}
@endif
</div>
<div class="mt-2">
{{ Form::label('position', 'Позиция') }}
</div>
<div class="mt-2">
{{ Form::text('position', 0, ['class' => 'form-control']) }}
</div>
<div>
@if ($errors->any())
{{ $errors->first('name') }}
@endif
</div>
<div class="mt-2">
{{ Form::label('idReceptionScreen', 'Пункт экрана приема') }}
</div>
<div class="mt-2">
{{ Form::select('idReceptionScreen', $receptionScreens, $idReceptionScreen, $idsReceptionScreens,['class' => 'form-select']) }}
</div>
<div>
@if ($errors->any())
{{ $errors->first('idReceptionScreen') }}
@endif
</div>
<div class="mt-4">
{{ Form::submit('Загрузить файл', ['class' => 'btn btn-primary'])}}
</div>
{{Form::close()}}
</div>
@if($idReceptionScreen !== null)
<div class="col">
<h2>Файлы пункта Экрана Приема: {{ $receptionScreens[$idReceptionScreen] }}</h2>
<table class="table">
<thead class="border-b-2 border-solid border-black text-left" style="text-align: left">
<tr>
<th scope="col">Позиция</th>
<th scope="col">Название</th>
</tr>
</thead>
<tbody>
@foreach($files as $file)
<tr>
<th scope="row">{{ $file->position }}</th>
<th scope="row">{{ $file->name }}</th>
@endforeach
</tbody>
</table>
</div>
@endif
</div>
@endauth
@endsection

View File

@ -0,0 +1,68 @@
@extends('layouts.admin-layout')
@section('content')
@auth()
<div class="row">
<div class="col">
<h1 class="">Изменить файл</h1>
{{ Form::open(array('url' => route('files.update', $file), 'method' => 'PATCH', 'files'=>'true')) }}
<div class="mt-2">
{{ Form::label('name', 'Имя файла') }}
</div>
<div class="mt-2">
{{ Form::text('name', $file->name, ['class' => 'form-control']) }}
</div>
<div>
@if ($errors->any())
{{ $errors->first('name') }}
@endif
</div>
<div class="mt-2">
{{ Form::label('position', 'Позиция') }}
</div>
<div class="mt-2">
{{ Form::text('position', $file->position, ['class' => 'form-control']) }}
</div>
<div>
@if ($errors->any())
{{ $errors->first('name') }}
@endif
</div>
<div class="mt-2">
{{ Form::label('idReceptionScreen', 'Пункт экрана приема') }}
</div>
<div class="mt-2">
{{ Form::select('idReceptionScreen', $receptionScreens, $idReceptionScreen, $idsReceptionScreens,['class' => 'form-select']) }}
</div>
<div>
@if ($errors->any())
{{ $errors->first('idReceptionScreen') }}
@endif
</div>
<div class="mt-4">
{{ Form::submit('Загрузить файл', ['class' => 'btn btn-primary'])}}
</div>
{{Form::close()}}
</div>
@if($idReceptionScreen !== null)
<div class="col">
<h2>Файлы пункта Экрана Приема: {{ $receptionScreens[$idReceptionScreen] }}</h2>
<table class="table">
<thead class="border-b-2 border-solid border-black text-left" style="text-align: left">
<tr>
<th scope="col">Позиция</th>
<th scope="col">Название</th>
</tr>
</thead>
<tbody>
@foreach($files as $file)
<tr>
<th scope="row">{{ $file->position }}</th>
<th scope="row">{{ $file->name }}</th>
@endforeach
</tbody>
</table>
</div>
@endif
</div>
@endauth
@endsection

View File

@ -0,0 +1,36 @@
@extends('layouts.admin-layout')
@section('content')
<div class="container">
<h2>Файлы</h2>
<br>
<a href="{{ route('files.create') }}" class="btn btn-primary">Добавить файл</a>
<br>
<br>
<table class="table">
<thead class="border-b-2 border-solid border-black text-left" style="text-align: left">
<tr>
<th scope="col">Позиция</th>
<th scope="col">Название файла</th>
<th scope="col">Экран Приема</th>
<th scope="col">действия</th>
</tr>
</thead>
<tbody>
@foreach($files as $file)
<tr>
<th scope="row">{{ $file->position }}</th>
<td>{{ $file->name }}</td>
<td>{{ $file->receptionScreen->name }}</td>
<td><a href="{{ route("files.edit", $file) }}" class="btn btn-secondary">редактировать</a>
<a rel="nofollow" data-method="delete" data-confirm="Вы действительно хотите удалить?"
href="{{ route('files.destroy', $file) }}" class="btn btn-danger">
удалить
</a>
</td>
@endforeach
</tbody>
</table>
<br>
<br>
</div>
@endsection

View File

@ -1,5 +1,6 @@
<?php <?php
use App\Http\Controllers\FileController;
use App\Http\Controllers\ReceptionScreenController; use App\Http\Controllers\ReceptionScreenController;
use App\Http\Controllers\ProfileController; use App\Http\Controllers\ProfileController;
use App\Http\Controllers\UploadFileController; use App\Http\Controllers\UploadFileController;
@ -21,10 +22,15 @@ Route::get('/', function () {
return view('home'); return view('home');
})->name('home'); })->name('home');
Route::resources([ Route::resource('/users', UserController::class)->middleware(['auth', 'verified']);
'/users' => UserController::class, Route::resource('/admin-reception-screen', ReceptionScreenController::class)->middleware(['auth', 'verified']);
'/admin-reception-screen' => ReceptionScreenController::class //Route::resource('/files', FileController::class)->middleware(['auth', 'verified']);
]); Route::get('/files', [FileController::class, 'index'])->name('files.index');
Route::post('/files', [FileController::class, 'store'])->name('files.store');
Route::get('/files/create/{file?}', [FileController::class, 'create'])->name('files.create');
Route::patch('/files/{file}', [FileController::class, 'update'])->name('files.update');
Route::delete('files/{file}', [FileController::class, 'destroy'])->name('files.destroy');
Route::get('/files/edit/{file}', [FileController::class, 'edit'])->name('files.edit');
Route::get('/course', function () { Route::get('/course', function () {
return view('menu.course'); return view('menu.course');
@ -62,7 +68,6 @@ Route::get('/video-materials-for-applicants', function () {
return view('menu.abitur.videomaterialy-dlya-postupayushchikh'); return view('menu.abitur.videomaterialy-dlya-postupayushchikh');
})->name('videomaterialy-dlya-postupayushchikh'); })->name('videomaterialy-dlya-postupayushchikh');
Route::post('/uploadfile', [UploadFileController::class, 'showUploadFile'])->name('uploadfile');
Route::get('/dashboard', function () { Route::get('/dashboard', function () {
return view('admin'); return view('admin');