سلام وقت بخیر
من برای مسدود کردن کاربر از کد زیر استفاده کردم ومیخام وقتی وضعیت به غیرفعال تغییر کرد کاربر نتونه لاگین شه ولی موفق نمیشم
روت
Route::get('/users/status/{user}', 'User\UserController@updatestatus')->name('admin.users.status');
مدل
protected $attributes = [
'status' => 1 ,
];
کنترلر
public function updatestatus(User $user)
{
if ($user->status == 1) {
$user->status = 0;
} else {
$user->status = 1;
}
$user->save();
return redirect(route('admin.users.index'));
}
فایل بلید
@foreach($users as $user)
@switch($user->status)
@case(1)
@php
$url = route('admin.users.status',$user->id);
$status = '<a href="'.$url.'" class="badge badge-success">فعال</a>' @endphp
@break
@case(0)
@php
$url = route('admin.users.status',$user->id);
$status = '<a href="'.$url.'" class="badge badge-warning">غیر فعال</a>' @endphp
@break
@default
@endswitch
<td>{!!$status!!}</td>
برای اینکه کاربر نتونه لاگین بشه باید قبل لاگین شدن وضعیت فعال یا غیر فعال بودن کاربرو برسی کنی و فقط به کاربرای با وضعیت فعال اجازه لاگین بدی. که شما در این کدهای قرار داده شده چنین چیزی رو چک نکردی. و این کدها هم ربطی به این موضوع نداره
داخل LoginController تریتی به صورت زیر است
use AuthenticatesUsers;
داخل این تریت متدی به صورت زیر است
protected function authenticated(Request $request, $user)
{
//
}
وقتی کاربر لاگین شد به این متد فرستاده میشه.
شما میتونی وضعیت کاربرو در این متد برسی کنی که اگه فعال بود کاری بهش نداشته باشی اما اگه غیر فعال بود همون جا سری logout تش کنی.
من این روش استفاده کردم روش دیگری هم هست اما این روش برام تمیزتربود
شما این متدودو باید در LoginController بازنویس کنید به این صورت
protected function authenticated(Request $request, $user)
{
if ($user->status != 1) {
Auth()->logout();
return redirect('/');
}
}
البته میتونی شرطو به این صورت بنویسی
if (!$user->status) {
Auth()->logout();
return redirect('/');
}
اول کاربر با هر وضعیتی لاگین میکنه بعد قبل اینکه بره وارد بخشش بشه به متد بالا فرستاده میشه اونجا میتونی وضعیتشو چک کنی و در صورت غیر فعال بودن سری لاگ اوتش کنی و بفرستیش به یه روت دلخواه که من منتقلش کردم صفحه خونه. همین جا هم میتونی یه پیام براش بنویسی و در صفحه خونه بهش نشون بدی.
سلام و وقت بخیر
به نظرم کدتون یه کمی کثیف نوشته شده
اما برای اینکه بخواید اجازه ورود به کاربر مسدود شده رو ندید باید یک میدلویر تعریف کنید که وظیفه ش اینه که فیلد status کاربر لاگین کرده رو بررسی کنه. در صورتی که این فیلد 0 بود باید کاربر رو لاگاوت کنید و به صفحه لاگین هدایتش کنید یا خطای عدم امکان دسترسی بهش بدید
@hosseinshirinegad98
ممنون من این کدی که فرمودید اعمال کردم تو لاگین کنترلر فقط نمیدونم دیگه چه کاری انجام بدم که این کد اعمال بشه
کاری نمیخواد انجام بدین فقط باید تستش کنید با یه کاربر غیر فعال سعی کنید لاگین بشین.
معذرت میخوام فراموش کردم این دوتا کلاسو هم در لاگین کنترلر یوز کنید.
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
ضمن اینکه میتونی متد updatestatus به صورت زیر بنویسی
public function updatestatus(User $user)
{
$user->status = ! $user->status;
$user->save();
return redirect(route('admin.users.index'));
}
@hosseinshirinegad98
ممنونم از وقتی که گذاشتید ولی موفق نشدم به جواب برسم این کدها هم هیچ تغییری اعمال نکرد
قسمت بلیدو هم اینطوری تمیز بنویس
@foreach($users as $user)
<tr>
<td>
@if($user->status)
<span class="badge badge-success">فعال </span>
<a href="route('admin.users.status', $user->id)" class="badge badge-warning">غیر فعال </a>
@else
<span class="badge badge-warning">غیر فعال </span>
<a href="route('admin.users.status', $user->id)" class="badge badge-success">فعال</a>
@endif
</td>
</tr>
@endforeach
من وقتم آزاده مشکلی نداره.
شما باید یه فیلد در جدول users با اسم status با نوع boolean داشته باشی که فقط مقادیر 0 و 1 رو قبول کنه.
و به این هم نیاز نیست.
protected $attributes = [
'status' => 1 ,
];
اومدم تو دیتابیس تغییری که فرمودید اعمال کنم
دستور
php artisan migate:fresh که زدم این ارور نمایش داد
C:\xampp\htdocs\laravelpro>php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.07 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_11_16_015844_create_active_code
Migrated: 2020_11_16_015844_create_active_code (0.16 seconds)
Migrating: 2020_11_19_204726_create_jobs_table
Migrated: 2020_11_19_204726_create_jobs_table (0.08 seconds)
Migrating: 2020_11_21_032928_create_attributes_table
Illuminate\Database\QueryException
SQLSTATE[HY000]: General error: 1005 Can't create table `laravelpro`.`attribute_product` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `attribute_product` add constraint `attribute_product_product_id_foreign` foreign key (`product_id`) references `products` (`id`) on delete cascade)
at C:\xampp\htdocs\laravelpro\vendor\laravel\framework\src\Illuminate\Database\Connection.php:671
667| // If an exception occurs when attempting to run a query, we'll format the error
668| // message to include the bindings with SQL, which will make this exception a
669| // lot more helpful to the developer instead of just the database's errors.
670| catch (Exception $e) {
> 671| throw new QueryException(
672| $query, $this->prepareBindings($bindings), $e
673| );
674| }
675|
1 C:\xampp\htdocs\laravelpro\vendor\laravel\framework\src\Illuminate\Database\Connection.php:464
PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `laravelpro`.`attribute_product` (errno: 150 "Foreign key constraint is incorrectly formed")")
2 C:\xampp\htdocs\laravelpro\vendor\laravel\framework\src\Illuminate\Database\Connection.php:464
PDOStatement::execute()
سلام. اگر عین چیزی رو که میخواهید اعمال کنید در نظر بگیریم، یعنی "نتونه لاگین بشه" ، به نظرم بسادگی میتونید وقتی دارید status رو 0 میکنید یوزر رو از سایت logout کنید، از اونور هم موقع لاگین که رمز و پسورد چک میشه status هم چک بشه و اگر 0 بود اجازه ورود ندین و اگر خواستین در این حالت یک پیغام هم براش بذارید.
@hosseinshirinegad98
@behzad.azizan
انتقادات و نقائص احتمالی؟
@AliRezaa
سلام
آره میتونن این کارو بکنن و نقصی به نظرم نداره
اما چون یه سیاست مستقل هست و باید مستقلا چک بشه و همین طور ممکنه مثلا روت هایی رو داشته باشیم که نیازی به اعمالش نباشه (مثلا میتونه اینطوری باشه که کاربری که فعال نیست فقط بتونه به بخش آپلود مدارک دسترسی داشته باشه) برای این مورد گفتم به نظرم از طریق یه middleware چک بشه
موقع لاگین که رمز و پسورد چک میشه status هم چک بشه و اگر ۰ بود اجازه
ورود ندین و اگر خواستین در این حالت یک پیغام هم براش بذارید.
در لاراول 8 این کار سخت شده.
@AliRezaa
ترتیب اجرای مایگریشن ها اهمیت داده و برا اساس تاریخ ساختشون مایگریت میشن.
جدولی که داره به یه جدول دیگه کلید خارجی میده اون باید زودتر ایجاد بشه مایگریت بشه و گرنه ارور میده.
در این قسمت ابتدا باید جدول products قبل از جدول attribute_product مایگریت بشه. چون جدول products داره بهش کلید خارجی میده. برای اینکه جدول products قبل از جدول attribute_product مایگرت بشه. برید در نام جدول products تغییری ایجاد کنید مثلا دقت کنید اگر به تاریخ ساخت دو جدول در نامش دقت کنید میبینید که تاریخ ساخت جدول attribute_product زودتر از جدول products هست برای حل مسئله شما باید دستی تاریخ ساخت این دو جدول رو عوض کنید. تا جدول products زودتر درهنگام مایگرت , مایگریت بشه ایجاد بشه. یا تاریخ ساخت جدول products رو به قبل از تاریخ ساخت جدول attribute_product قرار بدین.
اشتباه این است که ابتدا جدول attribute_product رو ایجاد کردین
بازم عرض میکنم جدولی که قراره به یه جدول دیگه کلید خارجی بده اون باید زودتر از جدول دومی مایگریت بشه.
@hosseinshirinegad98
ممنون از شما ترتیبش و درست کردم الان برای جدول دیگه ای این مشکل به وجود اومده همه جداول رو از اول ساختم که تاریخش به ترتیب باشه ولی باز ارور دارم
از قبل بک اپ دیتابیس رو گرفتم
و مجبور شدم به صورت دستی تو دیتابی این مورد رو اعمال کنم
$table->boolean('status')->default(0);
روت
Route::get('/auth/status/{user}', 'auth\LoginController@authenticated')->name('users.status');
لاگین کنترلر
protected function authenticated(Request $request, $user)
{
// return $this->loggendin($request , $user);
if ($user->status != 0) {
Auth()->logout();
return redirect('/');
}
}
و در بلید داخل foreach قرار دادم
<td>
@if($user->status)
<span class="badge badge-success">فعال </span>
<a href="route('users.status', $user->id)" class="badge badge-warning">غیر فعال </a>
@else
<span class="badge badge-warning">غیر فعال </span>
<a href="route('users.status', $user->id)" class="badge badge-success">فعال</a>
@endif
</td>
وقتی روی دکمه غیرفعال میزنم صفحه 404 نمایش میده
روت مشکل داره ؟یا جایی از کدها ؟
ببینید این کدی که من به شما دادم
protected function authenticated(Request $request, $user)
{
// return $this->loggendin($request , $user);
if ($user->status != 0) {
Auth()->logout();
return redirect('/');
}
}
این مربوط به قسمت لاگین شدن میشه و شما به اشتباه اومدی اون دکمه و روتتو به این متد و کنترلر وصل کردی که اشتباه صددرصدی است.
این کد بالا فقط زمانی که یه کاربر بخواد لاگین بشه اجرا میشه و فقط به کاربرانی که فعال باشن اجازه ورود به سایتو میده. اما دکمه های فعال و غیر فعال کردن که در بالا تعریف کردی به این صورت است که شما در پنل ادمین تشریف داری و میخوای با زدن این دکمه ها کاربرو مسدود کنی تا نتونه وارد سایتت بشه یا اونو از حالت مسدود شدن بیرون بیاری. این دوتا قضیه رو با هم قاطی نکن.
برای اینکه وضعیت کاربرو عوض کنی باید یه کنترلر فرضا با نام UserController بسازی و یه متد داخلش ایجاد کنی فرضا با نام changeStatus و اون روتتو به این متد وصل کنی و داخلش این کدو بنویسی.
public function changeStatus (User $user)
{
$user->status = ! $user->status;
$user->save();
return redirect()->back();
}
@hosseinshirinegad98
ممنونم
باز هم وقتی تو پنل ادمین روی غیرفعال یا فعال کلیک میکنم صفحه 404 میده
به این روت میره
http://localhost:8000/admin/route('admin.users.status',%20$user-%3Eid)
و از داخل دیتابیس وقتی غبرفعال میکنم کاربر همچنان میتونه لاگین بشه
برای این چیکار باید انجام بدم
واقعا عذر میخوام ما اینجا آکولادها رو فراموش کردیم بزاریم. برا ی چاپ هر چیز باید از آکولاد در بلید استفاده بشه.
<td>
@if($user->status)
<span class="badge badge-success">فعال </span>
<a href="{{route('users.status', $user->id)}}" class="badge badge-warning">غیر فعال </a>
@else
<span class="badge badge-warning">غیر فعال </span>
<a href="{{route('users.status', $user->id)}}" class="badge badge-success">فعال</a>
@endif
</td>
بعداین لاگینو یه کاریش میکنیم ابتدا اینو تستش کن.
ما اینجا نباید مقداری که برای فعال بودن کاربر در نظر گرفتیم با مقدار غیرفعال بودنش اشتباه گرفته بشه. حس میکنم در این
protected function authenticated(Request $request, $user)
متد شرطو اشتباه نوشتم. پس اگر مقدار فیلد status برابر با 1 بود یعنی کاربر فعال است و 0 هم غیرفعال . پس زمانی که status برابر با 0 است کاربر نیاید بتونه لاگین بکنه
این متدو به این صورت شرطشو عوض کنید.
protected function authenticated(Request $request, $user)
{
// return $this->loggendin($request , $user);
if ($user->status == 0) {
Auth()->logout();
return redirect('/');
}
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