how profiles can be updated
This commit is contained in:
parent
5b6bbc6883
commit
9b23a1beba
81
app/Http/Controllers/ProfileController.php
Normal file
81
app/Http/Controllers/ProfileController.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
use Intervention\Image\ImageManager;
|
||||
use Intervention\Image\Drivers\Gd\Driver;
|
||||
|
||||
use App\Models\User;
|
||||
|
||||
class ProfileController extends Controller
|
||||
{
|
||||
public function show (User $user)
|
||||
{
|
||||
return view ("users.profile", compact ("user"));
|
||||
}
|
||||
|
||||
public function edit ()
|
||||
{
|
||||
if (!auth ()->check ()) {
|
||||
return redirect ()->route ("login");
|
||||
}
|
||||
|
||||
$user = auth ()->user ();
|
||||
|
||||
return view ("users.edit", compact ("user"));
|
||||
}
|
||||
|
||||
public function update (Request $request)
|
||||
{
|
||||
if (!auth ()->check ()) {
|
||||
return redirect ()->route ("login");
|
||||
}
|
||||
|
||||
$incoming_fields = $request->validate ([
|
||||
"avatar" => "image|max:4096",
|
||||
"bio" => "sometimes|nullable|string",
|
||||
"general" => "sometimes|nullable|string",
|
||||
"music" => "sometimes|nullable|string",
|
||||
"movies" => "sometimes|nullable|string",
|
||||
"television" => "sometimes|nullable|string",
|
||||
"books" => "sometimes|nullable|string",
|
||||
"heroes" => "sometimes|nullable|string"
|
||||
]);
|
||||
|
||||
$user = auth ()->user ();
|
||||
$fname = $user->id . "-" . uniqid () . ".jpg";
|
||||
|
||||
$changing_avatar = false;
|
||||
if (isset ($incoming_fields["avatar"]) && !empty ($incoming_fields["avatar"]))
|
||||
{
|
||||
$manager = new ImageManager (new Driver ());
|
||||
$image = $manager->read ($request->file ("avatar"));
|
||||
$image_data = $image->cover (256, 256)->toJpeg ();
|
||||
Storage::disk ("public")->put ("avatars/" . $fname, $image_data);
|
||||
|
||||
$old_avatar = $user->avatar;
|
||||
$user->avatar = $fname;
|
||||
|
||||
$changing_avatar = true;
|
||||
}
|
||||
|
||||
$user->bio = $incoming_fields["bio"];
|
||||
$user->interests_general = $incoming_fields["general"];
|
||||
$user->interests_music = $incoming_fields["music"];
|
||||
$user->interests_movies = $incoming_fields["movies"];
|
||||
$user->interests_television = $incoming_fields["television"];
|
||||
$user->interests_books = $incoming_fields["books"];
|
||||
$user->interests_heroes = $incoming_fields["heroes"];
|
||||
$user->save ();
|
||||
|
||||
if ($changing_avatar)
|
||||
{
|
||||
Storage::disk ("public")->delete (str_replace ("/storage/", "", $old_avatar));
|
||||
}
|
||||
|
||||
return back ()->with ("success", "Profile updated successfully!");
|
||||
}
|
||||
}
|
@ -55,9 +55,4 @@ class UserController extends Controller
|
||||
|
||||
return redirect ()->route ("login")->with ("success", "You have successfuly logged out!");
|
||||
}
|
||||
|
||||
public function show (User $user)
|
||||
{
|
||||
return view ("users.profile", compact ("user"));
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"intervention/image": "^3.10",
|
||||
"laravel/framework": "^11.31",
|
||||
"laravel/tinker": "^2.9"
|
||||
},
|
||||
|
146
composer.lock
generated
146
composer.lock
generated
@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "626b9e7ddd47fb7eff9aaa53cce0c9ad",
|
||||
"content-hash": "64b78dd438697d218ce81a8ea6afcbb3",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
@ -1054,6 +1054,150 @@
|
||||
],
|
||||
"time": "2023-12-03T19:50:20+00:00"
|
||||
},
|
||||
{
|
||||
"name": "intervention/gif",
|
||||
"version": "4.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Intervention/gif.git",
|
||||
"reference": "42c131a31b93c440ad49061b599fa218f06f93be"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Intervention/gif/zipball/42c131a31b93c440ad49061b599fa218f06f93be",
|
||||
"reference": "42c131a31b93c440ad49061b599fa218f06f93be",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^1",
|
||||
"phpunit/phpunit": "^10.0",
|
||||
"slevomat/coding-standard": "~8.0",
|
||||
"squizlabs/php_codesniffer": "^3.8"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Intervention\\Gif\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Oliver Vogel",
|
||||
"email": "oliver@intervention.io",
|
||||
"homepage": "https://intervention.io/"
|
||||
}
|
||||
],
|
||||
"description": "Native PHP GIF Encoder/Decoder",
|
||||
"homepage": "https://github.com/intervention/gif",
|
||||
"keywords": [
|
||||
"animation",
|
||||
"gd",
|
||||
"gif",
|
||||
"image"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/Intervention/gif/issues",
|
||||
"source": "https://github.com/Intervention/gif/tree/4.2.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://paypal.me/interventionio",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/Intervention",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://ko-fi.com/interventionphp",
|
||||
"type": "ko_fi"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-20T13:35:02+00:00"
|
||||
},
|
||||
{
|
||||
"name": "intervention/image",
|
||||
"version": "3.10.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Intervention/image.git",
|
||||
"reference": "1ddc9a096b3a641958515700e09be910bf03a5bd"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Intervention/image/zipball/1ddc9a096b3a641958515700e09be910bf03a5bd",
|
||||
"reference": "1ddc9a096b3a641958515700e09be910bf03a5bd",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-mbstring": "*",
|
||||
"intervention/gif": "^4.2",
|
||||
"php": "^8.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"mockery/mockery": "^1.6",
|
||||
"phpstan/phpstan": "^2",
|
||||
"phpunit/phpunit": "^10.0 || ^11.0",
|
||||
"slevomat/coding-standard": "~8.0",
|
||||
"squizlabs/php_codesniffer": "^3.8"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-exif": "Recommended to be able to read EXIF data properly."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Intervention\\Image\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Oliver Vogel",
|
||||
"email": "oliver@intervention.io",
|
||||
"homepage": "https://intervention.io/"
|
||||
}
|
||||
],
|
||||
"description": "PHP image manipulation",
|
||||
"homepage": "https://image.intervention.io/",
|
||||
"keywords": [
|
||||
"gd",
|
||||
"image",
|
||||
"imagick",
|
||||
"resize",
|
||||
"thumbnail",
|
||||
"watermark"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/Intervention/image/issues",
|
||||
"source": "https://github.com/Intervention/image/tree/3.10.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://paypal.me/interventionio",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/Intervention",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://ko-fi.com/interventionphp",
|
||||
"type": "ko_fi"
|
||||
}
|
||||
],
|
||||
"time": "2024-12-21T07:41:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "laravel/framework",
|
||||
"version": "v11.36.1",
|
||||
|
@ -15,11 +15,11 @@
|
||||
<div class="inner">
|
||||
@foreach ($latest_users as $user)
|
||||
<div class="person">
|
||||
<a href="#">
|
||||
<a href="{{ route ('users.show', [ 'user' => $user ]) }}">
|
||||
<p>{{ $user->name }}</p>
|
||||
</a>
|
||||
<a href="#">
|
||||
<img src="{{ $user->avatar }}" alt="{{ $user->name }}'s profile picture"
|
||||
<img loading="lazy" src="{{ $user->avatar }}" alt="{{ $user->name }}'s profile picture"
|
||||
class="pfp-fallback" style="width: 100%; max-height: 95px; aspect-ratio: 1/1">
|
||||
</a>
|
||||
</div>
|
||||
|
97
resources/views/users/edit.blade.php
Normal file
97
resources/views/users/edit.blade.php
Normal file
@ -0,0 +1,97 @@
|
||||
@extends('partials.layout')
|
||||
|
||||
@section('title', 'Edit profile')
|
||||
|
||||
@section('content')
|
||||
<div class="row edit-profile">
|
||||
<div class="col w-20 left"></div>
|
||||
|
||||
<div class="col right">
|
||||
<h1>Edit profile</h1>
|
||||
<p>All fields are optional and can be left empty</p>
|
||||
<a href="{{ route ('users.show', [ 'user' => $user ]) }}">« View Profile</a>
|
||||
|
||||
<div class="profile-pic">
|
||||
<h1>{{ $user->name }}</h1>
|
||||
<br>
|
||||
<img src="{{ $user->avatar }}" alt="{{ $user->name }}" width="180" height="auto">
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<h1>Profile Picture & Song:</h1>
|
||||
<br>
|
||||
<form action="{{ route ('users.edit') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<small>Select photo:</small>
|
||||
<input type="file" name="avatar" accept="image/*"><br>
|
||||
@error("avatar")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<small>Max file size: 4MB (jpg/png/gif)</small>
|
||||
<br>
|
||||
<h1>Bio:</h1>
|
||||
<br>
|
||||
<textarea name="bio" id="bio" cols="58" placeholder="Bio">{{ $user->bio }}</textarea>
|
||||
@error("bio")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<br>
|
||||
<small>max limit: 256 characters</small>
|
||||
<br>
|
||||
<h1>Interests:</h1>
|
||||
<br>
|
||||
<label for="general">General:</label>
|
||||
<input type="text" name="general" id="general" value="{{ $user->interests_general ? $user->interests_general : '' }}">
|
||||
@error("general")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<br>
|
||||
<br>
|
||||
<label for="music">Music:</label>
|
||||
<input type="text" name="music" id="" value="{{ $user->interests_music ? $user->interests_music : '' }}">
|
||||
@error("music")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<br>
|
||||
<br>
|
||||
<label for="movies">Movies:</label>
|
||||
<input type="text" name="movies" id="movies" value="{{ $user->interests_movies ? $user->interests_movies : '' }}">
|
||||
@error("movies")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<br>
|
||||
<br>
|
||||
<label for="television">Television:</label>
|
||||
<input type="text" name="television" id="television" value="{{ $user->interests_television ? $user->interests_television : '' }}">
|
||||
@error("television")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<br>
|
||||
<br>
|
||||
<label for="books">Books:</label>
|
||||
<input type="text" name="books" id="books" value="{{ $user->interests_books ? $user->interests_books : '' }}">
|
||||
@error("books")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<br>
|
||||
<br>
|
||||
<label for="heroes">Heroes:</label>
|
||||
<input type="text" name="heroes" id="heroes" value="{{ $user->interests_heroes ? $user->interests_heroes : '' }}">
|
||||
@error("heroes")
|
||||
<p class="error">{{ $message }}</p>
|
||||
@enderror
|
||||
<br>
|
||||
<h1>Layout:</h1>
|
||||
<small>
|
||||
what you would normally paste into the 'Blurbs' section. Include HTML tags.
|
||||
</small>
|
||||
<br>
|
||||
<textarea name="layout" id="layout" cols="58" placeholder="Layout" disabled></textarea>
|
||||
<br>
|
||||
<input type="submit" value="Save">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
@ -99,9 +99,9 @@
|
||||
|
||||
<div class="url-info">
|
||||
<p>
|
||||
<b>OurSpace URL:</b>
|
||||
<b>Federation handle:</b>
|
||||
</p>
|
||||
<p>{{ route ('users.show', [ 'user' => $user ]) }}</p>
|
||||
<p>@php echo "@" . $user->name . "@" . explode ("/", env ("APP_URL"))[2] @endphp</p>
|
||||
</div>
|
||||
|
||||
<div class="table-section">
|
||||
@ -177,7 +177,7 @@
|
||||
@if (auth()->user()->is($user))
|
||||
<div class="profile-info">
|
||||
<h3>
|
||||
<a href="#">Edit Your Profile</a>
|
||||
<a href="{{ route ('users.edit') }}">Edit Your Profile</a>
|
||||
</h3>
|
||||
</div>
|
||||
@endif
|
||||
|
@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Route;
|
||||
|
||||
use App\Http\Controllers\HomeController;
|
||||
use App\Http\Controllers\UserController;
|
||||
use App\Http\Controllers\ProfileController;
|
||||
|
||||
Route::get('/', [ HomeController::class, "home" ])->name ("home");
|
||||
|
||||
@ -14,6 +15,8 @@ Route::get ("/auth/logout", [ UserController::class, "logout" ])->name ("logout"
|
||||
Route::post ("/auth/signup", [ UserController::class, "do_signup" ])->middleware ("guest");
|
||||
Route::post ("/auth/login", [ UserController::class, "do_login" ])->middleware ("guest");
|
||||
|
||||
Route::get ("/user/{user:name}", [ UserController::class, "show" ])->name ("users.show");
|
||||
Route::get ("/user/edit", [ ProfileController::class, "edit" ])->name ("users.edit")->middleware ("auth");
|
||||
Route::post ("/user/edit", [ ProfileController::class, "update" ])->middleware ("auth");
|
||||
Route::get ("/user/{user:name}", [ ProfileController::class, "show" ])->name ("users.show");
|
||||
|
||||
require __DIR__ . "/api.php";
|
||||
|
Loading…
x
Reference in New Issue
Block a user