如何在PHP应用程序上管理页面/表单?

时间:2012-02-24 15:26:26

标签: php design-patterns

我是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 ['action']数据切换分支进行管理,但我不知道这是最好的方式)

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

  • 中“定义”的常量布局

我有一些关于PHP的书籍,但是没有关于如何构建应用程序的书籍。它们都是关于PHP语言和单页/文件上的简单任务。

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

我一般都没有编程问题(im windows app程序员)。

3 个答案:

答案 0 :(得分: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";
?>  

它将处理您的数据,并在成功时重定向到同一页面或显示错误填写的表单

这个主要的想法是用户友好的表单处理和业务逻辑/显示逻辑分离,同时保持最自然的站点布局 - 不同站点模块的单独文件,但常见的设计。

答案 1 :(得分:1)

只需将GET参数?page=add_product?page=add_category传递给您的index.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-Approach:

/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;

答案 2 :(得分:0)

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

首先,您可能希望将数据发布到表单中,因此请在表单中添加action =“add_category.php”和method =“post”。 POST总是更好,以便在URL(GET)中传递数据时避免错误。

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

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

count($ errors)== 0表示您没有错误,然后您可以插入/更新您的数据库,并且您可以向用户显示一条消息,说明插入已完成,或者使用位置重定向他:例如,标题到类别列表。