Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Laravel 5.x » Автоматическая генерация полей формы » 30.10.2018 10:20:46

Sepol
Ответов: 1

Всем привет! 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. для тех, кто не телепат, я вроде ясно объяснил, чего я хочу))

#3 Re: Laravel 5.x » Проблема с авторизацией на сайте. » 15.10.2018 15:40:19

Хорошо, спасибо за ответ! А насчет 2 вопроса не подскажете?

#4 Laravel 5.x » Проблема с авторизацией на сайте. » 15.10.2018 13:20:47

Sepol
Ответов: 4

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"/>&nbsp;<span
                                    class="hidden-xs">{{ $name or '' }} </span>&nbsp;<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;

#5 Re: Laravel 5.x » Как вывести конкретный элемент массива в laravel? » 10.10.2018 15:23:34

Ответ:

Убрать цикл в файле about. Удалить dashboards в контроллере и вместо:

'dashboard' => []

написать:

'dashboard' => Dashboard::find(2)

для about страницы, т. к. id инфы которую мне нужно вытащить из БД = 2.

#6 Laravel 5.x » Как вывести конкретный элемент массива в laravel? » 10.10.2018 10:25:24

Sepol
Ответов: 5

Я, сразу говорю, новичок. Может я уже загнался, может капец как сильно туплю, но ситуация становится патовой, так что 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 и т. д. ?

#7 Re: Laravel 5.x » Ошибка -Trying to get property 'title' of non-object » 18.09.2018 14:24:44

Проблема:  {{$message->title or ""}}
Решение:    {{$message->title ?? ""}}

#8 Re: Laravel 5.x » Ошибка -Trying to get property 'title' of non-object » 17.09.2018 15:46:50

Про переменную да, затупил. Вот я указал путь. Ошибка типа "неизвестная переменная" уже не возникает. А

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 еще маловат.

#9 Laravel 5.x » Ошибка -Trying to get property 'title' of non-object » 17.09.2018 12:25:24

Sepol
Ответов: 6

Столкнулся с ошибкой:

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'), '-');
    }

}


}

Вопрос: как решить эту проблему в моем случае?

Подвал раздела