How to fix "Undefined variable: collaborators"?

John

I am developing collaborators adding methods to my project management application. this is my collaborators add form. colllaborators/form.blade.php

<div class="col-md-4" style="border:1px solid #ccc;margin-left:15px;padding:10px;">
        <h4 class="page-header">
            Collaborators
        </h4>
        @if( $collaborators)
           @foreach( $collaborators as $collaborator)
                <div>
                    <div>
                        <span>
                            <img src="{{ $collaborator->user()->first()->getAvatarUrl() }}" />
                        </span>
                    </div>
                    <button class="btn btn-sm btn-danger delete" style="margin-top:5px;padding:4px;width:35px;"
                      data-action="/projects/{{ $project->id }}/collaborators/{{ $collaborator->collaborator_id }}"

routes

Route::post('projects/{projects}/collaborators', [
    'uses' => 'Project\Collaborators\Controller@addCollaborator',
    'as'   => 'projects.collaborators.create',
    'middleware' => ['auth']
]);

but when I click to collaborators adding buttons following error messages displayed.

Undefined variable: collaborators (View: C:\Users\Flex\Desktop\ddd\resources\views\collaborators\form.blade.php)

how can I fix this problem edited

class ProjectCollaboratorsController extends Controller
{

    public function addCollaborator(Request $request, $id, Collaboration $collaboration)
    {
       $this->validate($request, [
            'collaborator'     => 'required|min:5',
        ]);

       $collaborator_username           = substr(trim($request->input('collaborator')),1);
       $collaboration->project_id       = $id;
       if( is_null($this->getId($collaborator_username)))
       {
            return redirect()->back()->with('warning', 'This user does not exist');
       }

       $collaborator = $this->isCollaborator($id, $this->getId($collaborator_username));
       if(! is_null($collaboration))
       {
            return redirect()->back()->with('warning', 'This user is already a collaborator on this project');
       }

       $collaboration->collaborator_id  = $this->getId($collaborator_username);
       $collaboration->save();

       return redirect()->back()->with('info', "{$collaborator_username} has been added to your project successfully");
    }

    private function getId($username)
    {
        $result = User::where('username', $username)->first();

        return (is_null($result)) ? null : $result->id;
    }


    private function isCollaborator($projectId, $collaboratorId)
    {
        return Collaboration::where('project_id', $projectId)
                            ->where('collaborator_id', $collaboratorId)
                            ->first();
    }

}

see My other part of the form

<form class="form-vertical" role="form" method="post" action="{{ route('projects.collaborators.create', $project->id) }}">

collaborator form route

Route::get('/collaborators', function(){ 
   return view('collaborators.form'); 
})->name('collaborators.form');
Norris Oduro

In your form page, you are checking @if( $collaborators) which checks if the $collaborators variable is not empty and then runs the foreach below it.

After you submit your form, you add the collaborator and redirect back with no collaborators. The if condition then tries to check if the variable is empty. At this point the variable has not been defined and hence it throws that error. To fix this error, return redirect back with the collaborators like this:

 public function addCollaborator(Request $request, $id, Collaboration $collaboration)
    {
       $this->validate($request, [
            'collaborator'     => 'required|min:5',
        ]);

       $collaborator_username           = substr(trim($request->input('collaborator')),1);
       $collaboration->project_id       = $id;
       if( is_null($this->getId($collaborator_username)))
       {
            return redirect()->back()->with('warning', 'This user does not exist');
       }

       $collaborator = $this->isCollaborator($id, $this->getId($collaborator_username));
       if(! is_null($collaboration))
       {
            return redirect()->back()->with('warning', 'This user is already a collaborator on this project');
       }

       $collaboration->collaborator_id  = $this->getId($collaborator_username);
       $collaboration->save();
//Get all collaborators 
  $collaborators = Collaboration::all(); //if this is how you get all collaborators
//Get the project too
 $project = Project::findOrFail($id);
       return redirect()->back()->with(['collaborators'=>$collaborators,'project'=>$project,'info'=> "{$collaborator_username} has been added to your project successfully"]);
    }

EDIT:

Using the with method puts the data in the session, i would suggest that you manually redirect to the view and flash the message to that view.

public function addCollaborator(Request $request, $id, Collaboration $collaboration)
        {
           $this->validate($request, [
                'collaborator'     => 'required|min:5',
            ]);

           $collaborator_username           = substr(trim($request->input('collaborator')),1);
           $collaboration->project_id       = $id;
           if( is_null($this->getId($collaborator_username)))
           {
                return redirect()->back()->with('warning', 'This user does not exist');
           }

           $collaborator = $this->isCollaborator($id, $this->getId($collaborator_username));
           if(! is_null($collaboration))
           {
                return redirect()->back()->with('warning', 'This user is already a collaborator on this project');
           }

           $collaboration->collaborator_id  = $this->getId($collaborator_username);
           $collaboration->save();
    //Get all collaborators 
      $collaborators = Collaboration::all(); //if this is how you get all collaborators
     //Get the project too
       $project = Project::findOrFail($id);
           return redirect()->route('collaborators.form',['collaborators'=>$collaborators,'project'=>$project])->with('info',"{$collaborator_username} has been added to your project successfully");
        }

Edit 2

I have changed all the return redirect()->back()'s

public function addCollaborator(Request $request, $id, Collaboration $collaboration)
    {
       $this->validate($request, [
            'collaborator'     => 'required|min:5',
        ]);

       $collaborator_username           = substr(trim($request->input('collaborator')),1);
       $collaboration->project_id       = $id;

       //Get the project too
       $project = Project::findOrFail($id);

       if( is_null($this->getId($collaborator_username)))
       {
            return redirect()->route('collaborators.form',['project'=>$project])->with('warning', 'This user does not exist');
       }

       $collaborator = $this->isCollaborator($id, $this->getId($collaborator_username));
       if(! is_null($collaboration))
       {
            return redirect()->route('collaborators.form',['project'=>$project])->with('warning', 'This user is already a collaborator on this project');
       }

       $collaboration->collaborator_id  = $this->getId($collaborator_username);
       $collaboration->save();

       return redirect()->route('collaborators.form',['project'=>$project])->with('info',"{$collaborator_username} has been added to your project successfully");
    }

And change your routes to

Route::get('/project/{project}/collaborators', function($id){ 
       $collaborators = Collaboration::all();
       $project = Project::findOrFail($id);
       return view('collaborators.form',compact('collaborators','project')); 
    })->name('collaborators.form');

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related