2017-05-25 1 views
0

Dies ist mein erstes Mal hier posten, aber ich kann nicht scheinen, eine Antwort auf die Frage zu finden, die ich habe. Ich benutze Stack seit Jahren, aber dies ist eines der ersten Male, wo ich einfach keine Antwort finden kann. Wenn ich etwas anders machen sollte, bitte lass es mich wissen.

Ich bin dynamisch Schaltflächen auf der Grundlage von Dateinamen in einem Verzeichnis aufzufüllen. Ich muss den Namen der Schaltfläche an meinen Controller mit jQuery und AJAX senden. Ich verwende den folgenden Code, dies zu tun:

$currentDir = getcwd(); 
       $files = scandir($currentDir); 
       $count = 0; 
       foreach ($files as $name) { 
        if(preg_match("/^sma\w*/", $name)){ 
         $workingFiles = substr($name, strpos($name, "_") + 1); 
         $availableActions = explode(".", $workingFiles); 
         $class_action = $availableActions[0]; 
         $buttonName = $class_action; 
         $count ++; 
         ?> 
         <button id="<?php echo $class_action;?>" class="actionButtons"><? echo $buttonName; ?></button> 
          <script> 
           $(document).ready(function() { 
            $("#<?php echo $class_action;?>").click(function(){ 

             var class_action = <?php echo $class_action;?>  
             $.ajax({ url: url + '?action=GetStatus&action=Execute', 
              type: 'POST', 
              data: JSON.stringify({action: "GetStatus", action: "Execute", actionItem: class_action}), 
              contentType: 'application/json; charset=utf-8', 
              success: function(output) { 
               if(output){ 
                console.log(output); 


               } 
               else{ 
                console.log("Nothing returned"); 

               } 
              }, 
               error: function() { 
                console.log("error in the execute call"); 

               } 
             }); 
            }); 
           }); 
         </script> 
         <? 
        }       
       }      

Mit einem Controller, der wie folgt aussieht:

if(isset($_GET['action'])){ 
$action = $_GET["action"]; 
switch($action){ 
    case "GetStatus":  
    _setContent(); 
    break; 
    case "Execute": 
    if(isset($_POST['data'])){ 
     $data = json_decode($_POST['data']); 
     echo $data; 
    } 
    break; 

Ideen? Jede Rückmeldung würde sehr geschätzt werden!

+0

Warum sind Sie '$ _GET [ 'action'] mit', wenn Sie es sind zu veröffentlichen? Warum versuchen Sie, es sowohl zu veröffentlichen als auch an die URL anzuhängen? Haben Sie sich auch die Browser-Debug-Tools angesehen? Was ist in den Formulardaten, die in der Anfrage gemacht werden? Ist es so, wie Sie es erwarten, indem Sie die richtigen Informationen weitergeben? – Styphon

+0

Große Fragen! @Styphon Ich benutze $ _GET ['action'], um den richtigen Fall auszulösen, den es korrekt ausführt, während er die URL-Parameter-Aktion betrachtet. Von dort aus muss ich auf die $ _POST ['data'] schauen, um diese Information weiter zu senden. Wenn ich mir die Debug-Tools anschaue, kann ich jedoch nicht feststellen, wo die Daten gepostet werden. Es scheint, dass nur die URL-Parameter gepostet werden. –

Antwort

0

Warum haben Sie $(document).ready innerhalb der Schleife?

Stattdessen können Sie dies unter Code verwenden:

$(document).ready(function() { 
 
    $(".actionButtons").click(function() { 
 
    var class_action = $(this).attr('id') 
 
    $.ajax({ 
 
     url: url + '?action=GetStatus&action=Execute', 
 
     type: 'POST', 
 
     data: JSON.stringify({ 
 
     action: "GetStatus", 
 
     action: "Execute", 
 
     actionItem: class_action 
 
     }), 
 
     contentType: 'application/json; charset=utf-8', 
 
     success: function(output) { 
 
     if (output) { 
 
      console.log(output); 
 
     } else { 
 
      console.log("Nothing returned"); 
 

 
     } 
 
     }, 
 
     error: function() { 
 
     console.log("error in the execute call"); 
 

 
     } 
 
    }); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<?php 
 
    $currentDir = getcwd(); 
 
    $files = scandir($currentDir); 
 
    $count = 0; 
 
    foreach ($files as $name) { 
 
    if(preg_match("/^sma\w*/", $name)){ 
 
     $workingFiles = substr($name, strpos($name, "_") + 1); 
 
     $availableActions = explode(".", $workingFiles); 
 
     $class_action = $availableActions[0]; 
 
     $buttonName = $class_action; 
 
     $count ++; 
 
     echo "<button id="$class_action" class='actionButtons'>" . $buttonName. "</button>"; 
 
    }       
 
    } 
 
?>

+0

Das ist der Grund, warum die Daten nicht gefüllt wurden. Ich habe das $ (Dokument) .ready innerhalb der Schleife entfernt und jetzt machen die Daten es durch. Jetzt muss ich herausfinden, warum es actionItem zurückgibt: {jQuery18397275251907154883: 6} aber das ist ein anderes Thema alle zusammen, die ich untersuchen werde. DANKE JUNGS! Was für ein Lebensretter! –

+0

Gern geschehen! –

+1

Kühl. Der Grund für die verrückte Zahl lag darin, dass die Variable nicht in Anführungszeichen gesetzt wurde. Ich hatte var class_action = Anstelle von var class_action = "". Cool. Alles behoben. Ihr Jungs rockt! –

Verwandte Themen