Laravel clicking on link adds to url - laravel

Okay I have a small problem.
When user clicks on a link it goes to website/create/business which is fine however if nothing is done but the link is clicked again, it goes to website/create/business/create/business for whatever reason.
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
Profile
Add Business
<a href="{{ url('/logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" <a href="{{ url('home') }}" action="{{ url('/logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
</li>
Routes:
Route::get('profile/{user_id}', 'ProfileController#checkid');
Route::post('update', 'ProfileController#updateProfile');
Route::get('create/business', 'BusinessController#addBusiness');
Route::post('create', 'BusinessController#createBusiness');
ProfileController:
public function checkid($user_id) {
if (Auth::check())
{
$user_id = Auth::id();
return view('profile', [
'id' => $user_id
]);
}
}
function updateProfile(Request $request) {
$user = $request->user();
$twitter = $request->input('twitter');
$facebook = $request->input('facebook');
$instagram = $request->input('instagram');
$telephone = $request->input('telephone');
$user->twitter_personal = $twitter;
$user->facebook_personal = $facebook;
$user->instagram_personal = $instagram;
$user->telephone = $telephone;
$result = $user->save();
if($result) {
$message = 'success';
}else{
$message = 'error';
}
return redirect()->back()->withInput()->with('message', $message);
}
BusinessController:
function addBusiness() {
return view('addBusiness');
}
function createBusiness(Request $request) {
$name = $request->input('name');
$type = $request->input('type');
$email = $request->input('email');
$user_id = Auth::id();
$business = new Business();
$business->name = $name;
$business->type = $type;
$business->email = $email;
$business->user_id = $user_id;
$business->save();
$address1 = $request->input('address1');
$address2 = $request->input('address2');
$town = $request->input('town');
$city = $request->input('city');
$postcode = $request->input('postcode');
$telephone = $request->input('telephone');
$address = new Address();
$address->firstline_address = $address1;
$address->secondline_address = $address2;
$address->town = $town;
$address->city = $city;
$address->postcode = $postcode;
$address->telephone = $telephone;
$address->save();
$result = $business->save();
$result2 = $address->save();
$business_id = $business->id;
$address_id = $address->id;
DB::table('business_address')->insert(array('business_id' => $business_id, 'address_id' => $address_id));
DB::table('user_business')->insert(array('user_id' => $user_id, 'business_id' => $business_id));
if($result && $result2) {
$message = 'success';
}else{
$message = 'error';
}
return redirect()->back()->withInput()->with('message', $message);
}

<a href="create/business/"> must be <a href="/create/business/"> to solve this, because your current link is relative, not absolute, so when you click it again, the same reference is added at the end of your current URL.
Anyway, you should generate links in the Laravel way to avoid other issues in the future:
Route::get('create/business', 'BusinessController#addBusiness');
<a href="{{ url('create/business') }}">
or
Route::get('create/business', 'BusinessController#addBusiness')->name('createBusiness');
<a href="{{ route('createBusiness') }}">
Personally I prefer the second one, so if I change the route URL the links will still work, but it requires to add name('yourRoute') on your route definition.

Try to use the route() function. For this example: Add Business. When your route changes it is automatically changed throughout the application.
You can name your routes like this:
Route::get('create/bussiness', [
'as' => 'my_route_name',
'uses' => 'BusinessController#createBusiness'
]);

Related

Laravel: ErrorException Undefined variable: items

