2012-02-24 34 views
0

即时通讯新的PHP和im试图写简单的网上商店。如何管理PHP应用程序上的页面/表单?

比方说有索引文件是这样的:

<?php 
require_once '/inc/db.php'; 
$db = new Db(); 
?> 

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
     <div id="header"><?php require_once("header.php"); ?></div> 

     <div id="content"> 
       <?php 
        // i have no idea what to put here 
       ?> 
     </div> 

     <div id="footer"><?php require_once("footer.php"); ?></div> 
</body> 
</html> 

我创建的文件 “add_category.php” 和 “add_product.php”,它们包含HTML表单。他们正在工作,但我想在内容div中显示该表单,并将数据保存在数据库中,并且我有问题。我想申请我的全局页眉,页脚等,我不想复制我的布局从索引文件到我的应用程序的每种形式。

我不知道:

  • 如何在我的(现在我试着用$ _ POST [“行动”]数据交换分支管理显示不同势“网页”,但我不知道这是最好的方式)

  • 我应该从哪里发送数据?我的意思是“行动”属性。换句话说 - 我应该在哪里处理数据保持它在的index.php

我对PHP的一些书“定义”不断布局,但没有一本书,上面写着如何构建应用程序。它们都是关于PHP语言和单页/文件的简单任务。

我需要简单的模式/示例/文章关于管理表单/页面并在它们之间进行通信(通过POST例如)。试图从Wordpress的来源学习,但这对我来说太复杂了(大型复杂的注册表,对象缓存等)。

我没有编程的一般问题(im windows应用程序员)。

+0

WordPress的的确是可怕的例子可以借鉴,我自己有困难的时候,当我必须深入研究它的胆量。 – 2012-02-24 15:53:54

回答

3

不必将脚本包含到主站点模板中,而必须完全相反 - 将您的模板包含到PHP脚本中。
您可以单独处理您的脚本,或者创建一个入口点。两种方法没有太大的差别,但我建议使用前者作为初学者。

因此,让您的网站由页面,页面模板和主要模板组成。
一旦调用脚本,它必须处理数据,然后负载网站模板,这反过来,将加载页面模板。

一个例子布局将是这样的: 页:

<? 
//include our settings, connect to database etc. 
include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php'; 
//getting required data 
$DATA=dbgetarr("SELECT * FROM links"); 
$pagetitle = "Links to friend sites"; 
//etc 
//and then call a template: 
$tpl = "links.tpl.php"; 
include "template.php"; 
?> 

它输出什么但只收集所需数据,并调用模板:

template.php这是你的主站模板,

由您的页眉和页脚组成:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>My site. <?=$pagetitle?></title> 
</head> 
<body> 
<div id="page"> 
<? include $tpl ?> 
</div> 
</body> 
</html> 

,并调用实际的页面模板:

<h2><?=$pagetitle?></h2> 
<ul> 
<? foreach($DATA as $row): ?> 
<li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li> 
<? endforeach ?> 
<ul> 

对于形式,它是好主意,使表单的动作非常相同的页面(这样,你可以离开表单操作简单空白)。
请求将被发送到同一个页面,在其顶部,你可以把这样的代码:

