2011-01-05 59 views
0

我使用以下作爲Frontpage/Page Controller(s)並且目前工作正常,除了兩個我正面臨的問題,您可以看到$ pages數組和開關,它們是實際上我在這裏粘貼的時間要長得多。每次都需要一個新的頁面控制器,我必須將它添加到$ pages數組中,並切換使列表很長的列表。你如何克服這個問題,你看到這個代碼有任何其他的改進? loadLogic()在頁面控制器中它用於獲取pages/controllername/logic/function.php下的函數。PHP首頁/頁面控制器

頭版控制器 - 的index.php:

include 'common/common.php'; 
if(!isset($_GET['p']) OR $_GET['p'] == ''){ 
    $_GET['p'] = 'home'; 
    header('Location: index.php?p=home'); 
} 

$pages = array('home','register','login','logout','page1','page2','page3'); 

$_GET['p'] = trim($_GET['p']); 

if(isset($_GET['p'])){ 
    if(in_array($_GET['p'], $pages)){ 
     switch ($_GET['p']) { 
      case 'home': 
       include 'home.php'; 
       break; 
      case 'register': 
       include 'register.php'; 
       break; 
      case 'login': 
       include 'login.php'; 
       break; 
      case 'logout': 
       include 'logout.php'; 
       break; 
      case 'page1': 
       include 'page1.php'; 
       break; 
      case 'page2': 
       include 'page2.php'; 
       break; 
      case 'page3': 
       include 'page3.php'; 
       break; 
     } 
    }else{ 
     echo '404!'; 
    } 
} 

頁控制器 - {家,註冊,登錄,註銷,第1頁,第2頁,第3頁} .PHP:

include 'tpl/common/header.php'; 
contentStart(); 

if(isset($_SESSION['logged'])){ 
    loadLogic('dashboard'); 

}else{ 
    loadLogic('nologin'); 

} 


//Display login form in logic page instead links 
// 
if(!isset($_SESSION['logged'])){ 
    contentEnd(); 
    loadLogic('nologinForm'); 
}else{ 
    contentEnd(); 
    include'tpl/common/rcol.php'; 

} 
include 'tpl/common/footer.php'; 

功能loadLogic() :

function loadLogic($logic) { 
    $path = dirname(__DIR__) . '/pages'; 

    $controller = preg_split('/&/',$_SERVER['QUERY_STRING']); 
    $controller = trim($controller[0],"p="); 
    $logicPath = 'logic'; 
    $logic = $logic . '.php'; 
    $err = 0; 
    $logicFullPath = $path.'/'.$controller.'/'.$logicPath.'/'.$logic; 

    if($err == '0'){ 
     include "$logicFullPath"; 

    } 
} 

文件夾結構:

projectName 
    | 
    ---> common 
    | 
    ---> pages 
    | | 
    | --->home 
    | | 
    | --->register 
    | | 
    | --->login 
    | | 
    | --->logout 
    | | 
    | --->page1 
    | | 
    | --->page2 
    | | 
    | --->page3 
    | 
    ---> tpl 
    | | 
    | ---> common 
    | 
    --> home.php 
    | 
    --> register.php 
    | 
    --> login.php 
    | 
    --> logout.php 
    | 
    --> page1.php 
    | 
    --> page2.php 
    | 
    --> page3.php 

回答

2

對於frontpage控制器,爲什麼這麼多case語句。您已經知道哪些頁面有效,並檢查它是否在有效頁面中。

你可以這樣做:

if(isset($_GET['p'])) 
{ 
    if(in_array($_GET['p'], $pages)) 
    { 
     include($_GET['p'] . '.php'); 
    } 
} 

如果你希望它有傳遞到$ _GET的混淆,有不同的潛在擴展沿着不同的名字,那麼你可以做:

$pages = array('home'=>'index.php','register'=>'registerpage.htm','page1'=>'one.html'); 

if(isset($_GET['p'])) 
{ 
    if(array_key_exists($_GET['p'],$pages)) 
    { 
      include($pages[$_GET['p']]); 
    } 
} 

如果你想使頁面更容易管理,你可以把它分成多行:

$pages = array(
'home'=>'index.php', 
'register'=>'registerpage.htm', 
'etc'=>'/home/user/public_html/directory/etc.php' 
); 

呵呵,因爲主頁是http://www.domain.com/?p=home是一種醜陋的行爲,如果p的值不在數組中或不是數組鍵,那麼取決於你將使用哪一個,將home設置爲默認包含。

所以:

if(isset($_GET['p']) && in_array($_GET['p'],$pages)) //You can combine these like this as well, same functionality. If p isn't set, it won't even try the in_array() 
{ 
    include($_GET['p'] . '.php'); 
} 
else 
{ 
    include('home.php'); 
} 

然後你就可以擺脫的,如果isset $ _GET [ 'P']或$ _GET [ 'P'] == '' 在頂部!您還可以將isset和in_array/array_key_exists組合成同樣的if語句,並使用& &。如果第一次評估是錯誤的,並且它碰到了一個& &那麼它就停止並且不評估其餘部分,所以沒有錯誤或任何事情,這也意味着您可以輕鬆設置默認響應一次,因爲它們是嵌套的你必須有兩個ifs的默認值。

更多編輯。在

if(isset($_GET['p'])) 
{ 
$fourohfour = true; 
} 

再下來:如果你真的想要當用戶嘗試訪問AP有404 =這是不存在的,而不是剛剛啓動到首頁,你可以在上面做如果結構包含頁面,則在else包括home之前執行其他操作。PHP的,如:

else if(isset($fourohfour)) 
{ 
    include('404.php'); 
} 

因此,如果p設定,但不檢查出那麼它將包括404,但如果沒有設置它,它會去home.php

+0

@Phoenix謝謝對於你的建議到目前爲止,還有什麼其他的你可以告訴我有關FrontPage /頁面控制器的一般情況嗎?有小費嗎?我會再等一兩個小時,如果這個問題沒有更多的答案,我會將你的標記標記爲已接受。 – afarazit 2011-01-05 05:28:38

+0

那麼,你可能會考慮查找如何執行.htaccess重寫規則,以便當用戶轉到?p = pageone時,它將顯示爲/ pageone。您也可以使用與首頁控制器相同的邏輯來控制子頁面的子頁面。我有一個類似的系統,只有一個文本文件庫,並且?p = library只會去一個書籍索引,並且?p = library&lib = book1會去找這本書。圖書館頁面具有圖書索引,因爲它是默認包含,並且使用file_exists()檢查了$ _GET ['lib']與指定目錄中的txt文件並將其包含在其中,或者在默認情況下檢查了它。 – Phoenix 2011-01-05 05:40:20

+0

另外,另一種形式的混淆正在改變擴展。包含的文件可以字面上有任何擴展名,可以是home.gobbledygook。包括幾乎包括所有相同,如果它發現內部的PHP代碼,它會運行它。您可以將.php重命名爲.jpg,它將運行代碼。只要確保apache或任何你使用的服務器將它視爲一個php文件,如果直接請求的話,或者不允許從服務器外部訪問,否則如果有人猜到了這個名字和擴展名,這個源代碼將是可下載的,但是即使你沒有,它仍然會運行。 – Phoenix 2011-01-05 05:51:39