2012-02-24 30 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

相關問題