Поведение кнопок будет отличаться для присоединенных / не присоединившихся пользователей - PullRequest
0 голосов
/ 30 сентября 2019

Мое приложение позволяет пользователям присоединяться к группам, если они нажимают зеленую кнопку «Присоединиться». После нажатия они должны увидеть КРАСНУЮ кнопку «unjoin».

Вот моя кнопка:

@if(Auth::user() == '')

<form method="post" action="{{ route('groups.join') }}">
@csrf
<button class="btn btn-success" type="submit">Join Group</button>
<input type="hidden" name="group_id" value="{{ $group->id }}" />
</form>

@else

<form action="{{ route('groups.destroy', $group->id)}}" method="post">
@csrf
@method('DELETE')
<button class="btn btn-sm btn-danger" type="submit">Unjoin</button>
</form>

@endif

Вышедшие из системы пользователи видят ЗЕЛЕНЫЙ и вошли в систему, видят КРАСНЫЙ, что правильно, но зарегистрированов ВСЕГДА пользователи видят красный, даже если они вступили в группу. Хммм?

Я думаю, что проблема заключается в первом утверждении if, потому что оно проверяет только зарегистрированных пользователей, когда на самом деле более неприлично проверять пользователей, присоединившихся к группе. Итак, я попробовал это:

@if(Auth::user() == 'joinedUsers')

, но он по-прежнему показывает только КРАСНУЮ кнопку, как мне изменить запрос, чтобы показать КРАСНУЮ кнопку, только если к группе присоединился пользователь?

GroupController.php

<?php

namespace App\Http\Controllers;

use App\Group;
use Illuminate\Http\Request;

// All Groups pages require login except 'show'
class GroupsController extends Controller
{

public function __construct()
{
$this->middleware('auth', ['except' => 'show']);
}

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
$groups = Group::where('created_by_user_id', auth()->id())->get();

return view('groups/index', compact('groups'));
}

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function joined()
{
//@todo change query to show groups joined
// $groups = Group::where('created_by_user_id', auth()->id())->get();
// $groups = Group::with('joinedUsers')

$groups = auth()->user()->groupsJoined()->get();

return view('groups/joined', compact('groups'));
}

/**
 * Store the group that a user has joined in storage.
 *
 * @param\Illuminate\Http\Request$request
 * @return \Illuminate\Http\Response
 */
public function join(Request $request)
{
$request->validate([
'group_id' => 'required',
]);

$group = Group::find($request->get('group_id'));
$group->joinedUsers()->attach(auth()->id());

return redirect('groups/joined')->with('success', 'You joined the group!!');
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
return view('groups.create');
}

/**
 * Store a newly created resource in storage.
 *
 * @param\Illuminate\Http\Request$request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)

{
$request->validate([
'group_title' => 'required',
'group_description' => 'required',
'group_date' => 'required',
'group_time' => 'required',
]);

$group = new Group([
'group_title' => $request->get('group_title'),
'group_description' => $request->get('group_description'),
'group_date' => $request->get('group_date'),
'group_time' => $request->get('group_time'),
]);
$group->save();
return redirect('/groups')->with('success', 'Group saved!!');
}

/**
 * Display the specified resource.
 *
 * @paramint$id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
// $group = Group::find($id);
$group = Group::with('createdByUser')->where('id', $id)->first();
return view('groups.show', compact('group'));
}

/**
 * Show the form for editing the specified resource.
 *
 * @paramint$id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
$group = Group::find($id);
return view('groups.edit', compact('group'));
}

/**
 * Update the specified resource in storage.
 *
 * @param\Illuminate\Http\Request$request
 * @paramint$id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
$request->validate([
'group_title' => 'required',
'group_description' => 'required',
'group_date' => 'required',
'group_time' => 'required',
]);

$group = Group::find($id);
$group->group_title =$request->get('group_title');
$group->group_description = $request->get('group_description');
$group->group_date = $request->get('group_date');
$group->group_time = $request->get('group_time');
$group->save();
return redirect('/groups')->with('success', 'Group updated!');
}

/**
 * Remove the specified resource from storage.
 *
 * @paramint$id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
$group = Group::find($id);
$group->delete();
return redirect('/groups')->with('success', 'Group deleted!');
}
}

User.php

     */
    public function groupsJoined()
    {
        return $this->belongsToMany(Group::class, 'group_joined_user', 'user_id', 'group_id')
            ->withTimestamps();
    }
}

1 Ответ

0 голосов
/ 30 сентября 2019

Существует несколько групп, так как вы определяете, к какой группе присоединиться с вашей формой? Может быть, форма может быть такой?

@foreach($groups as $group) {
    @if(auth()->user()->hasJoinedGroup($group))
        <form method="post" action="{{ route('groups.join', $group->id) }}">
          @csrf
          <button class="btn btn-success" type="submit">Join Group</button>
        </form>
    @else
        <form action="{{ route('groups.destroy', $group->id)}}" method="post">
            @csrf
            @method('DELETE')
            <button class="btn btn-danger" type="submit">Leave group</button>
        </form>
    @endif
    </form>
@endforeach

А в контроллере:

The join function: 
/**
 * Store the group that a user has joined in storage.
 *
 * @param\Illuminate\Http\Request$request
 * @return \Illuminate\Http\Response
 */
public function join(Request $request, $groupId)
{

$group = Group::find($groupId);
$group->joinedUsers()->attach(auth()->id());

return redirect('groups/joined')->with('success', 'You joined the group!!');
}

Аналогичным образом настраивайте другие функции, такие как unjoin & destroy. В пользовательской модели

public function hasJoinedGroup($group){
    foreach($user->joinedGroups()->all() as $joinedGroup){
        if($joinedGroup->id == $group->id){
            return true;
        }
    }
    return false;
}

В функции show () в GroupController,

public function show(){
    $groups = Group::all();
    return view('groups.show',compact('groups'))'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...