Problème de réaliser d'un ajax vote

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Problème] Problème de réaliser d'un ajax vote

    Je suis un débutant en programmation. En réalisant mon premier composant d'un ajax vote, je n'arrive pas d'appeler la fonction Vote dans le controller, ainsi dans le model. J'y suis bloqué plusieurs jours. Pouvez-vous m'indiquer où est mes erreurs, merci d'avance.

    default.php
    Code HTML:
    <?php defined( '_JEXEC' ) or die( 'Restricted access' ); ?>
    <script type="text/javascript">
    					
    function getXHR() {
    var xhr = null;
    if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
    } else if (window.createRequest) {
    xhr = window.createRequest();
    } else if (window.ActiveXObject) {
    try {
    xhr = new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e) {
    try {
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {}
    }
    }
    return xhr;
    }
    
    function ajaxVote(cid, votetype){
    cid = parseInt(cid);
    votetype = parseInt(votetype);
    if ( cid > 0 && votetype >= 0) {
    var xhr = getXHR();
    var url = "index.php?option=com_article&controller=vote";
    
    document.getElementById('loadimg_'+cid).style.display = 'inline';
    document.getElementById('voteButtons_'+cid).style.display = 'none';
    
    xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200) {
    document.getElementById('loadimg_'+cid).style.display = 'none';
    document.getElementById('pluscnt_'+cid).innerHTML = response.plus;
    document.getElementById('minuscnt_'+cid).innerHTML = response.minus;
    document.getElementById('voteButtons_'+cid).style.display = 'inline';
    }
    }
    xhr.open("POST",url+"?cid"+cid+"&votetype"+votetype,true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send(null);
    }
    }
    </script>
    
    <fieldset class="adminform"><legend><?php echo JText::_( 'Click For Vote' ); ?></legend>
    
    <?php echo JText::_('LIKE') ?>
    	
    	<span id='pluscnt_<?=$this->article->id?>'><?=$this->reponseplus?></span> <br/>
    	<div id='voteButtons_<?=$this->article->id?>'>
    				<input type='button' value='<?php echo JText::_('Like') ?>' style='width:120px' onclick='ajaxVote(<?=$this->article->id?>, 0)'><br/>  
    				<input type='button' value='<?php echo JText::_('NoLike') ?>' style='width:120px' onclick='ajaxVote(<?=$this->article->id?>, 1)'><br/>	
    	</div>
    	<div id="loadimg_<?=$this->article->id?>" style="display: none;"></div>
    	<?php echo JText::_('NOLIKE') ?>
    	<span id='minuscnt_<?=$this->article->id?>'><?=$this->reponseminus?></span> <br/>
    
    </fieldset>
    controller.php
    Code PHP:
    function display(){
            
    $view JRequest::getVar('view');
            
            if (!
    $view) {
                
    JRequest::setVar('view''list');
            }
            
            
    parent::display();
        }

    function 
    vote()    {
        
    // Check for request forgeries
        
    JRequest::checkToken() or jexit('Invalid Token');

    $mainframe     JFactory::getApplication();
    $article_id    JRequest::getInt('cid'0);
    $votetype    JRequest::getInt('votetype'0);

    require_once(
    JPATH_COMPONENT.DS.'models'.DS.'vote.php');
    $model = new articleModelVote();

           
    $this->setRedirect(JRoute::_('index.php?option=com_article&view=article&id='$article_id));

    models/Vote.php
    Code PHP:
    function vote($article_id$votetype) {
               
    $mainframe     JFactory::getApplication();
               
    $db    JFactory::getDBO();
               
    $user     =& JFactory::getUser();
               
    $article_id JRequest::getInt('cid','');
               
    $votetype    JRequest::getInt('votetype'0);
               
               
    $query "INSERT INTO #__article_vote
            (article_id, user, votetype) VALUES ('
    {$article_id}', '{$user}', '{$votetype}')";        

               
    //Save the vote to the database
               
    $db->setQuery($query);
               if (!
    $db->query()) {
                   
    $msg $db->stderr();
                   
    $tom "error";
             } 
            
               return 
    true;
          }

          function 
    getReponse() {
             
    $db JFactory::getDBO();
             
    $article_id JRequest::getInt('cid'0);
             
             
    $reponse = array();

             
    $db->setQuery("SELECT COUNT(*) as votescount, article_id FROM #__article_vote WHERE votetype = 0 GROUP BY article_id");
             
    $reponse['plus'] = $db->loadAssocList('article_id');

         
    $db->setQuery("SELECT COUNT(*) as votescount, article_id FROM #__article_vote WHERE votetype = 1 GROUP BY article_id");
         
    $reponse['minus'] = $db->loadAssocList('article_id');
            
             return 
    $reponse;
             }

    view.html.php
    Code PHP:
    function display($tpl null){
        
    $mainframe JFactory::getApplication();
        
    $id = (int) JRequest::getVar('id'0);
            
        
    $article =& JTable::getInstance('article''Table');
        
    $article->load($id);
            
            
    //Get total votes
            
    $reponse $this->get('Reponse');
            
            
    $reponseplus  $reponse['plus'];
        
    $reponseminus $reponse['minus'];
                            
            
    $this->assignRef('article'$article);
            
    $this->assignRef('reponseplus'$reponseplus);
            
    $this->assignRef('reponseminus'$reponseminus);

        
    parent::display($tpl);


  • #2
    Re : Problème de réaliser d'un ajax vote

    Bonjour yk7535,

    Tout d’abord quelle erreur se produit il exactement (écran blanc, erreur 500 ... etc).
    Ensuite tes requêtes ne sont pas sécurisé, utilise plutôt la classe JDatabase de Joomla!, en plus pour ta requête SELECT tu utilise des accolade pour concaténer, c'est normal ?
    Si oui je ne connaissait pas et je me coucherait moins c.. ce soir, moi j'utilise un point.
    De plus tes balise <? ?> pour les déclaration PHP c'est déconseiller car si ton composent est installer sur un autre serveur qui n'est pas paramétré correctement pour accepter les balises PHP réduite, ca ne fonctionnera pas.
    Et dans ton input tu n'as pas oublier des cote dans ton onClick (pour exécuter ton PHP).

    En prime un petit conseil pour ton JavaScript (moi je n'aime pas laisser des bouts de code) met ton JavaScript dans une variable PHP, et utilise un :
    Code PHP:
    $document    = &JFactory::getDocument();
    $document->addScriptDeclaration($ChaineJs); 
    Cela permet de copier le JavaScript dans le head, je trouve que ca fait plus propre.

    Cordialement titiste35.

    P.S. : Et par pitié écrit en français pas un mot sur deux, merci.

    Commentaire


    • #3
      Re : Problème de réaliser d'un ajax vote

      Envoyé par titiste35 Voir le message
      Bonjour yk7535,

      Tout d’abord quelle erreur se produit il exactement (écran blanc, erreur 500 ... etc).
      Ensuite tes requêtes ne sont pas sécurisé, utilise plutôt la classe JDatabase de Joomla!, en plus pour ta requête SELECT tu utilise des accolade pour concaténer, c'est normal ?
      Si oui je ne connaissait pas et je me coucherait moins c.. ce soir, moi j'utilise un point.
      De plus tes balise <? ?> pour les déclaration PHP c'est déconseiller car si ton composent est installer sur un autre serveur qui n'est pas paramétré correctement pour accepter les balises PHP réduite, ca ne fonctionnera pas.
      Et dans ton input tu n'as pas oublier des cote dans ton onClick (pour exécuter ton PHP).

      En prime un petit conseil pour ton JavaScript (moi je n'aime pas laisser des bouts de code) met ton JavaScript dans une variable PHP, et utilise un :
      Code PHP:
      $document    = &JFactory::getDocument();
      $document->addScriptDeclaration($ChaineJs); 
      Cela permet de copier le JavaScript dans le head, je trouve que ca fait plus propre.

      Cordialement titiste35.

      P.S. : Et par pitié écrit en français pas un mot sur deux, merci.
      Merci, pour votre réponse.
      D'abord, après appuyer sur les boutons de vote, je n'ai eu aucune information affiché sur l'écran, donc, je ne sais pas où est erreur.
      Merci pour votre conseil au sécurité. Je n'ai pas pensé à des points de sécurité de site encore. Pour moi, c'est d'abord de réaliser le programme, de faire marche, pour mon premier pas. Car, je suis un fervent de création de site, je n'ai pas eu des formations. Donc, je n'arrive pas de comprendre tous les parties de programme que j'ai cité.
      Merci encore, je vais essayer de corriger les parties que vous avez parlé.
      Dernière édition par yk7535 à 06/02/2012, 21h03 Raison: erreur

      Commentaire


      • #4
        Re : Problème de réaliser d'un ajax vote

        Bonjour,
        Pour voir si ce n'est pas un erreur JavaScript télécharge le module firebug de Mozilla (en espèrent que tu a Mozilla), car il te montre les erreur de codes JavaScript et te permet d’étudier des architectures proche de ton projet. Ou même la structure de ton propre projet.

        Cordialement titiste35.

        Commentaire


        • #5
          Re : Problème de réaliser d'un ajax vote

          Bonjour,
          J'ai installé le module firebug de Mozilla, l'erreur est "reponse is not defined index.php:176".

          Mais, je ne sais pas comment corrige cette partie.

          cordialement

          Commentaire


          • #6
            Re : Problème de réaliser d'un ajax vote

            Envoyé par yk7535 Voir le message
            default.php
            [HTML]
            xhr.onreadystatechange = function(){
            if(xhr.readyState == 4 && xhr.status == 200) {
            document.getElementById('loadimg_'+cid).style.disp lay = 'none';
            document.getElementById('pluscnt_'+cid).innerHTML = response.plus;
            document.getElementById('minuscnt_'+cid).innerHTML = response.minus;
            document.getElementById('voteButtons_'+cid).style. display = 'inline';
            }
            Ce ne serait pas plutôt :
            Code:
            document.getElementById('pluscnt_'+cid).innerHTML = xhr.plus;
            document.getElementById('minuscnt_'+cid).innerHTML = xhr.minus;
            Par ce que la variable réponse n'est pas instancier.

            Commentaire


            • #7
              Re : Problème de réaliser d'un ajax vote

              Envoyé par titiste35 Voir le message
              Ce ne serait pas plutôt :
              Code:
              document.getElementById('pluscnt_'+cid).innerHTML = xhr.plus;
              document.getElementById('minuscnt_'+cid).innerHTML = xhr.minus;
              Par ce que la variable réponse n'est pas instancier.
              J'ai corrigé cette partie, l'erreur de "reponse is not defined index.php:176" n'affiche plus. Mais, il n'a toujours aucune donnée insérée dans la table de vote? où est l'erreur?

              Cordialement

              Commentaire


              • #8
                Re : Problème de réaliser d'un ajax vote

                Bonjour,

                Pour un débutant, ne serait-il pas logique de s'inspirer d'un modèle qui fonctionne ?
                Par exemple http://extensions.joomla.org/extensi...a-reviews/4901 qui donne les bonnes méthodes, et facile à adapter à d'autres besoins
                Pas de demande de support par MP.
                S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

                Commentaire


                • #9
                  Re : Problème de réaliser d'un ajax vote

                  Envoyé par jisse03 Voir le message
                  Bonjour,

                  Pour un débutant, ne serait-il pas logique de s'inspirer d'un modèle qui fonctionne ?
                  Par exemple http://extensions.joomla.org/extensi...a-reviews/4901 qui donne les bonnes méthodes, et facile à adapter à d'autres besoins
                  Je me trouve que des extensions ne sont pas toujours adapter à la besion. C'est pour cela, je voudrais essayer d'érire mon premier composant.

                  Commentaire


                  • #10
                    Re : Problème de réaliser d'un ajax vote

                    Envoyé par yk7535 Voir le message
                    Je me trouve que des extensions ne sont pas toujours adapter à la besion. C'est pour cela, je voudrais essayer d'érire mon premier composant.
                    La meilleure solution pour comprendre et écrire est de s'inspirer de ce qui fonctionne, surtout quand on débute

                    L'intention est louable, mais en étudiant un modèle qui fonctionne bien, tu comprendras bien plus vite.
                    Pas de demande de support par MP.
                    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

                    Commentaire


                    • #11
                      Re : Problème de réaliser d'un ajax vote

                      C'est vrai ce que tu dit jisse03, mais les composent déjà fait ne sont pas toujours bien commenter et donc pour comprendre quelque chose il faut s’accrocher.

                      Et je me posait une question en regardant les noms de tes pages, comment tu à appeler les classes de ton composent, car je vois controleur.php, vote.php, les deux devrais avoir le même nom pour la cohérence de ton MVC. Et la création de ta variable modèle dans ton contrôleur :
                      $model = new articleModelVote();
                      Ne devrais pas être :
                      $model = $this->getModel();
                      Et aussi pour exécuter une requête ajax il faut mettre quelque par l'appel de la fonction qui exécute ta requête sinon rien ne vas ce passer.
                      Je m'explique tu à créer ton connecteur ajax avec l’URL de ton contrôleur mais ton contrôleur n’exécute pas la fonction de ton modèle il l'appel seulement, donc ta requête n'est pas exécuter ... Logique non ?

                      Il faudrait que tu rajoute un Get supplémentaire dans ton URL du style :
                      var url = "index.php?option=com_article&controller=vote&avot er=OK";
                      Et dans ton contrôleur tu ajoute :
                      if (Jrequest::getstring('avoter') == 'OK')
                      {
                      $model->vote();
                      $model->getReponse();
                      }
                      Bon avec des paramètre dans tes fonctions mais dans les grande ligne c'est ca.

                      Commentaire


                      • #12
                        Re : Problème de réaliser d'un ajax vote

                        Envoyé par titiste35 Voir le message
                        C'est vrai ce que tu dit jisse03, mais les composent déjà fait ne sont pas toujours bien commenter et donc pour comprendre quelque chose il faut s’accrocher.

                        Et je me posait une question en regardant les noms de tes pages, comment tu à appeler les classes de ton composent, car je vois controleur.php, vote.php, les deux devrais avoir le même nom pour la cohérence de ton MVC. Et la création de ta variable modèle dans ton contrôleur :

                        Ne devrais pas être :


                        Et aussi pour exécuter une requête ajax il faut mettre quelque par l'appel de la fonction qui exécute ta requête sinon rien ne vas ce passer.
                        Je m'explique tu à créer ton connecteur ajax avec l’URL de ton contrôleur mais ton contrôleur n’exécute pas la fonction de ton modèle il l'appel seulement, donc ta requête n'est pas exécuter ... Logique non ?

                        Il faudrait que tu rajoute un Get supplémentaire dans ton URL du style :


                        Et dans ton contrôleur tu ajoute :

                        Bon avec des paramètre dans tes fonctions mais dans les grande ligne c'est ca.
                        Merci toujours de votre réponse. Ce que vous avez dit est vrai, je seulement fais l'appel. J'ai ajouté ces codes dans le contrôleur. Il affiche "LIKE undefined" et "NOLIKE undefined". Et toujours rien exécuté.

                        Je me pose une question, mes codes de Javascript doivent réaliser deux tâches : inserer les données et retraire ces données. La fonction vote dans mon controleur, s'il permet d'excuter deux tâches dans une seule fonction ou bien il faut avoir une deuxième fonction par exemple "getvote". Que pensez vous?

                        Commentaire


                        • #13
                          Re : Problème de réaliser d'un ajax vote

                          Le plus simple serai de faire deux fonction et d’appeler la fonction de lecture à la fin de ta fonction d'insertion. En plus ca te permettrai de faire un bouton voire résultat sur ta page.

                          Pour exécuter ta fonction il faut overloader le constructeur de ton controleur :
                          public function __constructor($config = array())
                          {
                          parent::__constructor($config);

                          if (Jrequest::getstring('avoter') == 'OK')
                          {
                          self::vote()
                          }
                          }
                          Il faudrait que tu fasse un truc du genre.

                          Commentaire


                          • #14
                            Re : Problème de réaliser d'un ajax vote

                            Envoyé par titiste35 Voir le message
                            Le plus simple serai de faire deux fonction et d’appeler la fonction de lecture à la fin de ta fonction d'insertion. En plus ca te permettrai de faire un bouton voire résultat sur ta page.

                            Pour exécuter ta fonction il faut overloader le constructeur de ton controleur :


                            Il faudrait que tu fasse un truc du genre.
                            Merci, je vais essayer de le faire.

                            Commentaire

                            Annonce

                            Réduire
                            Aucune annonce pour le moment.

                            Partenaire de l'association

                            Réduire

                            Hébergeur Web PlanetHoster
                            Travaille ...
                            X