2009-11-14 81 views
0

目前我有一個PHP頁面query.php與呈現的國家的名單有一個提交按鈕形式:PHP - 表單加載表單加載表單?

Countries 
[] nation1 
[] nation2 
[] nation3 
[] nation4 
SUBMIT 

他們複選框相同的數組,並在窗體引用的頁面<form method="post" action="query.php">

當按下提交按鈕,查詢被上拉了基於選擇的行動者的名單與dBASE運行,並創建第一個低於一個新的複選框列表:

Countries 
[] nation1 
[] nation2 
[] nation3 
[] nation4 
SUBMIT 

You have chosen countries ____. 

Actors 
[] guy1 
[] guy2 
[] guy3 
[] etc 
SUBMIT 

目前,第二個表單調用一個新的PHP文件<form method="post" action="movie-query.php">,它根據所選演員搜索dbase並返回包含它們的所有電影。

我想知道是否有任何方法可以將這一切保存在一個頁面上?當我使用第二個提交選項時,我無法弄清楚如何讓搜索結果在query.php內顯示。如果我的第二種形式設置爲<form method="post" action="query.php">它所做的只是重新query.php到其原始狀態的:

Countries 
[] nation1 
[] nation2 
[] nation3 
[] nation4 
SUBMIT 

而不是到一個類似於:

Countries 
[] nation1 
[] nation2 
[] nation3 
[] nation4 
SUBMIT 

You have chosen countries ____. 

Actors 
[] guy1 
[] guy2 
[] guy3 
[] etc 
SUBMIT 

You have chosen actors _____. 

Movie Results 
1. movietitle 
2. movietitle 
3. movietitle 
4. etc. 

都出現在同一個頁面上。

任何想法?謝謝。

回答

1

AJAX的可用性,但請確保您的窗體在JS被禁用/不支持時工作。在這種情況下,您可以包含一系列包含:無論何時發送表單輸入,表單都包含下一個表單。

/* At the end of query.php */ 
include_once('countryFields.php'); 
if (isset($_REQUEST['countries'])) { 
    include_once('queryActor.php'); 
} 
echo '</form>'; 

/* At end of queryActor.php */ 
include_once('actorFields.php'); 
if (isset($_REQUEST['actors'])) { 
    // query results will end up within <form> but that's OK 
    include_once('movie-query.php'); 
} 

每個'* Fields.php'生成一個表單的字段;對於每個'* Fields.php',都有一個相應的'* Form.php'。

/* actorForm.php */ 
<form action="movie-query.php" method="POST" name="actorForm"> 
    <?php include('actorFields.php'); ?> 
</form> 
<script type="text/javascript"> 
    // AJAX stuff here 
</script> 

在這個例子中,你的基於AJAX的邏輯將提交給「* form.php的」腳本,而您的非JS邏輯將提交給「query.php」。您可以無限期地擴展級聯(儘管這會影響可用性)。在'* Fields.php'中,檢查它創建的字段的用戶輸入,這樣你就不會失去一個步驟。

/* in actorFields.php */ 
if (!isset($_POST['countries'])) { 
    $_POST['countries'] = array(); 
} 
if (!isset($_POST['actors'])) { 
    $_POST['actors'] = array(); 
} 
... 
/* Get actors from datastore. Keys of $actors are IDs from the datastore. */ 
$actors = Actors::forCountries($_POST['countries']); 
/* when generating list of checkboxes, check any actors set in $_POST['actors'] 
    For example: 
*/ 
foreach ($_POST['actors'] as $id) { 
    $actors[$id]->checked = 'checked'; 
} 
echo '<ul id="Actors">'; 
foreach ($actors as $id => $actor) { 
    echo "<li><label for='actor[$id]'></label><input type='checkbox' name='actors[$id]' value='$id'",($actor->checked ? ' checked': ''),"/>{$actor->name}</li>"; 
} 
echo '</ul>'; 

「actorFields.php」示例中的一些操作與您在生產代碼中執行的操作不同。首先,生成列表視圖的代碼將在另一個腳本中。

+0

謝謝。我的確關心如何創建一個可用於不支持JS的人的頁面。 – Drew 2009-11-15 01:14:42

2

Ajax?

如果您不熟悉,請查看Prototype,jQuery,mootools或Dojo。您可以向選擇的國家/地區的服務器發送請求,以獲取演員選擇,然後再做另一個獲取電影。

我建議使用JSON來編碼數據。 PHP的json_encode()和json_decode()很棒。

+0

你怎麼得到一個烏痕徽章?我恨你。我一直在努力,但是沒有...愚蠢的時區沒有對齊好。無論如何...這個答案無論如何是一個好的開始。你會想要使用ajax是的,但是...有趣的搞清楚:D – mpen 2009-11-14 05:09:48