0

尊重地,

我正在寻找一种方法来在 PHP 中组织我的 HTML 标记,以便在提供主要静态内容的网站中使用(阅读:对于 .edu 网站)。(虽然这是这个问题的主旨,但我肯定也对非静态案例感兴趣,因为我可能很快“需要”处理会话和用户登录事件等)

我经常看到用于 PHP(以及 Coldfusion、.NET 等其他语言)的模式如下:

// define header stub in header.php
<!DOCTYPE html>
<html>
    <body>
        <div id="headerWrapper">
            <!-- header content goes here -->
        </div>
        <div id="contentWrapper">
// end header stub

// define footer stub in footer.php
        </div><!-- end contentWrapper -->
        <div id="footer">
            <!-- footer content goes here -->
        </div>
    </body>
</html>
// end footer stub

要使用这种模式,我会这样定义一个内容文件:

// define content stub in contentFile.php
<?php include("header.php") ?>
            <p>hello world</p>
            <!-- other content goes here -->
<?php include("footer.php") ?>
// end content stub

我正在寻找更多。我在上面的例子中遇到的问题是一般模式所需的耦合级别。也就是说,例如 header.php 和 footer.php 之间存在一些重要的依赖关系(即页面结构、悬空的 contentWrapper div 标签,以及在较低级别上,不可避免的 css 和 js 包含并非每个页面都需要) . 我正在寻找专门的封装。我理想的内容页面应该是这样的:

    // ideal.php
    <?php
        $someObj.pageTitle="My First Page!!!";
        $someObj.headInclude("/css/960.css");
        $someObj.headInclude("/js/myFancyThing.js");
        $someObj.preferedTemplate = "default"; /* or maybe "MathDept" or something like that */
    ?>
    <!-- page content goes here, just semantic and structural markup, let the 
template handle H1 and Paragraph formatting :) -->
    // end ideal stub

最后一种模式是我非常希望看到的。在我看来,对于内容与演示的分离来说,这是一个更优雅的解决方案。我不知道如何在 PHP 中表达这一点,但我怀疑这是可行的。非常感激任何的帮助!谢谢!!!:)

/* 我希望我所问的内容具有适当的范围和标题。否则请原谅我;我对 Stack Exchange、PHP 和几乎所有东西还是有点陌生​​,哈哈 */

4

1 回答 1

0

有了这种(优秀的)思维和方法,您很快就会发现自己重新发明了 MVC 设计模式。我强烈建议您查看 Zend 框架的表示层方法。他们使用两步设计(布局+视图)。这是该模式的一个简单示例:

控制器:

public function someAction()
{
    // Add the CSS files.
    $this->view->headLink()
        ->appendStylesheet($this->view->baseUrl() . '/css/site.css')
        ->appendStylesheet($this->view->baseUrl() . '/css/ie6.css', 'screen', 'IE 6')
        ->appendStylesheet($this->view->baseUrl() . '/js/jquery/plugins/ui/css/ui-lightness/jquery-ui-1.8.18.custom.css', 'screen')

    // Add the JavaScript files.
    $this->view->headScript()
        ->appendFile($this->view->baseUrl() . '/js/jquery/jquery-1.9.1.min.js')
        ->appendFile($this->view->baseUrl() . '/js/jquery/plugins/ui/jquery-ui-1.8.17.custom.min.js')
        ->appendFile($this->view->baseUrl() . '/js/modernizr.js');

    // Add the meta tags.
    $this->view->headMeta()
        ->appendHttpEquiv('X-UA-Compatible', 'IE=edge')
        ->appendName('description', '...')
        ->appendName('keywords', '...');

    // Render the View.
    $this->view->render();
}

布局:

<?php
$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
echo $this->doctype(); ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <?php echo $this->headMeta(); ?>
    <?php echo $this->headTitle(); ?>
    <?php echo $this->headLink();?>
    <?php echo $this->headScript();?>
</head>
<body>


    <div id="wrapper">

        <?php echo $this->partial('partials/header.phtml');?>

        <?php echo $this->layout()->content;?>

        <?php echo $this->partial('partials/footer.phtml');?>

    </div>

</body>
</html>

看法:

<h1>This View script is rendered by the View and will get injected into the layout.</h1>
<div>Page specific markup goes in this file</div>

如果您决定走这条路,请在自己编写框架代码之前三思而后行。

链接: http: //framework.zend.com/manual/2.0/en/modules/zend.view.quick-start.html

于 2013-04-04T12:06:04.897 回答