2009-11-14 53 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