Joomladay francophone 2019 à Paris, les 8 et 9 mars 2019

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
                            1 sur 2 < >

                            C'est [Réglé] et on n'en parle plus ?

                            A quoi ça sert ?
                            La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

                            Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

                            Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
                            Comment ajouter la mention [Réglé] à votre discussion ?
                            1 - Aller sur votre discussion et éditer votre premier message :


                            2 - Cliquer sur la liste déroulante Préfixe.

                            3 - Choisir le préfixe [Réglé].


                            4 - Et voilà… votre discussion est désormais identifiée comme réglée.

                            2 sur 2 < >

                            Assistance au forum - Outil de publication d'infos de votre site

                            Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

                            Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

                            Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

                            UTILISER À VOS PROPRES RISQUES :
                            L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

                            Problèmes connus :
                            FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

                            Installation :

                            1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

                            Archive zip : https://github.com/AFUJ/FPA/zipball/master

                            2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

                            3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

                            4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

                            5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

                            6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
                            et remplacer www. votresite .com par votre nom de domaine


                            Exemples:
                            Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
                            Télécharger le script fpa-fr.php dans: /public_html/
                            Pour executer le script: http://www..com/fpa-fr.php

                            Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
                            Télécharger le script fpa-fr.php dans: /public_html/cms/
                            Pour executer le script: http://www..com/cms/fpa-fr.php

                            En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

                            Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
                            Voir plus
                            Voir moins

                            Partenaire de l'association

                            Réduire

                            Hébergeur Web PlanetHoster
                            Travaille ...
                            X