Symfony: pass parameter to Ajax url - php

I am trying to figure out how to enable/disable user with checkbox without page reload.
index.html.twig
<table>
<thead>
<tr>
<th>UserName</th>
<th>Enabled</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<td><a href="{{ path('user_show', {'id': user.id}) }}">
{{ user.username }}</a>
</td>
<td><input id="user_enable_{{ user.id }}" onclick="enabledChange({{ user.id }})"
type="checkbox" {% if user.enabled %}checked{% endif %}/>
</td>
{% endfor %}
</tbody>
</table>
<script>
var changePath = {{ path('user_enable_change', {'id': user.id}) }};
function enabledChange(id)
{
var value = $(this).val();
console.log('value: ' + value);
$.ajax({
type: "POST",
url: changePath,
async: true,
data: { },
success: function () {
console.log('success');
}
});
}
</script>
UserController
/**
* #Route("/enable/{id}", name="user_enable_change")
*/
public function userDisableAction(User $user) {
if($user->isEnabled()){
$user->setEnabled(false);
}else {
$user->setEnabled(true);
}
try {
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
}
catch(\Exception $e) {
return new JsonResponse('error');
}
return new JsonResponse('success');
}
Question
How can I set corresponding user id to enabledChange function and change checked state depending on user state?

You need to add quotes to your variables, and pass changePath as an argument:
onclick="enabledChange('{{ user.id }}', '{{ path('user_enable_change', {'id': user.id}) }}')"
then:
function enabledChange(id, changePath) {
var value = $(this).val();
console.log('value: ' + value);
$.ajax({
type: "POST",
url: changePath,
async: true,
data: { },
success: function () {
console.log('success');
}
});
}
I hope this will help.

Another clean way of doing this is by passing parameters and routes via data attributes and accessing the button by class. In my example I had to increase product quantity without refreshing:
<button class="btn btn-sm btn-info increase"
data-id="{{ p.id }}"
data-url="{{ path('cart_add', {'pid': p.id}) }}">
Increase qty
</button>
$(document).ready(function() {
$(".increase").click(function (e) {
var value = $(this).data('id');
console.log('value: ' + value);
$.ajax({
type: "POST",
url: $(this).data('url'),
async: true,
data: {},
success: function () {
console.log('success increment');
}
});
});
});

Related

symfony jquery he changes me the last element

Hi everyone I come to you because I have a small problem, I create a dynamic comments system in ajax and I would like to edit each comment except that when I do it it changes me the last and not the element clicked
I've missed that things that I think
I have not tried anything yet I do not see how to do it
My code :
js:
$('#edit-comments').hide();
$('#add-comments').on('click', function (e) {
e.preventDefault();
$.ajax({
url: $(this).attr('action'),
type: 'POST',
data: $('#formsComments').serialize(),
dataType: 'json',
success: function (data) {
$('#comments_commentsContent').val('');
$('#content-comments').append(data.content);
},
error: function (data) {
console.log(data);
if(data.status === 500) {
$('#errors-comments').html('<div class="error">Vous n\'avez pas ajouté de commentaires\n</div>')
}
}
});
});
$('.comments-content').on('click', function (e) {
e.preventDefault();
$('#add-comments').hide();
$('#edit-comments').show();
var idEdit = $(this).attr('id');
var idContent = idEdit.split('-');
var res = $('p#comments-content-'+idContent[2]).text();
console.log(idContent);
$('#comments_commentsContent').val(res);
$('#edit-comments').on('click', function (e) {
e.preventDefault();
$.ajax({
url: '/article/commentaires/'+idContent[2]+'/edit/'+idContent[3],
type: 'POST',
data: $('#formsComments').serialize(),
dataType: 'json',
success: function (data) {
console.log(data);
$('#comments_commentsContent').val('');
$('#add-comments').show();
$('#edit-comments').hide();
$('#comments-content-'+idContent[2]).html(data.content.message);
},
error: function (data) {
console.log(data);
}
});
});
});
My view twig :
{% for comment in article.comments %}
<div class="media" id="media">
<div class="media-body">
<div class="media-heading">
<h4>{{ comment.userComments.username }}</h4>
<span class="time">{{ comment.createdAt | date("d/m/Y à H:i") }}</span>
{% if app.user %}
{% if comment.userComments.id == app.user.id %}
<a href="{{ path('front_article_edit_comments', {'id': comment.id, 'user': comment.userComments.id}) }}#comments" class="comments-content" id="edit-comments-{{ comment.id }}-{{ comment.userComments.id }}" >
<i class="fa fa-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% endif %}
{% if is_granted('ROLE_ADMIN') %}
<a href="{{ path('front_article_delete_comments', {'id': comment.id}) }}#comments" onclick="return confirm('Vous voulez vous vraiment supprimer ce commenaitre ?');">
<i style="padding-left: 10px; color: #CBBBA3;" class="fa fa-times" aria-hidden="true"></i>
</a>
{% endif %}
</div>
<p id="comments-content-{{ comment.id }}">{{ comment.commentsContent|nl2br }}</p>
</div>
</div>
{% endfor %}
new comments :
if($request->isXmlHttpRequest() && $form->isValid()) {
$user = $this->getUser();
$comments->setUserComments($user);
$comments->setArticleComments($articles);
$em->persist($comments);
$em->flush();
$html = $this->renderView('articles/comments.html.twig', ['comment' => $comments]);
return $this->json(['content' => $html]);
}
edit comments :
if($request->isXmlHttpRequest() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->flush();
return $this->json(['content' => [
'message' => $comments->getCommentsContent(),
'user' => $comments->getUserComments()->getId(),
'id-comments' => $comments->getId(),
]]);
}
When I want to edit the first comment or the second it does not work.