<? 
if ($_SERVER['REQUEST_METHOD']=='POST') { 

    $err = array(); 
    //performing all validations and raising corresponding errors 
    if (empty($_POST['name']) $err[] = "Username field is required"; 
    if (empty($_POST['text']) $err[] = "Comments field is required"; 

    if (!$err) { 
    //if no errors - saving data and redirect 
    header("Location: ".$_SERVER['PHP_SELF']); 
    exit; 
    } else { 
    // all field values should be escaped according to HTML standard 
    foreach ($_POST as $key => $val) { 
     $form[$key] = htmlspecialchars($val); 
    } 
} else { 
    $form['name'] = $form['comments'] = ''; 
} 
$tpl = "form.tpl.php"; 
include "template.php"; 
?> 

它会处理你的数据,要么重定向到同一页面上的成功或显示填充在错误

这样做的主要思想形式是用户友好的表单处理和业务逻辑/显示逻辑分离,同时保持最自然的网站布局 - 独立的文件不同的网站模块还共同设计。

+0

这是非常明确和有用的答案。谢谢。 – Kamil 2012-02-24 15:51:40

+0

很高兴帮助。随意提出进一步的问题。我对这个设计进行了真实生活项目的测试,希望我学到了一些陷阱。 – 2012-02-24 15:55:02

+0

通过非常相同的页面你的意思是index.php?还有一个关于上次代码粘贴的问题。如果我有更多表单呢?我会把所有的验证器放在我的主文件中?或者把它们和我的表单一起存档?而我应该把数据库插入? – Kamil 2012-02-24 15:57:22

0

开始与基础: http://www.tizag.com/phpT/forms.php

首先,你可能希望你的数据发布到你的表单,所以添加行动=“add_category.php”和方法=“后”到表单中。在URL中传递数据(GET)时,通常会更好地避免错误。

然后在PHP部分,首先检查$ _SERVER ['REQUEST_METHOD']变量。如果它显示'POST',则表示表单已提交。 使用isset()检查所有变量以避免php通知,并对这些变量进行任何验证。例如:$ _POST ['category']> 0.

我通常将所有错误存储在一个$ errors数组中,并根据以前的验证显示错误。

count($ errors)== 0意味着您没有错误,您可以插入/更新数据库,并且可以向用户显示一条消息,指出插入已完成,或使用位置重定向他:头部到例如类别列表。

+0

请在链接失效的情况下,将链接摘要添加到答案中。 – 2012-02-24 15:32:12

+0

-1我有语言没有问题,我问了一下良好格局,而不是“如何创建函数”或“如何创建HTML表单” – Kamil 2012-02-24 15:36:41

1

只是通过一个GET参数?page=add_product?page=add_categoryindex.php,包括匹配的PHP脚本:

<?php 
require_once '/inc/db.php'; 
$db = new Db(); 

// if no page-parameter was send, have a default page to display. 
define("DEFAULT_PAGE", "my_default_page.php"); 

if (isset($_GET["page"])) 
{ 
    switch ($_GET["page"]) 
    { 
     case "add_product": $page = "add_product.php"; break; 
     case "add_category": $page = "add_category.php"; break; 
     // add more cases here 
     default : $page = DEFAULT_PAGE; 
    } 
} 
else 
    $page = DEFAULT_PAGE; 
?> 

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
     <div id="header"><?php require_once("header.php"); ?></div> 

     <div id="content"> 
       <?php 
        require $page; 
       ?> 
     </div> 

     <div id="footer"><?php require_once("footer.php"); ?></div> 
</body> 
</html> 

编辑:MVC-方法:

/index.php 
/controllers/home.php    Default page with some welcome stuff. 
/controllers/new_product.php  Display form for creating a product. 
/controllers/create_product.php  Process POST-data and create a product. 
/controllers/new_category.php  Display form for creating a category. 

的index.php:

define("DEFAULT_PAGE", dirname(__FILE__)."/controllers/home.php"); 

// Did the user pass page? 
if (isset($_GET["page"]) 
// Does page contain a valid controller name? 
&& preg_match("~^[a-zA-Z_]+$~D", $_GET["page"]) 
// Does this controller exist? 
&& file_exists(dirname(__FILE__)."/controllers/".$_GET["page"].".php")) 
{ 
    // Controller exists. 
    $page = dirname(__FILE__)."/controllers/".$_GET["page"].".php"; 
} 
else 
    $page = DEFAULT_PAGE; 
+0

在更简单的应用程序中使用类似这样的东西。但我不知道我应该从“add_product.php”发送POST请求。当我按下窗体上的按钮时,我会去那个页面,而不是index.php ... – Kamil 2012-02-24 15:43:08

+0

如果你想要去index.php,那么在你的窗体的action属性中写下:

'。您可以将'$ _GET'更改为'$ _REQUEST'以匹配'$ _GET'和$ _POST'参数,并在您的表单中包含一个隐藏输入,如'。 – Basti 2012-02-24 15:50:32

+0

林不知道,但建设这样的应用程序,我将有大型开关导航和表单数据处理树。 – Kamil 2012-02-24 16:04:55

相关问题