So i want to be able to view my cart on one of my pages. I can simply 'add to cart' and the value of the number of items in my cart will show on the top right corner of my page. When i go to click on the cart i receive this error:
ErrorException
Undefined variable: items.
I have the following code:
Cart.php:
class Cart {
public $items = null;
public $totalQty = 0;
public $totalPrice = 0;
public function __Construct($oldCart)
{
if ($oldCart) {
$this->$items = $oldCart->$items;
$this->$totalQty = $oldCart->$totalQty;
$this->$totalPrice = $oldCart->$totalPrice;
}
}
public function add($item, $id){
$storedItem = ['qty' => 0, 'price' => $item->price, 'item' => $item];
if($this->items) {
if (array_key_exists($id, $this->items)){
$storedItem = $this->items[$id];
}
}
$storedItem['qty'] ++;
$storedItem['price'] = $item->price * $storedItem['qty'];
$this->items[$id] = $storedItem;
$this->totalQty++;
$this->totalPrice += $item->price;
}
PostsController.php:
public function getCart() {
if (!Session::has('cart')) {
return view('posts.shopping-cart', ['post' => null]);
}
$oldCart = Session::get('cart');
$cart = new Cart($oldCart);
return view('posts.shopping-cart', ['post' => $cart->items, 'totalPrice'=> $cart->totalPrice]);
}
Payment.blade:
#if(Session::has('cart'))
<div class="row">
<div class="col-sm-6 col-md-6 col-md-offset-3 col-sm-0ffset-3">
<ul class="list-group">
#foreach($posts as $post)
<li class="list-group-item">
<span class="badge">{{ $post['qty']}}</span>
<strong>{{ $post['item']['title']}}</strong>
<span class="label label-success">{{$post['price']}}</span>
<div class="btn-group">
Web.api
Route::get('/shopping-cart', [ 'uses' => 'PostsController#getCart', 'as' => 'product.shoppingCart' ]);
But when i click on the my cart link that is in navbar.php:
<a class="nav-link " href="{{ route('product.shoppingCart')}}">Cart
Cart {{ Session::has('cart') ? Session::get('cart')->totalQty : ''}}
I then get the error undefined items variable
The error is on the constructor of the Cart class. You have put the dollar sign on the property names.
Just remove the dollar signs.
public function __Construct($oldCart)
{
if ($oldCart) {
$this->items = $oldCart->items;
$this->totalQty = $oldCart->totalQty;
$this->totalPrice = $oldCart->totalPrice;
}
}

Laravel - Trying to get property 'is_approved' of non-object

In my Laravel-5.8 project I have this code
Controller
public function index()
{
$userCompany = Auth::user()->company_id;
$userEmployee = Auth::user()->employee_id;
$identities = DB::table('appraisal_identity')->select('id')->where('company_id', $userCompany)->where('is_current', 1)->first();
$currentstatus = AppraisalGoal::select('is_approved')->where('employee_id', $userEmployee)->where('appraisal_identity_id', $identities->id)->first();
$goals = AppraisalGoal::where('employee_id', $userEmployee)->where('appraisal_identity_id', $identities->id)->get();
$incompleteCount = $goals->filter(function($item) {
return ($item->is_approved == 0 || $item->is_approved == 2);
})->count();
return view('appraisal.appraisal_goals.index')->with(['goals' => $goals, 'incompleteCount' => $incompleteCount])->with('currentstatus', $currentstatus);
}
View
#foreach($goals as $key => $goal)
#if(in_array($goal->is_approved, [0, 2]))
<a class="btn btn-xs btn-info" href="{{ route('appraisal.appraisal_goals.edit', ['id'=>$goal->id]) }}">
Edit
</a>
#endif
#endforeach
<div class="row no-print">
<div class="col-12">
#if ($incompleteCount)
<i class="fas fa-arrow-right"></i> Publish
#endif
</div>
</div>
What I want to achieve is that when the page is loaded Edit and Publish buttons should only be visible when is_approved is 0 or 2.
Instead of seeing this I got this error:
Trying to get property 'is_approved' of non-object
How do I resolve it?
Thank you.
it looks like your query is not returning any result.
$goals = AppraisalGoal::where('employee_id', $userEmployee)->where('appraisal_identity_id', $identities->id)->get();
You can put an extra check to avoid this error
if(count($goals)){
$incompleteCount = $goals->filter(function($item) {
return ($item->is_approved == 0 || $item->is_approved == 2);
})->count();
}
else {
$incompleteCount = 0;
}
return view('appraisal.appraisal_goals.index')->with(['goals' =>
$goals, 'incompleteCount' => $incompleteCount])->with('currentstatus', $currentstatus);

Property of non-object in laravel 4

I'm using laravel 4 and I'm getting this error when I attempt to create a menu with a dropdown
Trying to get property of non-object (View: /Applications/MAMP/htdocs/test/app/views/layouts/master.blade.php) (View: /Applications/MAMP/htdocs/test/app/views/layouts/master.blade.php)
I can't see where I'm going wrong
My master.blade.php
<li class="dropdown">
work<span class="caret"></span>
<ul class="dropdown-menu" role="menu">
#foreach($dropdowns as $dropdown)
<li>
{{ $dropdown->title }}
</li>
#endforeach
</ul>
</li>
My PageController
$currentPage = new Page($pages[0]->id);
$dropdowns = $currentPage->getPagesSelectList("parent", "", "");
return View::make('index', compact('dropdowns'));
My Page model
public function getPagesSelectList($name, $default = "", $js = "", $flag = true)
{
$list = array(
'name' => $name,
'default' => $default,
'js' => $js,
'pages' => $this->getSubPages($flag, $default)
);
return (object)$list;
}
public function getSubPages($flag, $default, $parent = 0, $num = 1)
{
$pages = array();
$pageSql = \Page::where('parent', '=', $parent)->orderBy('num', 'ASC')->get();
foreach ($pageSql as $result)
{
$page = new Page($result->id);
$page->setFromDatabase();
$page->default = $default;
$page->select = '';
if( $page->id == $default )
$page->select = $default;
$page->space = $num;
if(!empty($page))
$pages[] = $page;
$children = $page->getSubPages($flag, $default, $page->id, $num + 1);
if(!empty($children))
$pages[] = $children;
}
return array_flatten($pages);
}
Assuming that the other code works fine, in Blade instead of:
#foreach($dropdowns as $dropdown)
<li>
{{ $dropdown->title }}
</li>
#endforeach
you should use:
#foreach($dropdowns->pages as $dropdown)
<li>
{{ $dropdown->title }}
</li>
#endforeach
This is because in getPagesSelectList you assign result of getSubPages to pages index of array and then you convert array to object.

Laravel 4 - Bootstrap glyphicons

Does anybody know how can I do to put a Bootstrap glyphicon in my
{{ link_to_route('post.create', 'New' ) }}
I would like to show a glyphicon just before 'New', and I don't know how to do it.
Try this.
<a href="{{ route('post.create') }}">
<i class="glyphicon glyphicon-plus"></i>
<span>New</span>
</a>
With a helper like this one:
function icon_link_to_route($icon, $route, $title = null, $parameters = array(), $attributes = array())
{
$url = route($route, $parameters);
$title = (is_null($title)) ? $url : e($title);
$attributes = HTML::attributes($attributes);
$title = '<span class="glyphicon glyphicon-'.e($icon).'"></span>' . $title;
return '<a href="'.$url.'"'.$attributes.'>'.$title.'</a>';
}

Symfony2 send form ajax

I'm trying to submit a form via ajax to update a field of an entity, but do not know how to retrieve the data from the controller:
<form class="ajax" action="{{ path('ajax_setSocial') }}" method="post" {{ form_enctype(form) }}>
<div class="editor">
{{ form_errors(form) }}
<div class="editLabel pls">{{ form_label(form.ragSocial) }}</div>
<div class="editField">
<div class="ptm">
{{ form_widget(form.ragSocial) }} {{ form_errors(form.ragSocial) }}
</div>
{{ form_rest(form) }}
<div class="mtm">
<button class="btn btn-primary disabled save" type="submit">Save</button>
<button class="btn ann">Close</button>
</div>
</div>
</div>
var url = Routing.generate('ajax_setSociale');
var Data = $('form.ajax').serialize();
$.post(url,
Data
, function(results){
if(results.success == true) {
$(this).parents('ajaxContent').remove();
$(this).parents('.openPanel').removeClass('openPanel');
} else {
alert('False'); //test
}
});
controller (ajax_setSocial route)
public function setSocialeAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
// $id = $request->get('form'); ???
$entity = $em->getRepository('MyBusinessBundle:Anagrafic')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Anagrafic entity.');
}
$form = $this->createFormBuilder($entity)
->add('ragSocial', 'text', array('label' => 'Social'))
->add('id', 'hidden')
->getForm();
$form->bind($request);
if ($form->isValid()) {
$em->persist($entity);
$em->flush();
$output = array();
$response = new Response();
$output[] = array('success' => true);
$response->headers->set('Content-Type', 'application/json');
$response->setContent(json_encode($output));
return $response;
}
As recovery values ​​and then pass the id to create the query and the other values ​​to update the entity?
And if the fields do not pass validation, how do I pass the error?
I suggest to pass the id to the controller.
html:
<form class="ajax" action="{{ path('ajax_setSocial', { 'id': entity.id }) }}" method="post" {{ form_enctype(form) }}>
var url = "{{ path('ajax_setSocial', { 'id': entity.id }) }}";
The controller annotation, parameter, and return value, to get the id:
/**
*
* #Route("/{id}", name="ajax_setSocial")
* #Method("POST")
*/
public function setSocialeAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('MyBusinessBundle:Anagrafic')->find($id);
return array(
'entity' => $entity
);
}
Passing error back to html is like this:
// dummy line to force error:
// $form->get('ragSocial')->addError(new FormError("an error message"));
if ($form->isValid()) {
...
} else {
$errors = $form->get('ragSocial')->getErrors(); // return array of errors
$output[] = array('error' => $errors[0]->getMessage()); // the first error message
$response->headers->set('Content-Type', 'application/json');
$response->setContent(json_encode($output));
return $response;
}
I think you want this:
symfony2 chained selectors
However, this one may also be useful:
Many-to-Many Ajax Forms (Symfony2 Forms) (Answer 3)

Resources