web-dev-qa-db-fra.com

Ajax post to plugin fonctionne dans l'environnement localhost, mais pas sur le serveur hébergé

J'ai développé un site Web pour une station de radio locale et ils m'ont demandé s'il était possible de suivre le nombre de lectures ou de téléchargements des podcasts. J'utilise le plugin mp3 Browser Fork ( https://extensions.joomla.org/extensions/extension/multimedia/multimedia-players/mp3-browser-fork/ ) pour générer les pages de podcast, donc J'ai ajouté du code au plug-in MP3 Browser Fork pour créer une publication Ajax dans un nouveau plug-in que j'ai créé pour enregistrer l'événement cliqué dans une table de base de données.

Ce code fonctionnait correctement sur mon environnement Localhost (voir les spécifications au bas de cet article), mais lorsque j'ai migré les modifications de codage dans mon sous-domaine de développement, les transactions n'étaient pas enregistrées.

J'ai simplifié le code jusqu'à ce que Ajax publie une chaîne et que la fonction PHP renvoie immédiatement une valeur de chaîne. La publication retourne 200 OK et la publication Ajax semble réussir, mais PHP n'étant jamais exécutée, le corps de la réponse affiche une chaîne de données vide.

Je l'ai répliqué sur mon environnement localhost en mal orthographiant le nom du plug-in dans l'URL de la publication Ajax. À l'aide de l'EDI Eclipse et des outils de développement F12 de Microsoft Edge, j'ai pu confirmer que POST avait réussi, mais que la fonction PHP ne s'était pas exécutée.

Voici ce que j'ai essayé jusqu'à présent:

  • Site de développement téléchargé sur l'hôte local pour vérifier que rien n'a été oublié pendant la migration
  • Code simplifié
  • URL comparées dans l'en-tête POST pour vérifier leur correspondance entre localhost et le sous-domaine de développement
  • URL exacte codée en dur pour le sous-domaine de développement
  • Fichier .htaccess renommé (dans le sous-domaine et le domaine de production) pour éliminer tout problème de remappage
  • Désactivé les URL conviviales pour les moteurs de recherche SEO
  • Changement du nom de la fonction afin qu'il ne corresponde pas au nom du plugin
  • Vérifié PHP post_max_size valeur (64 Mo)
  • Déclassé PHP version à 5.4
  • Activation de tous les rapports d'erreur et de la journalisation (sur localhost avec un nom de plug-in mal orthographié - rien n'a été vu que les outils de développement F12 ne m'ont pas montré)
  • Comparaison des informations sur les outils de développement F12 de Microsoft Edge avec les outils de débogage de Google Chrome (informations identiques sur les deux)
  • Apporter des modifications de codage à l'environnement de production (élimine le sous-domaine comme problème)

Aucune de ces choses n'a permis à la fonction PHP de s'exécuter. Je pense qu'il y a quelque chose dans l'environnement hébergé qui ne permet pas à Ajax Post de localiser le PHP = fonction, mais puisque le message reçoit une réponse du serveur, aucun message d'erreur n'est généré.

Voici tous les codes et réponses applicables:

Modèle modifié pour inclure la bibliothèque JQuery

<head>
<?php echo $this['template']->render('head'); ?> 
<script src="http://content.jwplatform.com/libraries/3sVcGVbK.js"></script>   
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
</head>

PHP Plugin (première fonction)

<?php
// No direct access
defined('_JEXEC') or die;

// Import library dependencies
jimport('joomla.plugin.plugin');

class plgAjaxPodcastTracker extends JPlugin
{
    Public function onAjaxPodcastTracker()
    { 
      return "Test";
    }

Fichier XML du plugin:

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7"
           type="plugin"
           group="ajax"
           method="upgrade">
    <name>Ajax - PodcastTracker</name>
    <version>0.1</version>
    <creationDate>July 28, 2017</creationDate>
    <author>Brian Benedum</author>
    <authorEmail>[email protected]</authorEmail>
    <authorUrl>http://www.readyfm.com</authorUrl>
    <license>GNU General Public License version 2 or later</license>
    <copyright>Copyright (C) 2017 All rights reserved.</copyright>
    <description>Joomla Ajax Plugin</description>

    <files>
        <filename plugin="PodcastTracker">podcasttracker.php</filename>
    </files>

</extension>

Nouvelle fonction ajoutée au fichier Configuration.php du plugin MP3 Browser Fork

public function getDownloadTrackerscript() {
    $format = "<script type=\"text/javascript\">";
    $format .= "$(document).ready(function(){";
    $format .= "$(\"#download_%2\").click(function(){";
    $format .= "$.ajax({";    
    $format .= "type: \"POST\",";      
    $format .= 'data: {"data": "mydata"},';      
    $format .= "url: \"index.php?option=com_ajax&plugin=PodcastTracker&method=PodcastTracker&format=json\",";          
    $format .= "success: function(results) {";           
    $format .= "console.log(results);";            
    $format .= "}";
    $format .= "});"; 
    $format .= "});";  
    $format .= "});";
    $format .= "</script>";
    return $this->get("DownloadTrackerscript", $format);
}

Les en-têtes, corps de requête et de réponse

Headers, Request and Response Body

Environnements hôte local et hébergé

LOCALHOST:

Serveur Web: Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP 5.6.23 Joomla: 3.7.4

Sous-domaine de développement et domaine de production:

Fournisseur d'hébergement: Bluehost

Serveur Web: Apache 2.2.32 PHP 7.0.12

Merci d'avance pour toute idée. Je suis à court d'idées!

2
bbenedum

Le bon appel est:

index.php? option = com_ajaxplugin = PodcastTrackermethod = PodcastTrackerformat = json

Noms de plugins et de méthodes sans "plgAjax" et "onAjax". Le plugin doit être installé dans le groupe ajax.

Exemple de plug-in: https://github.com/Joomla-Ajax-Interface/Ajax-Latest-Articles

Documentation de l'interface Ajax: https://docs.joomla.org/Using_Joomla_Ajax_Interface

Script de test par exemple plugin:

<script src="https://code.jquery.com/jquery-latest.min.js"></script>
<button id="download">Test</button>
<?php 

 $format = "<script type=\"text/javascript\">";
    $format .= "$(document).ready(function(){";
    $format .= "$(\"#download\").click(function(){";
    $format .= "$.ajax({";    
    $format .= "type: \"POST\",";      
    $format .= 'data: {"data": "mydata"},';      
    $format .= "url: \"index.php?option=com_ajax&plugin=Latestarticles&method=Latestarticles&format=json\",";          
    $format .= "success: function(results) {";           
    $format .= "console.log(results);";            
    $format .= "}";
    $format .= "});"; 
    $format .= "});";  
    $format .= "});";
    $format .= "</script>";

    echo $format;

    ?>
1
Dennis Heiden