web-dev-qa-db-fra.com

Accédez directement au fichier de module personnalisé à l’aide de AJAX

Je souhaite transmettre directement les données POST à mon fichier .php, situé dans le dossier de mon module. Je sais que cela constitue un risque pour la sécurité, mais j'essaierai de résoudre ce problème plus tard.

Je fais des recherches sur ce sujet - comment le faire sans utiliser aucun composant, alors s'il vous plaît, ne me suggérez pas com_ajax.

default.php

//defined('_JEXEC') or die; 
<form method="post" name="form1">
            <input type="checkbox" name="checkboxList[]" value="1">value1</input>
            <input type="checkbox" name="checkboxList[]" value="2">value2</input>
            <input type="checkbox" name="checkboxList[]" value="3">value3</input>
</form>

<script>
 jQuery(document).ready(function(jQuery){

   jQuery("input[type='checkbox']").on("change",function(){
    if(jQuery(this).is(":checked"))
    {
         var checkboxdata=[];

         jQuery("input[type='checkbox']").each(function(){

                  if(jQuery(this).is(":checked"))
                            {
                            checkboxdata.Push(jQuery(this).val());
                            }

                  })

         var data = checkboxdata;
         jQuery.ajax({
             url: '/modules/mod_test/respond.php',
             type: 'POST',
             async: true,
             cache: false,
             data: data,
             success:function(r){
                    alert(data); 
             }
         })
    }
})

});

</script