PHP Laravel : Delete Data using Ajax

I want to delete some data from database using ajax.. I've done the following steps to run..But while I was trying to delete it's shows following Error:
Failed to load resource: the server responded with a status of 404
(Not Found)
Here is my route:
Route::post('/delete/{id}',[
'uses'=>'ItemController#delete',
'as' => 'delete'
]);
Here is the controller:
public function delete($id)
{
Item::find($id)->delete();
return Redirect::back();
}
And here is my view page:
<html>
<head>
<title> Item List</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<div class="container">
<h3> List Of Courses </h3></br>
<table class="table table-striped table-bordered dataTable" id="example">
<thead>
<tr>
<td>Serial No</td>
<td>Title</td>
<td>Description</td>
<td>Action</td>
</tr>
</thead>
<tbody>
<?php $i=1; ?>
#foreach($items as $row)
<tr>
<td>{{$i}}</td>
<td>{{$row->title }}</td>
<td>{{$row->description}}</td>
<td>
<button type="button" onclick="deleteItem({{ $row->id }})" id="Reco" class="btn btn-danger">Delete</button>
</td>
</tr>
<?php $i++; ?>
#endforeach
</tbody>
</table>
</div>
<script>
function deleteItem(id) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
type: "POST",
url: '/delete/'+id,
success: function(result) {
console.log(result);
}
});
}
</script>
</body>
</html>
If anyone find the error I've done, hope you'll help me to find it out.
Generally passing parameter while deleting is not a good idea. since we can delete the data through url e.g /delete/4 while you may want to delete only after clicking the delete button.
$.ajax({
type: "POST",
url: "{{url('/delete)}}",
data:{id:id}
success: function(result) {
console.log(result);
}
});
route:
Route::post('/delete',[
'uses'=>'ItemController#delete',
'as' => 'delete'
]);
and, the controller
public function delete(Request $request)
{
$id=$request->id;
Item::where(['id'=>$id])->delete();
return Redirect::back();
}
Try this code:
function deleteItem(id) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
type: "POST",
url:"{{url('delete')}}",
data:{id:id},
success: function(result) {
location.reload();
}
});
}
try this code
function deleteItem(id) {
var _token = $("input[name='_token']").val();
$.ajax({
type: "POST",
url: '/task/'+id,
data: '_method=DELETE&_token=' + _token,
success: function (result) {
console.log(result);
}
});
}
Try this:
$.ajax({
type: "POST",
url: url('/delete'), // The correct way to call ajax function in laravel
data:{
id: id
},
success: function(result) {
console.log(result);
}
});
You can set a method destroy in your controller which laravel automatically uses for deleting. It accepts id.
public function destroy($id){
Item::find($id)->delete();
echo 'Deleted Successfully.';
}
for ajax just send a method delete with your token.
jQuery.ajax({
url:'your-controller-route/id',
type: 'post',
data: {_method: 'delete', _token :token},
success:function(msg){
// do stuff
}
});

How to Select Custom line AJAX in Laravel

My problem is that when I delete a line we can only do I delete a row and jQuery practice for other lines will not be executed.
<script>
$('#destroy').on('click', function (e) {
e.preventDefault();
var token = $('input[name="_token"]').attr('value');
var id = $('#destroy').data("id");
$.ajax(
{
url: "{{ url('/category') }}" + '/' + id + '/delete',
type: 'post',
dataType: "JSON",
data: {"id": id, '_token': token},
success: function (data) {
alert(data.msg)
}
});
console.log("It failed");
});
</script>
line:
<tr id="destroy_">
<td>
<a id="destroy" data-id="{{$cat->id}}" href="#">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</a>
</td>
<td>
<a href="{{action('categoryController#update',[$cat->id])}}">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</a>
</td>
<td>
<a href="{{action('categoryController#show', [$cat->id])}}">
{{$cat->category}}
</a>
</td>
<th class="text-right">{{$cat->id}}</th>
</tr>
Using ID's for actions that are repeated in a table is a bad idea if you don't name them dynamically. Either way I suggest using anything other than an ID, for example a custom data attribute. So use this for your delete links:
<a data-delete data-id="{{$cat->id}}" href="#">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</a>
And in your JS code instead of #destroy you can now use the following selector to match them:
$(document).on('click', '[data-delete]', function (e) {
e.preventDefault();
var token = $('input[name="_token"]').attr('value');
var id = $(this).data("id");
$.ajax(
{
url: "{{ url('/category') }}" + '/' + id + '/delete',
type: 'post',
dataType: "JSON",
data: {"id": id, '_token': token},
success: function (data) {
alert(data.msg)
},
error: function () {
// Also the failed request should be handled here
// not below the ajax call because it's asynchronous
console.log("It failed");
}
});
});

