2016-03-18 53 views
0

現在,我有一種動態的排序形式,允許用戶選擇類別,類型和子類型。這些信息將被用於PHP函數(希望)。所有這些都在一個PHP文件中。使用AJAX在PHP文件中調用PHP方法

我希望能夠使用AJAX調用該PHP文件中的函數。我已經看到了在HTML文檔中使用AJAX調用PHP文件的方法,但不是從PHP文檔中調用。

這是我configs.php相關部分:

<?php 
use FW\Config; 
require_once 'setup.php'; 

function build($category, $type, $subtype){ 
    //WANT TO GET HERE 
} 

function getTypes($dir) { 
    return array_diff(scandir($dir), array('..', '.')); 
} 

function getSubTypes($dir, $type) { 
    return array_diff(scandir("$dir//$type"), array('..', '.')); 
} 

function getVersions($dir, $type, $subType) { 
    return array_diff(scandir("$dir//$type//$subType"), array('..', '.')); 
} 

function getFileContents($dir, $type, $subtype, $file){ 
    $path = "$dir/$type/$subtype/$file.txt"; 
    $openFile = fopen($path, "r"); 
    $content = fread($openFile, filesize($path)); 
    fclose($openFile); 
    return split("/", $content)[0]; 
} 

$project_dir = Config::$appConfig['project_file_dir']['scriptPath']; 
$workflow_dir = Config::$appConfig['workflow_file_dir']['scriptPath']; 

$project_types = getTypes($project_dir); 
$project_subtypes = array(); 
$project_versions = array(); 

$workflow_types = getTypes($workflow_dir); 
$workflow_subtypes = array(); 
$workflow_versions = array(); 

foreach ($project_types as $type) { 
    $project_subtypes[$type] = getSubTypes($project_dir, $type); 

    //@todo remove once folder structure is all setup 
    if ($type !== 'CD') continue; 

    foreach ($project_subtypes[$type] as $subType) { 
     $project_versions[$subType] = getVersions($project_dir, $type, $subType); 
    } 
} 

foreach ($workflow_types as $type) { 
    $workflow_subtypes[$type] = getSubTypes($workflow_dir, $type); 

    foreach ($workflow_subtypes[$type] as $subType) { 
     $workflow_versions[$subType] = getVersions($workflow_dir, $type, $subType); 
    } 
} 

function makeInfoSection($type, $subType, $versions, $dir) {  

    // list versions 
    $html .= '<h4>Available Versions</h4>'; 
    $html .= '<ul class="list-group">'; 
    foreach ($versions as $v) { 
     if (strpos($v, '.txt')) continue; 

     $html .= '<li class="list-group-item">'; 
     $html .= '<span class="badge"><a href="#" style="color:orange">'; 
     $html .= '<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"'; 
     $html .= 'onclick="build()">'; //@todo add onclick to trigger build() 
     $html .= '</span></a></span>'; 
     $html .= $v; 
     $html .= '</li>'; 
    } 
    $html .= '</ul>'; 

    return $html; 
} 