Sur chaque case à cocher - je suis alerté par les données (jusqu'ici tout va bien!).

respond.php (fichier php personnalisé je veux un accès direct - envoyer POST données avec ajax)

<?php
print_r($_POST);
?>

PDATE: [jamesgarrett]

default.php

<form method="post" action="" name="form1" id="mycustomform">
<input type="checkbox" name="checkboxList[]" onclick="function1();" value="1"> Apple</input><br>
<input type="checkbox" name="checkboxList[]" onclick="function1();" value="2"> Pineapple</input><br>
<input type="checkbox" name="checkboxList[]" onclick="function1();" value="3"> Pen</input>
</form>
<div id="response"></div>

<script>
function function1() {
var data = jQuery("#mycustomform").serialize() + '&thisisajax=1';
jQuery.ajax({
    url: "<?php echo JUri::current(); ?>", 
    type: "POST",
    data: data, 
    success: function(response){ 
        response = jQuery.parseJSON(response);
        if(response.success === true){
           jQuery('#response').html(response.data);
        } else {
            alert('error');
        }
    }
});
}
</script>

helper.php

<?php

$jinput = JFactory::getApplication()->input;
$data = $jinput->post->get('checkboxList', [], 'array');
$ajax_test = $jinput->post->get('thisisajax', 0, 'int');

if($ajax_test){
$some_text = ['','Apple','Pineapple','Pen'];
$response = "";
foreach($data as $d){
    $response .= $some_text[$d] . " ";
}
echo new JResponseJson($response);
jexit();
}


class ModHelloWorldHelper
{
public static function getHello()
{

}
}
3
JohnCoolGuy1996

Voici un exemple complet pour un module dans 1 fichier, sans contourner Joomla, sans utiliser de composant, en exécutant la fonction php sur des données postées async, et en exécutant quelques js sur les données renvoyées (pourquoi pas).

Utilisez la section tests uniquement pour que votre requête fonctionne avant de traiter votre requête ajax.

<?php 
defined('_JEXEC') or die;

// toggle this variable in order to show the results of the db query for testing purposes
$production = 0;

$jinput = JFactory::getApplication()->input;
$data = $jinput->post->get('checkboxList', [], 'array');
$ajax_test = $jinput->post->get('thisisajax', 0, 'int');

// = TESING ONLY ===================================================

if(!production){
    $data = [1,2,3];
    $ajax_test = 1;
}

// = END TESTING ONLY ===============================================

if($ajax_test){
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select($db->quoteName('*'));
    $query->from($db->quoteName('#__custom_table'));
    $query->where($db->quoteName('custom_id') . ' IN (' . implode(",",$data) .')');
    $db->setQuery($query);
    $results = $db->loadObjectList();

    if(!production){
        echo "<pre>" . print_r($results,1) . "</pre>";
        die();
    }

    // PROCESS RESULTS HERE

    $response = 'xxx?';

    echo new JResponseJson($response);
    jexit();
}
?>
<form method="post" action="" name="form1" id="mycustomform">
    <input type="checkbox" name="checkboxList[]" onclick="function1();" value="1"> Apple</input><br>
    <input type="checkbox" name="checkboxList[]" onclick="function1();" value="2"> Pineapple</input><br>
    <input type="checkbox" name="checkboxList[]" onclick="function1();" value="3"> Pen</input>
</form>
<div id="response"></div>

<script>
function function1() {
    var data = jQuery("#mycustomform").serialize() + '&thisisajax=1';
    jQuery.ajax({
        url: "<?php echo JUri::current(); ?>", 
        type: "POST",
        data: data, 
        success: function(response){ 
            response = jQuery.parseJSON(response);
            if(response.success === true){
               jQuery('#response').html(response.data);
            } else {
                alert('error');
            }
        }
    });
}
</script>
2
jamesgarrett

Testez votre code et cela fonctionne pour moi.

Les choses que j'ai changées étaient les suivantes, au cas où ce soit le problème:

  • Changé toutes les références de $ En jQuery afin que je n'ai pas à m'inquiéter de la définition de l'objet jQuery ou de tout conflit.
  • Ajout de balises <script> Autour de votre javascript (bien que je suppose que vous venez de les supprimer pour simplifier le code de votre question)
  • Mon site de test se trouvait dans un sous-dossier, je devais donc mettre à jour correctement l'appel AJAX, afin qu'il se charge à partir de la racine.

Si vous accédez directement à l'URL response.php dans un navigateur, il devrait afficher "Array ()". Est-ce le cas?

Pour ce qui est de ne pas suggérer com_ajax - ce sera le bon endroit pour au moins étudier pour voir comment Joomla a construit un composant ajax. Une fois que vous avez quitté le cadre, vous ne construisez pas vraiment de site Joomla.

Mise à jour:

Array(
   [3] => 
)

Cela signifie que vous avez exécuté print_r () sur une chaîne et non sur un tableau. Cette alerte est donc exactement comme elle devrait être.

var data = jQuery(this).val();

envoie seulement la valeur de la case que vous venez de cocher - pas les données du formulaire, ni la paire nom/valeur de la case à cocher, mais seulement la valeur - le this à ce stade fait référence à l'élément sur lequel vous venez de cliquer sur (c'est-à-dire la case à cocher spécifique) et non les données du formulaire complet.

Dans l’intérêt d’un exemple rapide et hacky (ce n’est pas une approche géniale), remplacez var data = jQuery(this).val(); avec ce qui suit, qui enverra un tableau de données de case à cocher.

  var checkboxdata=[];


  jQuery("input[type='checkbox']").each(function(){

          if(jQuery(this).is(":checked"))
                    {
                    checkboxdata.Push(jQuery(this).val());
                    }

          })

   var data=  checkboxdata; 

Mise à jour 2

Vous devez savoir comment AJAX fonctionne.

Chaque fois que vous appelez une page via AJAX, la procédure est la même que si vous soumettez un formulaire dont la balise action pointe sur cette page (ou charge une page en transmettant des paramètres dans l'URL). La seule différence réelle est que le résultat est envoyé à votre fonction javascript plutôt que d'être imprimé à l'écran pour l'utilisateur.

Chaque fois que vous appelez une page via AJAX, cela revient à soumettre de nouveau un formulaire ou à recharger une page. Comme pour la nouvelle soumission d'un formulaire, il ne se souviendra pas de ce qui lui est arrivé auparavant, à moins que vous ne le codiez spécifiquement pour le faire.

1
Richard B