Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Всем привет! Laravel 5.7
Предыстория: у меня на главной странице есть кнопка, нажав на неё открывается окно с формой:
<form action="{{ route('home::number', $item->id_auto ?? "") }}" method="post">
{{ csrf_field() }}
<label for="">Логин</label>
<input class="form-control" type="text" name="login " value="{{ $item->login ?? "" }}"
placeholder="Введите свой логин" required=""><br>
<label for="">Ваш id</label>
<input class="form-control" type="text" name="id_auto " value="{{ $item->id_auto ?? "" }}" readonly="">
<br>
<label for="">Ваш пароль</label>
<input class="form-control" type="text" name="password_auto " value="{{ $item->password_auto ?? '' }}" readonly="">
<br>
<hr/>
<input class="btn btn-danger w-100" type="submit" value="Перейти">
</form>
Чего бы я хотел: я бы хотел, чтобы нажав на кнопку открытия формы id и пароль уже были автоматически сгенерированы и показаны клиенту.
Как мне это сделать?
Я пробовал сделать функцию генерации в моделях, но она срабатывает только после отправления данных на сервер, т. е. вводить как бы ничего не нужно, поля оставляешь пустыми и потом в личном кабинете смотришь пароль и id. Пробовал создать и подключить новый файл с генерацией, но, чтобы он сработал, нужно сделать кнопку "Сгенерировать" под полем. Это, конечно, тоже не плохо, но я бы хотел, чтобы нажав на кнопку, далее никуда не надо было тыкать, уже был виден свой пароль и свой id.
P. s. для данного вопроса, вряд ли нужно предоставлять контроллеры и модели, поэтому сначала без них, но если будет нужно я мигом)
P. s. s. для тех, кто не телепат, я вроде ясно объяснил, чего я хочу))
Окей, спасибо!
Хорошо, спасибо за ответ! А насчет 2 вопроса не подскажете?
Laravel 5.4
В общем, если коротко: устроился джуном, дали чужой проект, сказали привести в порядок авторизацию для админов. Уже 2 дня пробую исправить авторизацию на сайте и не могу сдвинутся с мертвой точки, пишу-пишу, пробую-пробую, в итоге либо ошибки, либо ничего не меняется. Пожалуйста, взгляните на код, может у вас быстро появятся идеи и вы сможете мне помочь иди подтолкнуть к решению. Спасибо!
Вопроса два:
1) При выходе с аккаунта (logout), сессия не заканчивается и браузерной стрелочкой "назад" можно вернуться в админ-панель и продолжить что-то делать.
2) Т. к. это админ-панель требуется сделать проверку на роль пользователя в системе, роль должна быть больше 1, казалось бы проще некуда, но я пытался много раз поставить условие, в итоге глухо. Вероятнее всего подводит моя логика, т. к. я джун.
Вот вырезка из контроллера DashboardController, где авторизация и выход:
public function auth(Request $request)
{
$error = 1;
$users = DB::table('users')->where('email', $request->login)->where('status', 0)->first();
if (!is_null($users)) {
if ($users->password == md5($request->password)) {
session(['b2b.auth.isActive' => true, 'b2b.auth.name' => $users->fio, 'b2b.auth.id' => $users->id]);
return redirect()->route('admin::home');
} else return view('admin.auth.login', array('error' => $error));
} else return view('admin.auth.login', array('error' => $error));
}
public function logout(Request $request)
{
$request->session()->flush();
return redirect()->route('admin::auth::view');
}
Вот маршруты web.php:
//Авторизация
Route::get('/admin/auth', function (){
return view('admin.auth.login');
});
Route::name('admin::')->prefix('admin')->group(function(){
//Авторизация
Route::name('auth::')->prefix('auth')->group(function(){
Route::name('view')->get('view', 'Admin\DashboardController@auth');
Route::name('act')->post('act', 'Admin\DashboardController@auth');
Route::name('logout')->get('logout', 'Admin\DashboardController@logout');
});
Это вырезка из шаблона админки, где можно выйти из аккаунта:
<ul class="nav navbar navbar-top-links navbar-right mbn">
<li class="dropdown topbar-user"><a data-hover="dropdown" href="#" class="dropdown-toggle"><img
src="https://s3.amazonaws.com/uifaces/faces/twitter/kolage/48.jpg" alt=""
class="img-responsive img-circle"/> <span
class="hidden-xs">{{ $name or '' }} </span> <span
class="caret"></span></a>
<ul class="dropdown-menu dropdown-user pull-right">
<li><a href="{{route('admin::auth::logout') }}"
onclick="event.preventDefault(); document.getElementById('logout-form').submit();"><i
class="fa fa-key"></i> {{ __('Выйти') }}</a></li>
</ul>
</li>
</ul>
<form id="logout-form" action="{{route('admin::auth::logout')}}" method="GET" style="display: none;">
{{ csrf_field() }}
</form>
А это модель Users:
protected $table = 'users';
protected $fillable = [
'role',
'email',
'password',
'company_name',
'status',
'id_client',
'fio',
'more',
'telephone'
];
public $timestamps = true;
public static function isActive()
{
return session('auth.isActive');
}
public static function getName()
{
return session('name');
}
public static function getId()
{
return session('id');
}
public static function getReservCount()
{
return DB::table('temp_reserv')->where('id_users', self::getId())->count();
}
public static function getRole()
{
$id = self::getId();
$id_client = DB::table('users')->where('id', $id)->first();
return !is_null($id_client) ? $id_client->role : 0;
}
public static function b2b_isActive()
{
return session('b2b.auth.isActive');
}
public static function b2b_getName()
{
return session('b2b.name');
}
public static function b2b_getId()
{
return session('b2b.id');
}
public static function b2b_getRole()
{
$id = self::b2b_getId();
$id_client = DB::table('users')->where('id', $id)->first();
return $id_client->role;
Ответ:
Убрать цикл в файле about. Удалить dashboards в контроллере и вместо:
'dashboard' => []
написать:
'dashboard' => Dashboard::find(2)
для about страницы, т. к. id инфы которую мне нужно вытащить из БД = 2.
Я, сразу говорю, новичок. Может я уже загнался, может капец как сильно туплю, но ситуация становится патовой, так что help me) Laravel 5.4
Короче, вот роуты (web.php)
Route::name('admin::')->prefix('admin')->group(function(){
//Авторизация
Route::name('auth::')->prefix('auth')->group(function(){
Route::name('view')->get('view', 'Admin\DashboardController@auth');
Route::name('act')->post('act', 'Admin\DashboardController@auth');
Route::name('logout')->get('logout', 'Admin\DashboardController@logout');
});
Route::name('home')->get('home', 'Admin\DashboardController@home');
Route::name('content::')->prefix('content')->group(function(){
Route::name('page::')->prefix('page')->group(function(){
Route::name('list')->get('list', 'Admin\DashboardController@list');
Route::name('about')->get('about', 'Admin\DashboardController@about');
Метод в контроллере (DashboardController@about)
public function about()
{
return view('upgr.static.about', [
'dashboards' => Dashboard::orderBy('id')->paginate(16),
'dashboard' => [],
'delimiter' => ''
]);
}
Сам файл about
@section('content')
<main>
<div class="container">
<ol class="breadcrumbs">
<li class="breadcrumbs-item"><a href="/">Главная</a></li>
@forelse($dashboards as $dashboard)
<li class="breadcrumbs-item">{{ $dashboard->name }}</li>
</ol>
</div>
<div class="container">
<h1>{{ $dashboard->title }}</h1>
<p>{!! $dashboard->description !!}</p>
<img src="{{ $dashboard->image }}" alt="{{ $dashboard->name}}" class="img-responsive">
@empty
<h2>Скоро здесь появиться информация, пожалуйста подождите.</h2>
@endforelse
</div>
</main>
@endsection
При таком раскладе у меня на сайте само собой выводятся все данные из бд
Сори все, кому глаза режет мой вопрос)
По моим предположениям вместо цикла нужно поставить условие и поменять первую строку в контроллере, но что я не пытался сделать - не выходит.
Вопрос в том как мне сделать так, чтобы на вкладке "О компании" выводились данные где id = 2, на "Контакты" где id = 3 и т. д. ?
Проблема: {{$message->title or ""}}
Решение: {{$message->title ?? ""}}
Про переменную да, затупил. Вот я указал путь. Ошибка типа "неизвестная переменная" уже не возникает. А
Trying to get property 'title' of non-object
так и осталась.
Еще раз мои исходники с исправлениями/дополнениями:
Модель Laravel/app/Message.php :
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class Message extends Model
{
protected $fillable = [
'title',
'slug',
'parent_id',
'published',
'created_by',
'modified_by'
];
// Mutators
public function setSlugAttribute($value)
{
$this->attributes['slug'] = Str::slug(mb_substr($this->attributes['title'], 0, 40) . "-" . \Carbon\Carbon::now()->format('dmyHi'), '-');
}
public function children() {
return $this->hasMany(self::class, 'parent_id');
}
}
Контроллер Laravel/app/Http/Controllers/Admin/MessageController.php :
<?php
namespace App\Http\Controllers\Admin;
use App\Message;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class MessageController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('admin.messages.index', [
'messages' => Message::paginate(16)
]);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('admin.messages.create', [
'message' => [],
'messages' => Message::with('children')->where('parent_id', '0')->get(),
'delimiter' => ''
]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
Message::create($request->all());
return redirect()->route('admin.messages.index'); // ВАЖНО s
}
/**
* Display the specified resource.
*
* @param \App\Message $message
* @return \Illuminate\Http\Response
*/
public function show(Message $message)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Message $message
* @return \Illuminate\Http\Response
*/
public function edit(Message $message)
{
return view('admin.messages.edit', [
'message' => $message,
'delimiter' => ''
]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Message $message
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Message $message)
{
$message->update($request->except('slug'));
return redirect()->route('admin.message.index');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Message $message
* @return \Illuminate\Http\Response
*/
public function destroy(Message $message)
{
$message->delete();
return redirect()->route('admin.message.index');
}
}
Установление переменной Laravel/resources/views/admin/messages/partials/messages.blade.php :
@foreach ($messages as $message_list)
<option value="{{$message_list->id or ""}}"
@isset($message->id)
@if ($message->parent_id == $message_list->id)
selected=""
@endif
@if ($message->id == $message_list->id)
hidden=""
@endif
@endisset
>
{!! $delimiter or "" !!}{{$message_list->title or ""}}
</option>
@if (count($message_list->children) > 0)
@include('admin.messages.partials.messages', [
'messages' => $message_list->children,
'delimiter' => ' - ' . $delimiter
])
@endif
@endforeach
В этом файле @include из файла messeges и в нем же ошибка возникает Laravel/resources/views/admin/messages/partials/form.blade.php :
@include('admin.messages.partials.messages', ['messages' => $messages])
<label for="">Статус</label>
<select class="form-control" name="published">
@if (isset($message->id))
<option value="0" @if ($message->published == 0) selected="" @endif>Не опубликовано</option>
<option value="1" @if ($message->published == 1) selected="" @endif>Опубликовано</option>
@else
<option value="0">Не опубликовано</option>
<option value="1">Опубликовано</option>
@endif
</select>
<label for="">Наименование</label>
<input type="text" class="form-control" name="title" placeholder="Заголовок категории" value="{{$message->title or ""}}" required>
<label for="">Slug</label>
<input class="form-control" type="text" name="slug" placeholder="Автоматическая генерация" value="{{$message->slug or ""}}" readonly="">
<label for="">Родительская категория</label>
<select class="form-control" name="parent_id">
<option value="0">-- без родительской категории --</option>
</select>
<hr />
<input class="btn btn-dark" type="submit" value="Сохранить">
@include из файла form, в котором возникает ошибка Laravel/resources/views/admin/messages/create.blade.php :
@extends('admin.layouts.layout_adm')
@section('content')
<form action="{{route('admin.message.store')}}" class="form-horizontal" method="post">
{{ csrf_field() }}
{{-- Form iclude --}}
@include('admin.messages.partials.form')
</form>
@endsection
Сори, что в элементарное не вникаю. Опыт в MVC и Laravel еще маловат.
Столкнулся с ошибкой:
Trying to get property 'title' of non-object
(View: home/vagrant/projects/Laravel/resources/views/admin/messages/partials/form.blade.php) (View: /home/vagrant/projects/Laravel/resources/views/admin/messages/partials/form.blade.php)
Вот содержимое файла в котором ошибка: Laravel/resources/views/admin/messages/partials/form.blade.php:
<label for="">Заголовок</label>
<input type="text" class="form-control" name="title" placeholder="Заголовок" value="{{$message->title or ""}}" required>
<label for="">Описание</label>
<input type="text" class="form-control" name="text" value="{{$message->slug or ""}}" required>
<input type="button" class="button" name="" value="Опубликовать">
Если убрать
{{$message->title or ""}}
, и заменить допустим на простое абвгд, то все работает, страница загружается.
Вот контроллер Laravel/app/Http/Controllers/Admin/MessageController.php :
namespace App\Http\Controllers\Admin;
use App\Message;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class MessageController extends Controller
{
public function index()
{
return view('admin.messages.index', [
'messages' => Message::paginate(16)
]);
}
public function create()
{
return view('admin.messages.create', [
'message' => [],
'delimiter' => ''
]);
}
public function store(Request $request)
{
Message::create($request->all());
return redirect()->route('admin.message.index'); // ВАЖНО s
}
public function show(Message $message)
{
//
}
public function edit(Message $message)
{
return view('admin.messages.edit', [
'message' => $message,
'delimiter' => ''
]);
}
public function update(Request $request, Message $message)
{
$message->update($request->except('slug'));
return redirect()->route('admin.message.index');
}
public function destroy(Message $message)
{
$message->delete();
return redirect()->route('admin.message.index');
}
}
Модель Laravel/app/Message.php:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class Message extends Model
{
protected $fillable = ['title', 'slug', 'parent_id', 'published', 'created_by', 'modified_by'];
// Mutators
public function setSlugAttribute($value)
{
$this->attributes['slug'] = Str::slug(mb_substr($this->title, 0, 40) . "-" . \Carbon\Carbon::now()->format('dmyHi'), '-');
}
}
}
Вопрос: как решить эту проблему в моем случае?