I've run into a slight problem with my enumerated tab indices using Laravel.
I have a simple controller
public function get_login()
{
return View::make('auth.login')->with('i', 1);
}
Then in my view I'm loading two partials.
#layout('layout.master')
#section('content')
<article>
#include('layout.partials.login-form')
</article>
<aside>
#include('layout.partials.sidebar-guest')
</aside>
#endsection
The partials both have forms and are collecting the $i variable and using it like this
{{ Form::text('username', Input::old('username'), array('tabindex' => $i++)) }}
The issue is that whilst the $i variable increments fine within the partial, after the #include is completed and the next #include is loaded it does not see that the $i variable has incremented.
Is there any easy way around this?
Hi you have two option:
1) Send the $i variable from the controller:
public function get_login()
{
$i=1;
return view('auth.login')->with('i');
}
And then you use $i variable in the view
{{ Form::text('username', Input::old('username'), array('tabindex' => $i++)) }}
2) Define the $i variable in the view and use it:
Controler:
public function get_login()
{
return view('auth.login');
}
View:
#layout('layout.master')
#section('content')
#php
$i = 1;
#endphp
<article>
#include('layout.partials.login-form')
</article>
<aside>
#include('layout.partials.sidebar-guest')
</aside>
#endsection
Then you use it in each of parts of the view:
{{ Form::text('username', Input::old('username'), array('tabindex' => $i++)) }}
Good luck.
Related
I am trying to pass only the posts created by the logged in user into a laravelcollective/html select drop down menu within a form.
In my code I have two examples. Using the variable example shows how I can get the dropdown select menu to show all results from the posts table. Using the variable posts in a foreach loop shows how I can return just the posts created by the logged user, but not in a select menu.
I need to have the dropdown menu function as in the form using example but displaying results of the foreach posts loop.
Controller
public function createPost()
{
$example = Post::pluck('title', 'id')->all();
$posts = Posts::all();
return view('post.create', compact('posts', 'example'));
}
Example View
<div class="form-group">
{!! Form::label('example', 'Posts:') !!}
{!! Form::select('example', ['' => 'Select'] + $example, null) !!}
</div>
Foreach Loop Posts View
#foreach($posts as $post)
#if(Auth::user()->id == $post->user_id)
{{ $post->title }} <br>
#endif
#endforeach
try $posts = Posts::where('user_id',\Auth::id())->get()->pluck('title','');. It will return only posts of logged in user.
{{ Form::select('example', $posts) }}
You are using select box wrong.
#foreach($posts as $post)
#if(Auth::user()->id == $post->user_id)
{{ $post->title }} <br>
#endif
#endforeach
I would update your controller to only return posts by the user rather than rely on the foreach check if Auth::user()->id == $post->user_id
public function createPost()
{
$posts = Posts::where('user_id', auth()->user()->id)->get();
return view('post.create', compact('posts'));
}
As a side note, your method should probably just be create() to keep inline with the standard CRUD.
Then in your blade,
<div class="form-group">
{!! Form::label('post', 'Posts:') !!}
{!! Form::select('post', ['' => 'Select'] + $posts, null) !!}
</div>
I had problem on calling page inside Foreach Loop.Although It is Okay before I click Login, but when I'd try to login,only the html tag where loaded and foreach loop cannot... On my HomeController extends Controller
public function index()
{
return view('pages.welcome');
}
on where I call welcome page. and inside of it which is foreach loop.
<div class="row">
<div class="col-md-8">
#foreach ($posts as $post)
<div class="post">
<h3>{{ $post->title }}</h3>
<p>{{ substr($post->body, 0,300) }}
{{ strlen($post->body) > 300 ? "..." : " " }}</p>
Read More...
</div>
<hr>
#endforeach
</div>
</div>
And I think the problem is my route:
Route::get('/home', 'HomeController#index');
You haven't passed the $posts variable to the view.
Change
public function index()
{
return view('pages.welcome');
}
To something like this:
public function index()
{
$posts = \App\Post::all(); //Assuming your model is called "Post" in the App namespace
return view('pages.welcome', compact('posts'));
}
NOTE: compact('posts') is just a shortcut for ['posts'=>$posts]
i defined a route as
Route::get('roundtables/{name}/tags/store',['as'=>'tags.store','uses'=>'TagController#store','middleware'=>['owner','auth']]);
In my view, i have a form in this url
http://localhost:8000/roundtables/1/tags
<div class="col-md-3">
<div class="well">
{!! Form::open(['route'=>'tags.store','method'=>'GET']) !!}
<h2>New Tags</h2>
{{ Form::label('name','Name') }}
{{ Form::text('name',null,['class'=>'form-control']) }}
{{Form::submit('Create New Tag',['class'=>'btn btn-primary btn-block btn-h1-spacing'])}}
</div>
</div>
My problem is, how to get the id from url which is id '1' and passing into the form when user clicked submit.
My controller
public function store(Request $request,$name)
{
$this->validate($request,array('name'=>'required|max:255'));
$tag=new Tag;
$tag->name=$request->name;
$tag->roundtable_id=$name;
$tag->save();
Session::flash('success','New Tag was successfully added');
return redirect()->route('tags.index');
}
When you're using custom routes for CRUD, avoid using standard RESTful method and route names. Before building the form, you need to pass this variable to the view:
public function createTag($name)
{
....
return view('form', compact('name'));
}
Define your route as:
Route::get('roundtables/{name}/tags/storeTag',['as'=>'tags.storeTag','uses'=>'TagController#storeTag','middleware'=>['owner','auth']]);
Then pass variable to from the form:
{!! Form::open(['route' => ['tags.storeTag', $name], 'method'=>'GET']) !!}
And get it in the controller:
public function storeTag(Request $request, $name)
{
echo $name;
You get the wildcard value by using request() helper method easily.
{{request()->route('name')}}
In your TagController
public function index($name)
{
$tags= Tag::where($name)->first();
// add name parameter to return
return view('tags.index')->withTags($tags)->withName($name);
}
And in your view
<div class="col-md-3">
<div class="well">
//edit this form tag
{!! Form::open(['route'=>['tags.store',$name],'method'=>'GET']) !!}
<h2>New Tags</h2>
{{ Form::label('name','Name') }}
{{ Form::text('name',null,['class'=>'form-control']) }}
{{Form::submit('Create New Tag',['class'=>'btn btn-primary btn-block btn-h1-spacing'])}}
</div>
</div>
And in your TagController#store
public function store(Request $request,$name){
echo $name;
}
This should work.
Request::segment(2)
Or pass it from controller:
public function index($name)
{
$tags= Tag::where($name)->first();
return view('tags.index')->withTags($tags)->with('name', $name);
}
Then just pass it into the form:
{!! Form::open(['route'=>['tags.store', $name],'method'=>'GET']) !!}
How to print these type of data in laravel.I am trying to create dynamic menu and these type of problem occurs.Code is like this. my code is like this.
In view composer.
public function compose(View $view)
{
$menus = $this->menu->getDynamicMenus();
$user_role = $this->role->lists('name', 'id');
//dd($user_role);
$view->with('user_role', $user_role)->with('menus', $menus);
}
menurepository code.
public function getDynamicMenus()
{
$user = $this->auth->user();
$roles = $user->roles;
// dd($roles);
$menus = [];
foreach ($roles as $role) {
//dd($role);
foreach ($role->menus as $menu) {
if ($menu["parent_id"] > 0) {
$menus[$menu["parent_id"]][$menu["id"]] = $menu->toArray();
} else {
$menus[$menu["id"]] = $menu->toArray();
}
}
}
// dd($menus);
return $menus;
}
and i print in frontend like.
#foreach($menus as $menu)
{{-- {!! Form::open() !!}
{!! Form::select('menus',$menus) !!}
{!! Form::close() !!}--}}
{{--{!! $menuitem->menu_name !!}--}}
{!! $menu->menu_url !!}
#endforeach
and it shows problem:
Trying to get property of non-object (View: E:\xampp\htdocs\basicwc\resources\views\layouts\partials\sidebar.blade.php) (View: E:\xampp\htdocs\basicwc\resources\views\layouts\partials\sidebar.blade.php) (View: E:\xampp\htdocs\basicwc\resources\views\layouts\partials\sidebar.blade.php)
as menu are getting in array like in image.
any help??
i tried to do like:
{!! menu($menus) !!}
but it says undefined problem.
I added another menu and it's structure is like this:
Access it like an array:
#foreach($menus as $menu)
...
{{ $menu['menu_name'] }}
{{ $menu['menu_url'] }}
#endforeach
I have Images. Each image has comments, and each comment has likes. In my view I'm wanting to display the number of likes a comment has by doing something like this:
#foreach ($images as image)
<img href="$image->url">
<div class="comment-box">
#foreach ($image->comments as $comment)
<div class="comment">
<span class="comment-owner">{{ $comment->owner()->name }}</span> {{ $comment->body }}
<div class="likes">
{{ $comment->likes()->count() }} // ** HERE IS MY N+1 PROBLEM **
</div>
</div>
#endforeach
</div>
#endforeach
However now I'm fetching a query each time there is a comment. There could be hundreds of comments on a page, so id be getting hundreds of queries just to find the count() for likes.
I believe there is a way you can grab the count in a controller by doing something like
DB::raw('count(*) as like_count')
but I do not know how to implement this in my situation. Can I put this kind of thing in my model so that I can always call something like {{ $comment->likes()->like_count }}? How can I make $comment->likes->count() work without having the N+1 problem?
Here is some more code:
Media Model
class Media extends Eloquent {
public function comments()
{
return $this->hasMany('Comment');
}
}
Comment Model
class Comment extends Eloquent {
public function media()
{
return $this->belongsTo('Media');
}
public function likes()
{
return $this->hasMany('Like');
}
}
Like Model
class Like extends Eloquent {
public function comment()
{
return $this->belongsTo('Comment');
}
}
My controller
public function imageViewer($id)
{
$images = Media::with(['comments' => function($query) {
$query->with('likes');
}])->where('resource_id', $id)->simplePaginate(1);
return View::make('image-viewer', compact('images'));
}
Why don't you just use blade's count like this count($comment->likes) assuming that $comment->likes gets the list of likes for a comment
#foreach ($images as image)
<img href="$image->url">
<div class="comment-box">
#foreach ($image->comments as $comment)
<div class="comment">
<span class="comment-owner">{{ $comment->owner()->name }}</span> {{ $comment->body }}
<div class="likes">
{{ count($comment->likes) }}
</div>
</div>
#endforeach
</div>
#endforeach
Thanks to #lukasgeiter for pointing out a mistake in the comments