2011-11-19 108 views
1

我不確定是否允許我在這裏問一個更實際的問題,因爲這個問題不像給出好的建議那樣支持。PHP佈局管理器

我有一個簡單的佈局管理器(缺乏更好的術語),它有效地加載默認(或自定義,如果指定的話)HTML「佈局」,或骨架,並根據用戶頁面請求的前端控制器,將將另一個文件(稱爲視圖文件)插入骨架內容區域。

一個骨架可能看起來是這樣的:

<div id="header"> 
    <h1>head goes here</h1> 
<div id="content"> 
    <?php $this->insertContent(); ?> 
</div> 
<div id="footer"> 
    <p>footer goes here</p> 
</div> 

雖然很簡單,這使得它容易使將來的更新,因爲如果客戶現在要我添加一個jQuery的滾動,我可以將其添加到單一佈局可能會導致不得不編輯多個文檔來實現相同的功能。

但是,我的朋友說他認爲這不是一個好的解決方案,並且認爲我不應該拆分我的「視圖」文件和佈局,而是堅持使用前端控制器,我的html頁面應該使用php include(include header和頁腳),並讓我的html頁面中爲1的文件,因爲:

  1. 的佈局管理器會使我的應用程序不夠靈活,因爲我自己綁定到一個單一的佈局(除非我創建了一個新的佈局,並在我的網頁控制器文件指定它應該使用不同的佈局)。
  2. 其他開發人員將有一個艱難的時間理解的邏輯和我創建超過所需的
  3. 簡單的HTML開發者不能做,因爲他們可以在片段只有真正的工作是放在附近,以整個HTML文檔正確的測試更多的工作並看到更大的圖片。
  4. 這更令人困惑,因爲要更改頁面我需要在視圖文件或框架文件中進行修改,並且您需要知道何時編輯框架文件。

我將很快開始開發一個項目,該項目將有多個發展階段,這是至關重要的,我做出這個決定,因爲我希望應用程序儘可能靈活,創造儘可能少的工作,如可能的,但也建立它,以便我可以輕鬆地對網站進行修改,改進或更改。我真的很看重一些建議,因爲這個論點現在是基於2個人的個人意見。任何要考慮的要點,以及可能的信息,關於如何更大的主流框架和CMS的工作也能幫助我做出更好的決定。

回答

3

你所做的是所謂的Two Step ViewPattern

這是一種常見的模式,如果你這樣記錄它,任何開發人員都很容易理解它。

每種模式都有其優點和缺點,我建議閱讀福勒書中的相關章節,以獲得一個良好的介紹和一個基地,你可以讓你的想法。

術語佈局更爲廣泛,但開發人員也很瞭解,但並不十分精確。

+0

最後一個術語,我試圖很難解釋:) – mauzilla

-1

看看Smarty。

http://www.smarty.net/

WordPress使用的Smarty的變種一樣,我自己的CMS。我確定其他大型CMS使用Smarty或者做同樣的事情的替代品

+0

Wordpress不使用Smarty的變體。 – hakre

+0

我最近沒有在Wordpress上工作過,但是我幾年前幫助Donncha做了一些工作,這絕對是Smarty(http://verens.com/2004/08/12/integrating-wordpress-with-smarty-continued /) –

+0

Intersting,但最終從未進入WordPress。 – hakre

1

Zend_Layout是您唯一需要佈局管理的東西,非常有幫助。

雖然你可以很容易地實現你自己的一個。事情是這樣的:使用https://github.com/mahadazad/php-layout-manager其簡單,可以用笨藏漢集成

<?php 

class Layout 
{ 

    private $_data = array(); 

    public function __set($name, $value) 
    { 
     $this->_data[$name] = $value; 
    } 

    public function __get($name) 
    { 
     return array_key_exists($name, $this->_data) ? $this->_data[$name] : NULL; 
    } 

    public function __isset($name) 
    { 
     return isset($this->_data[$name]); 
    } 

    public function __unset($name) 
    { 
     unset($this->_data[$name]); 
    } 

} 

// Usage 

$layout = new Layout(); 

$layout->title = 'Welcome to my application mate!'; 

$layout->content = load_content_from_template('template_file.php'); 

$layout->scripts = array(
    'jquery', 
    'jquery.plugin' 
); 

$layout->scripts[] = 'common'; 

?> 

// Inside the layout file, assuming that $layout variable is available in this scope. 

<html> 
<head> 
    <title><php echo $layout->title ?></title> 
</head> 
<body> 

    <div id="content"> 
     <php echo $layout->content ?> 
    </div> 

    <?php 
     foreach ($layout->scripts AS $script) 
      echo '<script type="text/javascript" src="/path/to/scripts/directory/' . $script . '.js"></script>'; 
    ?> 

</body> 
</html> 
+0

這也是我通常做的,除了我也有一個方法來包含佈局/視圖實例的HTML模板。通過這種方式,您可以在模板中以'$ this-> varName'的形式訪問變量,並且您可以確保只能訪問佈局實例的屬性(當然也可以是全局的)。我認爲這在ZF中也是這樣做的。 – AJJ