Symfony delete ajax

I have a problem when I want delete a register with Ajax and Symfony, in template Twig.
<tbody>
{% for entity in entities %}
<tr>
<td>
<a class="delete btn btn-danger btn-xs glyphicon glyphicon-trash" data-playgroup-id="{{ entity.id }}" ></a>
</td>
</tr>
{% endfor %}
</tbody>
Ajax:
$(document).ready(function() {
$(".delete").click(function(){
var pid = $(this).attr("data-playgroup-id");
bootbox.confirm("Are you sure?", function(result) {
if(result){
$.ajax({
url: '{{path('playergroup_delete', { 'id': pid}) }}',
type: 'delete',
success: function(result) {
console.log('Delete');
},
error: function(e){
console.log(e.responseText);
}
});
}
});
});
});
I receive the next error:
Variable "pid" does not exists.
Thanks!
As MouradK say you ar passing a variable in a twig function (server side) and you are getting this variable using javascript (client side).
to solve this do something like this :
$(document).ready(function() {
$(".delete").click(function(){
var pid = $(this).attr("data-playgroup-id");
bootbox.confirm("Are you sure?", function(result) {
url = '{{path('playergroup_delete', { 'id': 0}) }}';
url = $url.replace("0",pid);
if(result){
$.ajax({
url: url,
type: 'delete',
success: function(result) {
console.log('Delete');
},
error: function(e){
console.log(e.responseText);
}
});
}
});
});
});
It means that you did not pass the pid variable to your Twig template.
Pass it trough the controller and you'll be fine
The error is :
You are trying to set a variable comming from the client (javascript) in your twig template (which is a server side).

how to show laravel blade code in ajax

in my index.balde.php
{{ Form::open(['url'=>'/crm/promotion/multi_destroy', 'method'=>'POST', 'id'=>'form_delete_all','class'=>'form-horizontal']) }}
#foreach ($promotions as $promotion)
<tr class="odd gradeX data-table-item">
<td><input type="checkbox" class="multidel" name="multidel_{{$promotion->id}}"></td>
<td>{{$promotion->name}}</td>
<td>{{$promotion->i_name}}</td>
<td>{{ substr($promotion->descr, 0, 100)}}...</td>
<td>{{$promotion->start}}</td>
<td>{{$promotion->end}}</td>
<td>
#if(isset(Session::get('permissions')[$module]))
{{ Render::tableButtons(Session::get('permissions')[$module], $actions['table'] ,array("[ID]" => $promotion->id), array() ) }}
#endif
</td>
</tr>
#endforeach
{{Form::close()}}
when one action change i will show by
if($('#ed').val()!="" && $('#sd').val()=="")
{
$.ajax({
type: "GET",
dataType: "json",
url: '/crm/promotion/promotion_search_end',
data:'end='+$('#ed').val(),
beforeSend: function(){
},
success: function (data)
{
//$('.data-table-item').html('');
$('.data-table-item').empty();
console.log(data);
$.each(data, function(index, item_data)
{
//console.log(item_data.id);
$('#data-table').footable();
$('#data-table').append('<tr class="odd gradeX data-table-item"><td><input type="checkbox" class="multidel" name="multidel_'+item_data.id+'"></td><td>'+item_data.name+'</td><td>'+item_data.i_name+'</td><td>'+item_data.descr+'</td><td>'+item_data.start+'</td><td>'+item_data.end+'</td><td></td></tr>');
});
},
complete: function(){
// do the following after success is done.
},
error: function(){
// do the following if there is error.
}
});
}
I want to use in ajax. How can i use?
#if(isset(Session::get('permissions')[$module]))
{{ Render::tableButtons(Session::get('permissions')[$module], $actions['table'] ,array("[ID]" => $promotion->id), array() ) }}
#endif
You can use laravel blade code in javascript. In your case, you can use like the following
<script>
#if(isset(Session::get('permissions')[$module]))
var value = {{ Render::tableButtons(Session::get('permissions')[$module], $actions['table'] ,array("[ID]" => $promotion->id), array() ) }}
alert(value);
#endif
</script>

Categories