Slt, je suis dans la partie administration de mon site. J'ai un tableau qui me liste mes articles et dans ce tableau j'ai une colonne publication avec checkbox checked si publication = true sinon unchecked. J'aimerais mettre a jour la table avec de l'ajax suivant qu'il coche ou décoche. Mon problème c'est que je récupére seulement la valeur de la premiere ligne du tableau c'est comme si la seconde ligne est lié à la valeur de la premiere ligne.
<td>
{#<form action="{{ path('adminArticle_updatePublish', {'id' : entity.id }) }}" method="get">#}
{% if entity.publication == true %}
<input id="check" name="etat" type="checkbox" value="1" checked="checked">
{% else %}
<input id="check" name="etat" type="checkbox" value="0">
{% endif %}
{#</form>#}
</td>
Et mon traitement:
<script src="{{ asset('assets/js/jquery-1.9.1.min.js') }}"></script>
<script type="text/javascript">
$("input[type='checkbox']").change(function () {
//alert($('#check').val());
if($('#check').is(":checked")){
var val = 1;
alert(val);
}else{
var val1 = 0;
alert(val1);
}
});
</script>
Bon mon problème était en fait mon routing il m'a fallu faire un router:debug pour m'en rendre compte. Voici la soluce
<td>
{% if entity.publication == true %}
<input type="checkbox" name="active" value="{{ entity.id }}" checked="checked">
{% else %}
<input type="checkbox" name="active" value="{{ entity.id }}">
{% endif %}
</td>
JS:
<script type="text/javascript">
$("input[type='checkbox']").change(function () {
$(this).hide().parent().append('<i class="fa fa-refresh fa-spin"></i>');
if($(this).is(":checked")){ //use $(this) instead of $('#check')
var val = 1;
$.ajax({
type: 'POST',
url: "http://www.openwecco.com/web/app_dev.php/admin/articles/postactive/" + this.value,
data: "etat=" +val,
success: function (msg) {
console.log(msg);
}
})
.done(function () {
$('.fa-spin').remove();
$('input:checkbox[name="active"]:hidden').show();
});
}else{
var val = 0;
$.ajax({
type: 'POST',
url: "http://www.openwecco.com/web/app_dev.php/admin/articles/postactive/" + this.value,
data: "etat=" +val,
success: function (msg) {
console.log(msg);
}
})
.done(function () {
$('.fa-spin').remove();
$('input:checkbox[name="active"]:hidden').show();
});
}
});
</script>
La méthode du controller:
public function updatePublicationAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
if($request->isXmlHttpRequest())
{
$article = $em->getRepository('BlogBundle:Article')->find($id);
$etat = $request->request->get('etat');
$article->setPublication($etat);
$em->flush();
//var_dump($article); die();
}
return new Response("Erreur");
}
et mon routing:
updatePost:
path: /postactive/{id}
defaults: { _controller: "BlogBundle:ArticleAdmin:updatePublication", format: json }
Bon sa marche en faisant $(this).is(':checked'). Maintenant mon problème c'est au niveau du traitement en Ajax.
<script type="text/javascript">
$("input[type='checkbox']").change(function () {
//alert($('#check').val());
if($(this).is(":checked")){ //use $(this) instead of $('#check')
var val = 1;
$.ajax({
type: 'POST',
url: "http://www.openwecco.com/web/app_dev.php/admin/updatePost",
data: {'etat': val},
success: function (msg) {
console.log(msg);
}
})
}else{
var val = 0;
$.ajax({
type: 'POST',
url: "http://www.openwecco.com/web/app_dev.php/admin/updatePost",
data: {'etat': val},
success: function (msg) {
console.log(msg);
}
})
}
});
</script>
Et la méthode du controller:
public function updatePublicationAction($id)
{
$request = $this->get('request');
$em = $this->getDoctrine()->getManager();
if($request->isXmlHttpRequest())
{
$article = $em->getRepository('BlogBundle:Article')->find($id);
var_dump($article); die();
$etat = $request->request->get('etat');
$article->setPublication($etat);
$em->flush();
}
return new Response("Erreur");
}
Mais mon var_dump($article) ne retourne rien!
Salut
J'aurai faitt comme ça moi
La vue :
<td>
{% if entity.publication == true %}
<i class="fa fa-check-square-o" data-id="{{entity.id}}"> <!-- J'utilise fontawesome pour le coup mais c'est faisable avec autre chose bien entendu -->
{% else %}
<i class="fa fa-square-o" data-id="{{entity.id}}">
{% endif %}
</td>
le Controller
public function updatePublicationAction($id)
{
$request = $this->get('request');
$em = $this->getDoctrine()->getManager();
if($request->isXmlHttpRequest())
{
$article = $em->getRepository('BlogBundle:Article')->find($id);
if(){$article->getPublication() == 0{
$etat = 1;
} else{
$etat = 0;
}
$article->setPublication($etat);
$em->flush();
}
return new Response("Erreur");
}
Le js
$(i.fa).click(function () {
if($(this).hasClass("fa-square-o")){
var val = 1;
}else{
var val = 0;
}
var id = $(this).attr("id);
$.ajax({
type: 'POST',
url: "http://www.openwecco.com/web/app_dev.php/admin/updatePost/"+id, //Je suppose qu'il te faut l'id ??
data: {'etat': val},
success: function (msg) {
console.log(msg);
}
})
}
});
Je pense que ça doit marché ça
C'est ce que je te disais sur mon dernier post !
Tu n'envoie pas l'id dans ton url et ta méthode attend une id en paramètre donc ça ne pouvais pas marcher !
moi c'est un click qui simule un cochage décochage mais j'ai oublié que c'était de l'ajax sur cette partie..
Du coup soit tu garde ta façon soit dans la mienne il faut ajouter un addClass et un remove classe sur l'élément cliqué.
Je vais pas le mettre dans le sens ou ta solution fonctionne bien ! :)
Underscreen t'avais raison je récupéré pas l'id ma route n'était pas la bonne. Du coup j'ai il ma fallu un router:debug pour voir mes bétises. Sinon j'ai utilisé FOSJSRouting comme conseillé merci