function makeSection($parent, $prefix, $type, $subTypes) { 
    $headingID = 'heading-'.$type; 
    $bodyID = 'collapse-'.$prefix.$type; 

    $html = '<div class="panel panel-default" style="margin-bottom:10px;">'; 
    $html .= '<div class="panel-heading" role="tab" id="'.$headingID.'">'; 
    $html .= '<h4 class="panel-title">'; 
    $html .= '<a role="button" data-toggle="collapse" data-parent="'.$parent; 
    $html .= '" href="#'.$bodyID.'" aria-expanded="true"'; 
    $html .= 'aria-controls="'.$bodyID.'">'.$type; 
    $html .= '</a></h4></div>'; 

    $html .= '<div id="'.$bodyID.'" class="panel-collapse collapse in" '; 
    $html .= 'role="tabpanel" aria-labelledby="'.$headingID.'">'; 

    $html .= '<div class="list-group">'; 
    foreach ($subTypes as $subType) { 
     $target = "tab-".$prefix.$type."-".$subType; 
     $html .= '<a href="#'.$target.'" class="list-group-item" '; 
     $html .= 'aria-controls="'.$target.'" role="tab" data-toggle="tab"'; 
     $html .= '>'.$subType.'</a>'; 
    } 

    $html .= '</div></div></div>'; 
    return $html; 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 
<style> 
.list-group-item.active, .list-group-item.active:hover { 
    background-color: white; 
    color: black; 
} 
</style> 
</head> 
<body> 
<div class="container"> 
<div class="page-header"> 
    <h1>Configuration Management</h1> 
</div> 

<div class="row"> 
    <div class="col-md-5 col-md-push-1 col-sm-6"> 
     <ul class="nav nav-tabs" role="tablist" id="config-tabs"> 
      <li role="presentation" class="active"> 
       <a href="#project_list" aria-controls="project_list" role="tab" data-toggle="tab"> 
        <h4>Project</h4> 
       </a> 
      </li> 
      <li role="presentation"> 
       <a href="#workflow_list" aria-controls="workflow_list" role="tab" data-toggle="workflow_list"> 
        <h4>Workflow</h4> 
       </a> 
      </li> 
     </ul> 
     <div class="tab-content"> 
      <div role="tabpanel" class="tab-pane active panel-group" id="project_list" role="tablist" aria-multiselectable="true"> 
       <?php 
        foreach ($project_types as $type) { 
         echo makeSection('#project_list', 'project-',$type, $project_subtypes[$type]); 
        } 
       ?> 
      </div> 
      <div role="tabpanel" class="tab-pane panel-group" id="workflow_list" role="tablist" aria-multiselectable="true"> 
       <?php 
        foreach ($workflow_types as $type) { 
         echo makeSection('#workflow_list', 'workflow-',$type, $workflow_subtypes[$type]); 
        } 
       ?> 
      </div> 
     </div> 
    </div> 
    <div class="col-md-5 col-md-push-1 col-sm-6"> 
     <div id="tabs" class="tab-content" style="padding:0em 0em 0em 1em"> 
      <?php 
       foreach ($project_types as $type) { 
        // @TODO remove once folder structure is all setup 
        if ($type !== 'CD') continue; 

        foreach ($project_subtypes[$type] as $subType) { 
         $html = "<div role ='tabpanel' class='tab-pane'"; 
         $html .= "id='tab-project-".$type."-".$subType."'>"; 
         $html .= makeInfoSection($type, $subType, $project_versions[$subType], $project_dir); 
         $html .= "</div>"; 
         echo $html; 
        } 
       } 

       foreach ($workflow_types as $type) { 
        foreach ($workflow_subtypes[$type] as $subType) { 
         $html = "<div role ='tabpanel' class='tab-pane'"; 
         $html .= "id='tab-workflow-".$type."-".$subType."'>"; 
         $html .= makeInfoSection($type, $subType, $workflow_versions[$subType], $workflow_dir); 
         $html .= "</div>"; 
         echo $html; 
        } 
       } 
      ?> 
     </div> 
    </div> 
</div> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="12345" crossorigin="anonymous"></script> 
<script type="text/javascript"> 
    function build (url, params, cb) { 
     url += "/buildWithParameters"; 

     $.ajax({ 
      type: 'POST', 
      url: url, 
      data: params, 
      success: cb 
     }); 
    }; 

    $('.collapse').collapse(); 

    $('.list-group a').click(function (e) { 
     e.preventDefault(); 
     $(this).tab('show'); 
    }); 

    $('#config-tabs a').click(function (e) { 
     e.preventDefault(); 
     $(this).tab('show'); 
    }) 
</script> 
</body> 
</html> 

在上面的代碼,我想調用PHP函數build。我有一個JavaScript函數build(),它在適當的時候被調用,並且應該有AJAX來進行調用。我會怎麼做呢?我將如何通過這些參數?

+0

你應該能夠ŧ o通過URL瀏覽,以便在那裏創建一個http(get/post)。你是 ?如果是的話,路徑是什麼?如果不是,你需要在應用中處理'routing'。 – Akis

+2

[如何使用jQuery ajax調用PHP函數?]可能重複(http://stackoverflow.com/questions/28291183/how-to-call-php-function-using-jquery-ajax) – MonkeyZeus

+0

@MonkeyZeus認爲你可能會是對的。驚訝我以前沒有找到。看看 –

回答

1

爲什麼不只是有一個單獨的文件爲AJAX例程調用?

總之,要回答你的問題:

AJAX將數據串發送到PHP文件,無論是通過GET或POST。在一個標準化 - 許多人喜歡後。

如你所知,Ajax代碼塊看起來是這樣的(你將需要發送您的功能所需的信息):

var var_value = $('#my_element').val(); 
var cat = $('#category_element').val(); 
var typ = $('#type_element').val(); 
var sub = $('#subtype_element').val(); 
$.ajax({ 
    type: 'post', 
    url: 'your_file.php', 
    data: 'var_name=' +var_value+ '&cat=' +cat+ '&typ=' +typ+ '&sub=' +sub, 
    success: function(d){ 
     if (d.length) alert(d); //for testing - alerts anything your function ECHOs 
    } 
});//end ajax 

在你的PHP文件,只需陷阱VAR:

<?php 
    //Your existing PHP file contents go here. At bottom add: 

    if (isset($_POST('var_name')){ 
     $category = $_POST('cat'); 
     $type = $_POST('typ'); 
     $subtype = $_POST('sub'); 
     build($category, $type, $subtype); 
    } 

See this post一些有用的AJAX技巧和簡單的例子

-1

在php標籤啓動後的代碼下方。

// check if ajax call 
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 
{  
    // call your php function here and return some data 
    $data = someFunction(); 
    echo json_encode($data); // return data back in json format, can return in other format as well. 
    exit(); // do use exit here otherwise it will return the whole file code 
} 
0

試試這個:

<?php 
use FW\Config; 
require_once 'setup.php'; 

//Check the get variable for the function being called. 
if(isset($_GET['func']) AND function_exists($_GET['func'])){ 
    $func=$_GET['func']; 
    $func(); 
    //This is an ajax call, we really should exit here so we can let $func handle the ajax output; 
    exit; 
} 
function build($category, $type, $subtype){ 
    //WANT TO GET HERE 
} 

function getTypes($dir) { 
    return array_diff(scandir($dir), array('..', '.')); 
} 

function getSubTypes($dir, $type) { 
    return array_diff(scandir("$dir//$type"), array('..', '.')); 
} 

function getVersions($dir, $type, $subType) { 
    return array_diff(scandir("$dir//$type//$subType"), array('..', '.')); 
} 

function getFileContents($dir, $type, $subtype, $file){ 
    $path = "$dir/$type/$subtype/$file.txt"; 
    $openFile = fopen($path, "r"); 
    $content = fread($openFile, filesize($path)); 
    fclose($openFile); 
    return split("/", $content)[0]; 
} 

$project_dir = Config::$appConfig['project_file_dir']['scriptPath']; 
$workflow_dir = Config::$appConfig['workflow_file_dir']['scriptPath']; 

$project_types = getTypes($project_dir); 
$project_subtypes = array(); 
$project_versions = array(); 

$workflow_types = getTypes($workflow_dir); 
$workflow_subtypes = array(); 
$workflow_versions = array(); 

foreach ($project_types as $type) { 
    $project_subtypes[$type] = getSubTypes($project_dir, $type); 

    //@todo remove once folder structure is all setup 
    if ($type !== 'CD') continue; 

    foreach ($project_subtypes[$type] as $subType) { 
     $project_versions[$subType] = getVersions($project_dir, $type, $subType); 
    } 
} 

foreach ($workflow_types as $type) { 
    $workflow_subtypes[$type] = getSubTypes($workflow_dir, $type); 

    foreach ($workflow_subtypes[$type] as $subType) { 
     $workflow_versions[$subType] = getVersions($workflow_dir, $type, $subType); 
    } 
} 

function makeInfoSection($type, $subType, $versions, $dir) {  

    // list versions 
    $html .= '<h4>Available Versions</h4>'; 
    $html .= '<ul class="list-group">'; 
    foreach ($versions as $v) { 
     if (strpos($v, '.txt')) continue; 

     $html .= '<li class="list-group-item">'; 
     $html .= '<span class="badge"><a href="#" style="color:orange">'; 
     $html .= '<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"'; 
     $html .= 'onclick="build()">'; //@todo add onclick to trigger build() 
     $html .= '</span></a></span>'; 
     $html .= $v; 
     $html .= '</li>'; 
    } 
    $html .= '</ul>'; 

    return $html; 
} 

function makeSection($parent, $prefix, $type, $subTypes) { 
    $headingID = 'heading-'.$type; 
    $bodyID = 'collapse-'.$prefix.$type; 

    $html = '<div class="panel panel-default" style="margin-bottom:10px;">'; 
    $html .= '<div class="panel-heading" role="tab" id="'.$headingID.'">'; 
    $html .= '<h4 class="panel-title">'; 
    $html .= '<a role="button" data-toggle="collapse" data-parent="'.$parent; 
    $html .= '" href="#'.$bodyID.'" aria-expanded="true"'; 
    $html .= 'aria-controls="'.$bodyID.'">'.$type; 
    $html .= '</a></h4></div>'; 

    $html .= '<div id="'.$bodyID.'" class="panel-collapse collapse in" '; 
    $html .= 'role="tabpanel" aria-labelledby="'.$headingID.'">'; 

    $html .= '<div class="list-group">'; 
    foreach ($subTypes as $subType) { 
     $target = "tab-".$prefix.$type."-".$subType; 
     $html .= '<a href="#'.$target.'" class="list-group-item" '; 
     $html .= 'aria-controls="'.$target.'" role="tab" data-toggle="tab"'; 
     $html .= '>'.$subType.'</a>'; 
    } 

    $html .= '</div></div></div>'; 
    return $html; 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 
<style> 
.list-group-item.active, .list-group-item.active:hover { 
    background-color: white; 
    color: black; 
} 
</style> 
</head> 
<body> 
<div class="container"> 
<div class="page-header"> 
    <h1>Configuration Management</h1> 
</div> 

<div class="row"> 
    <div class="col-md-5 col-md-push-1 col-sm-6"> 
     <ul class="nav nav-tabs" role="tablist" id="config-tabs"> 
      <li role="presentation" class="active"> 
       <a href="#project_list" aria-controls="project_list" role="tab" data-toggle="tab"> 
        <h4>Project</h4> 
       </a> 
      </li> 
      <li role="presentation"> 
       <a href="#workflow_list" aria-controls="workflow_list" role="tab" data-toggle="workflow_list"> 
        <h4>Workflow</h4> 
       </a> 
      </li> 
     </ul> 
     <div class="tab-content"> 
      <div role="tabpanel" class="tab-pane active panel-group" id="project_list" role="tablist" aria-multiselectable="true"> 
       <?php 
        foreach ($project_types as $type) { 
         echo makeSection('#project_list', 'project-',$type, $project_subtypes[$type]); 
        } 
       ?> 
      </div> 
      <div role="tabpanel" class="tab-pane panel-group" id="workflow_list" role="tablist" aria-multiselectable="true"> 
       <?php 
        foreach ($workflow_types as $type) { 
         echo makeSection('#workflow_list', 'workflow-',$type, $workflow_subtypes[$type]); 
        } 
       ?> 
      </div> 
     </div> 
    </div> 
    <div class="col-md-5 col-md-push-1 col-sm-6"> 
     <div id="tabs" class="tab-content" style="padding:0em 0em 0em 1em"> 
      <?php 
       foreach ($project_types as $type) { 
        // @TODO remove once folder structure is all setup 
        if ($type !== 'CD') continue; 

        foreach ($project_subtypes[$type] as $subType) { 
         $html = "<div role ='tabpanel' class='tab-pane'"; 
         $html .= "id='tab-project-".$type."-".$subType."'>"; 
         $html .= makeInfoSection($type, $subType, $project_versions[$subType], $project_dir); 
         $html .= "</div>"; 
         echo $html; 
        } 
       } 

       foreach ($workflow_types as $type) { 
        foreach ($workflow_subtypes[$type] as $subType) { 
         $html = "<div role ='tabpanel' class='tab-pane'"; 
         $html .= "id='tab-workflow-".$type."-".$subType."'>"; 
         $html .= makeInfoSection($type, $subType, $workflow_versions[$subType], $workflow_dir); 
         $html .= "</div>"; 
         echo $html; 
        } 
       } 
      ?> 
     </div> 
    </div> 
</div> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="12345" crossorigin="anonymous"></script> 
<script type="text/javascript"> 
    function build (url, params, cb) { 

     url += "/buildWithParameters"; 
     //Added so we set the $_GET['func'] 
     url += "?func=build"; 

     $.ajax({ 
      type: 'POST', 
      url: url, 
      data: params, 
      success: cb 
     }); 
    }; 

    $('.collapse').collapse(); 

    $('.list-group a').click(function (e) { 
     e.preventDefault(); 
     $(this).tab('show'); 
    }); 

    $('#config-tabs a').click(function (e) { 
     e.preventDefault(); 
     $(this).tab('show'); 
    }) 
</script> 
</body> 
</html> 

我只能改變你的代碼的2段。

正好在setup setup.php之下,並且在你的Javascript構建函數中。

如果你需要傳遞參數給它,你當前的構建函數是空的,你調用build(),但是構建需要3個參數。

因此,在url爲空(或在這種情況下未定義)的情況下,您可能會發現url不會到達正確的位置。 Params是空的以及cb。因此,所有這些可能需要在您的功能內檢查

if(typeof VARIABLE == "undefined") VARIABLE="SOMETHING"; //populate, you can also call a function here to get data.