git add .
git commit "add profile image upload support"
This commit is contained in:
@@ -26,9 +26,9 @@ class RegisterController extends Controller
|
|||||||
{
|
{
|
||||||
$inputs = $request->validated();
|
$inputs = $request->validated();
|
||||||
|
|
||||||
if ($request->hasFile('image')) {
|
if ($request->hasFile('profile_image')) {
|
||||||
|
|
||||||
$image = $request->file('image');
|
$image = $request->file('profile_image');
|
||||||
|
|
||||||
$imageName = time() . '.' . $image->getClientOriginalExtension();
|
$imageName = time() . '.' . $image->getClientOriginalExtension();
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ class RegisterController extends Controller
|
|||||||
$imageName
|
$imageName
|
||||||
);
|
);
|
||||||
|
|
||||||
$inputs['image'] = $imageName;
|
$inputs['profile_image'] = $imageName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,4 +7,16 @@ use Illuminate\Http\Request;
|
|||||||
class FavoriteController extends Controller
|
class FavoriteController extends Controller
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public function store()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public function destroy()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,19 +3,54 @@
|
|||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Http\Requests\ProfileUpdateRequest;
|
use App\Http\Requests\ProfileUpdateRequest;
|
||||||
|
use App\Models\User;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
|
||||||
class ProfileController extends Controller
|
class ProfileController extends Controller
|
||||||
{
|
{
|
||||||
public function edite()
|
public function edite()
|
||||||
{
|
{
|
||||||
|
$withoutHero=true;
|
||||||
$user=Auth::User();
|
$user=Auth::User();
|
||||||
return view('users.profile.edit',compact('user'));
|
return view('users.profile.edit',compact('user','withoutHero'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function update(ProfileUpdateRequest $request)
|
public function update(ProfileUpdateRequest $request)
|
||||||
{
|
{
|
||||||
|
$user=$request->user();
|
||||||
|
$inputs=$request->validated();
|
||||||
|
|
||||||
|
if (!empty($inputs['new_password'])){
|
||||||
|
$user->password=Hash::make($inputs['new_password']);
|
||||||
|
}
|
||||||
|
|
||||||
|
unset(
|
||||||
|
$inputs['current_password'],
|
||||||
|
$inputs['new_password'],
|
||||||
|
$inputs['new_password_confirmation'],
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($request->hasFile('profile_image')) {
|
||||||
|
|
||||||
|
$image = $request->file('profile_image');
|
||||||
|
|
||||||
|
$imageName = time() . '.' . $image->getClientOriginalExtension();
|
||||||
|
|
||||||
|
$image->move(
|
||||||
|
public_path('uploads/users'),
|
||||||
|
$imageName
|
||||||
|
);
|
||||||
|
|
||||||
|
$inputs['profile_image'] = $imageName;
|
||||||
|
}
|
||||||
|
$user->update($inputs);
|
||||||
|
|
||||||
|
return back()->with([
|
||||||
|
'success','اطلاعات کاربر با موفقیت ویرایش شد.'
|
||||||
|
]);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ namespace App\Http\Requests;
|
|||||||
|
|
||||||
use Illuminate\Contracts\Validation\ValidationRule;
|
use Illuminate\Contracts\Validation\ValidationRule;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class ProfileUpdateRequest extends FormRequest
|
class ProfileUpdateRequest extends FormRequest
|
||||||
{
|
{
|
||||||
@@ -12,7 +13,7 @@ class ProfileUpdateRequest extends FormRequest
|
|||||||
*/
|
*/
|
||||||
public function authorize(): bool
|
public function authorize(): bool
|
||||||
{
|
{
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -22,7 +23,110 @@ class ProfileUpdateRequest extends FormRequest
|
|||||||
*/
|
*/
|
||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
|
$user = auth()->user();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'first_name' => [
|
||||||
|
'required',
|
||||||
|
'persian_alpha',
|
||||||
|
'string',
|
||||||
|
'max:255'
|
||||||
|
],
|
||||||
|
|
||||||
|
'last_name' => [
|
||||||
|
'required',
|
||||||
|
'persian_alpha',
|
||||||
|
'string',
|
||||||
|
'max:255'
|
||||||
|
],
|
||||||
|
|
||||||
|
'national_code' => [
|
||||||
|
'required',
|
||||||
|
'ir_national_id',
|
||||||
|
Rule::unique('users', 'national_code')
|
||||||
|
->ignore($user->id),
|
||||||
|
],
|
||||||
|
|
||||||
|
'gender' => [
|
||||||
|
'required',
|
||||||
|
'in:0,1'
|
||||||
|
],
|
||||||
|
|
||||||
|
'marital_status' => [
|
||||||
|
'required',
|
||||||
|
'in:0,1,2'
|
||||||
|
],
|
||||||
|
|
||||||
|
'spouse_name' => [
|
||||||
|
'nullable',
|
||||||
|
'string',
|
||||||
|
'persian_alpha',
|
||||||
|
'max:255',
|
||||||
|
'required_if:marital_status,1',
|
||||||
|
],
|
||||||
|
|
||||||
|
'mobile' => [
|
||||||
|
'required',
|
||||||
|
'ir_mobile',
|
||||||
|
Rule::unique('users','mobile')
|
||||||
|
->ignore($user->id)
|
||||||
|
],
|
||||||
|
|
||||||
|
'email' => [
|
||||||
|
'required',
|
||||||
|
'email',
|
||||||
|
Rule::unique('users','email')
|
||||||
|
->ignore($user->id)
|
||||||
|
],
|
||||||
|
|
||||||
|
'username' => [
|
||||||
|
'required',
|
||||||
|
'string',
|
||||||
|
'regex:/^[A-Za-z0-9]+$/',
|
||||||
|
Rule::unique('users','username')->ignore($user->id)
|
||||||
|
],
|
||||||
|
'profile_image' => [
|
||||||
|
'nullable',
|
||||||
|
'image',
|
||||||
|
'mimes:jpg,jpeg,png,webp',
|
||||||
|
'max:800',
|
||||||
|
],
|
||||||
|
|
||||||
|
'province_id' => [
|
||||||
|
'nullable',
|
||||||
|
'exists:provinces,id',
|
||||||
|
],
|
||||||
|
|
||||||
|
'city_id' => [
|
||||||
|
'nullable',
|
||||||
|
Rule::exists('cities', 'id')
|
||||||
|
->where(fn ($query) => $query->where('province_id', $this->province_id)),
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
'password' => [
|
||||||
|
'required',
|
||||||
|
'confirmed',
|
||||||
|
'min:8'
|
||||||
|
],
|
||||||
|
'current_password' => [
|
||||||
|
'required_with:new_password',
|
||||||
|
'current_password:web',
|
||||||
|
],
|
||||||
|
|
||||||
|
'new_password' => [
|
||||||
|
'nullable',
|
||||||
|
'string',
|
||||||
|
'min:8',
|
||||||
|
'confirmed',
|
||||||
|
],
|
||||||
|
|
||||||
|
'new_password_confirmation' => [
|
||||||
|
'nullable',
|
||||||
|
'string',
|
||||||
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class RegisterPostRequest extends FormRequest
|
|||||||
'national_code' => [
|
'national_code' => [
|
||||||
'required',
|
'required',
|
||||||
'unique:users,national_code',
|
'unique:users,national_code',
|
||||||
// 'ir_national_id'
|
'ir_national_id'
|
||||||
],
|
],
|
||||||
|
|
||||||
'gender' => [
|
'gender' => [
|
||||||
@@ -75,7 +75,7 @@ class RegisterPostRequest extends FormRequest
|
|||||||
'unique:users,username',
|
'unique:users,username',
|
||||||
'regex:/^[A-Za-z0-9]+$/',
|
'regex:/^[A-Za-z0-9]+$/',
|
||||||
],
|
],
|
||||||
'image' => [
|
'profile_image' => [
|
||||||
'nullable',
|
'nullable',
|
||||||
'image',
|
'image',
|
||||||
'mimes:jpg,jpeg,png,webp',
|
'mimes:jpg,jpeg,png,webp',
|
||||||
|
|||||||
@@ -346,7 +346,7 @@
|
|||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
|
|
||||||
<label
|
<label
|
||||||
for="image"
|
for="profile_image"
|
||||||
class="block text-sm/6 font-medium text-gray-500 dark:text-gray-300"
|
class="block text-sm/6 font-medium text-gray-500 dark:text-gray-300"
|
||||||
>
|
>
|
||||||
تصویر پروفایل
|
تصویر پروفایل
|
||||||
@@ -356,15 +356,15 @@
|
|||||||
|
|
||||||
<input
|
<input
|
||||||
type="file"
|
type="file"
|
||||||
id="image"
|
id="profile_image"
|
||||||
name="image"
|
name="profile_image"
|
||||||
accept=".jpg,.jpeg,.png,.webp"
|
accept=".jpg,.jpeg,.png,.webp"
|
||||||
class="block w-full p-3 text-base outline-none text-gray-800 dark:text-gray-100 dark:bg-gray-900 bg-slate-100 border border-transparent rounded-md"
|
class="block w-full p-3 text-base outline-none text-gray-800 dark:text-gray-100 dark:bg-gray-900 bg-slate-100 border border-transparent rounded-md"
|
||||||
>
|
>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@error('image')
|
@error('profile_image')
|
||||||
<span class="text-red-500 text-sm">
|
<span class="text-red-500 text-sm">
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<!-- index.html 07:26:20 -->
|
<!-- index.html 07:26:20 -->
|
||||||
<head>
|
<head>
|
||||||
<title>قالب رزرواسیون</title>
|
<title>airline_agency</title>
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
<link rel="stylesheet" href="{{asset('assets/css/font-awesome.css')}}"/>
|
<link rel="stylesheet" href="{{asset('assets/css/font-awesome.css')}}"/>
|
||||||
@@ -15,9 +15,9 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
@includeUnless(isset($withoutHeader),'layouts.header')
|
@includeUnless(isset($withoutHeader),'layouts.header')
|
||||||
@includeUnless(isset($withoutHeader),'layouts.hero')
|
@includeUnless(isset($withoutHero),'layouts.hero')
|
||||||
@yield('content')
|
@yield('content')
|
||||||
@includeUnless(isset($withoutHeader),'layouts.footer')
|
@includeUnless(isset($withoutFooter),'layouts.footer')
|
||||||
<script src="{{asset('assets/js/moment.js')}}"></script>
|
<script src="{{asset('assets/js/moment.js')}}"></script>
|
||||||
<script src="{{asset('assets/js/bootstrap.js')}}"></script>
|
<script src="{{asset('assets/js/bootstrap.js')}}"></script>
|
||||||
<script src="{{asset('assets/js/owl-carousel.js')}}"></script>
|
<script src="{{asset('assets/js/owl-carousel.js')}}"></script>
|
||||||
|
|||||||
@@ -1049,15 +1049,10 @@
|
|||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<a href="#">
|
<a href="{{route('users.profile.edit')}}">
|
||||||
پروفایل
|
پروفایل
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="#">
|
|
||||||
تغییر رمز عبور
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<a href="#">
|
<a href="#">
|
||||||
|
|||||||
@@ -1,3 +1,231 @@
|
|||||||
<div>
|
@extends('layouts.app')
|
||||||
<!-- It is never too late to be what you might have been. - George Eliot -->
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<div class="theme-page-section _pt-100">
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="col-md-6 col-md-offset-3">
|
||||||
|
|
||||||
|
<div class="theme-login theme-login-white">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="theme-login-header">
|
||||||
|
|
||||||
|
<h1 class="theme-login-title">
|
||||||
|
ویرایش پروفایل
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="theme-login-subtitle">
|
||||||
|
اطلاعات حساب کاربری خود را ویرایش کنید
|
||||||
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="theme-login-box">
|
||||||
|
|
||||||
|
<div class="theme-login-box-inner">
|
||||||
|
|
||||||
|
|
||||||
|
<form
|
||||||
|
action="{{ route('users.profile.update') }}"
|
||||||
|
method="POST"
|
||||||
|
enctype="multipart/form-data"
|
||||||
|
class="theme-login-form"
|
||||||
|
>
|
||||||
|
|
||||||
|
@csrf
|
||||||
|
@method('PUT')
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label>
|
||||||
|
نام
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="first_name"
|
||||||
|
value="{{ old('first_name', $user->first_name) }}"
|
||||||
|
class="form-control"
|
||||||
|
>
|
||||||
|
|
||||||
|
@error('first_name')
|
||||||
|
<span class="text-danger">
|
||||||
|
{{ $message }}
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label>
|
||||||
|
نام خانوادگی
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="last_name"
|
||||||
|
value="{{ old('last_name', $user->last_name) }}"
|
||||||
|
class="form-control"
|
||||||
|
>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label>
|
||||||
|
شماره موبایل
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="mobile"
|
||||||
|
value="{{ old('mobile', $user->mobile) }}"
|
||||||
|
class="form-control"
|
||||||
|
>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label>
|
||||||
|
ایمیل
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
name="email"
|
||||||
|
value="{{ old('email', $user->email) }}"
|
||||||
|
class="form-control"
|
||||||
|
>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label
|
||||||
|
for="profile_image"
|
||||||
|
class="block text-sm/6 font-medium text-gray-500 dark:text-gray-300"
|
||||||
|
>
|
||||||
|
تصویر پروفایل
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="mt-3">
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id="profile_image"
|
||||||
|
name="profile_image"
|
||||||
|
accept=".jpg,.jpeg,.png,.webp"
|
||||||
|
class="block w-full p-3 text-base outline-none text-gray-800 dark:text-gray-100 dark:bg-gray-900 bg-slate-100 border border-transparent rounded-md"
|
||||||
|
>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@error('profile_image')
|
||||||
|
<span class="text-red-500 text-sm">
|
||||||
|
{{ $message }}
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
|
||||||
|
<h4>
|
||||||
|
تغییر رمز عبور
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label>
|
||||||
|
رمز عبور فعلی
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
name="current_password"
|
||||||
|
class="form-control"
|
||||||
|
>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label>
|
||||||
|
رمز عبور جدید
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
name="new_password"
|
||||||
|
class="form-control"
|
||||||
|
>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
|
||||||
|
<label>
|
||||||
|
تکرار رمز جدید
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
name="new_password_confirmation"
|
||||||
|
class="form-control"
|
||||||
|
>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="submit-btn"
|
||||||
|
>
|
||||||
|
ذخیره تغییرات
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Http\Controllers\DashboardController;
|
use App\Http\Controllers\DashboardController;
|
||||||
|
use App\Http\Controllers\FavoriteController;
|
||||||
use App\Http\Controllers\HomeController;
|
use App\Http\Controllers\HomeController;
|
||||||
use App\Http\Controllers\ProfileController;
|
use App\Http\Controllers\ProfileController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
@@ -15,4 +16,9 @@ Route::prefix('users')->name('users.')->middleware('auth:web')->group(function (
|
|||||||
Route::get('/profile/edit',[ProfileController::class,'edite'])->name('profile.edit');
|
Route::get('/profile/edit',[ProfileController::class,'edite'])->name('profile.edit');
|
||||||
Route::put('/profile/update',[ProfileController::class,'update'])->name('profile.update');
|
Route::put('/profile/update',[ProfileController::class,'update'])->name('profile.update');
|
||||||
|
|
||||||
|
Route::get('/favorite',[FavoriteController::class,'create'])->name('favorite.create');
|
||||||
|
Route::post('favorite',[FavoriteController::class,'store'])->name('favorite.store');
|
||||||
|
|
||||||
|
Route::delete('/favorite/{favorite}',[FavoriteController::class,'destroy'])->name('favorite.destroy');
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user