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>

8 réponses


podisto
Auteur
Réponse acceptée

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 }
podisto
Auteur

Sa ne marche que sur la premiere ligne! J'ai fait un foreach mais meme chose!

podisto
Auteur

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

Ton vardump article ne retourne rien parce que tu n'envoie pas l'id à ta méthode

podisto
Auteur

Underscreen, et tu fait comment pour cocher ou décocher dans ce cas?

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 ! :)

podisto
Auteur

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