【问题标题】:php template for different pages with different css and mysql具有不同css和mysql的不同页面的php模板
【发布时间】:2011-05-24 09:44:07
【问题描述】:

您好,我想弄清楚如何用一个类做一个 PHP 模板系统,我不喜欢 header.php footer.php 或 smarty 之类的,只想要 template.html、class.php 和 page1 .php、page2.php 等... 使用我自己的 php 代码,我发现很多网站有人教如何做到这一点,但我仍然有很多问题。

1) 我想在某些页面上添加额外的 css

2) 一些页面有 php 代码,如 mysql 查询和类似的东西

3) 我想要在模板中作为变量的 CONTENT 不仅是单词,而是大量的 div 和东西,在某些页面中,CONTENT 变量内部也有查询,比如填写一个(例如)下拉菜单。

希望有人可以指导我,我实际上有我的模板来解释,(标签只是随机的)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<title>CompanyName | ##TITLE##</title>

<link href="layout.css" rel="stylesheet" type="text/css" />
<link href="styles.css" rel="stylesheet" type="text/css" />
##EXTRA_CSS##
<link rel="shortcut icon" href="/favicon.ico" />

<!--[if IE 6]>
    <script src="DD_belatedPNG_0.0.8a-min.js"></script>
    <script>
            DD_belatedPNG.fix('img, div');
    </script>
<![endif]--> 

##EXTA_JS##

</head>

<body>

    <div id="main">  
        <div id="container_black">
            <div id="container_white">

                <div id="container_header">

                    <div id="logo_top"></div>           
                    <div id="lineas_verticales_top">
                        <div class="volver_portada"><a href="index.shtml">Volver a portada</a></div>
                        <div class="english_spanish"><u>Español</u> | <a href="../en/index.shtml" class="english_spanish">English</a></div>
                    </div>
                    <div id="nav_bar_black"><div id="nav_bar_red"><div id="nav_bar_yel">

                        <ul class="menuholder"> 
                            <li class="menu_principal"><a href="#" title="Principal">Principal</a></li> 
                            <li class="menu_empresa"><a href="#" title="Empresa">Empresa</a></li> 
                            <li class="menu_productos"><a href="#" title="Productos">Productos</a></li> 
                            <li class="menu_clientes"><a href="#" title="Clientes">Clientes</a></li> 
                            <li class="menu_recetas"><a href="#" title="Recetas">Recetas</a></li> 
                            <li class="menu_contacto"><a href="#" title="Contacto">Contacto</a></li> 
                        </ul> 

                    </div></div></div>
                    <div id="topbg_degr"></div>

                </div>

                <div id="container_left">
                    <div id="conmargen_left_top"></div>
                    <div id="container_conmargen_left_middle">

                        ##CONTENT##

                    </div>
                    <div id="conmargen_left_bottom"></div>

                    <!--[IF INDEX]
                    <div id="fono"></div>
                    <div id="dir"></div>
                    -->

                </div>

                <!--[IF INDEX]
                <div id="nav"></div>
                -->

                <div id="container_right">
                    <div id="conmargen_right_top"></div>
                    <div id="container_conmargen_right_middle">

                        <!--[IF PAGE OR PAGE OR PAGE]
                        <a href="#" id="recetas_poster" title="recetas"></a>
                        [ELSE IF]
                        <a href="#" id="clientes_poster" title="recetas"></a>
                        [ELSE IF]
                        <a href="#" id="productos_poster" title="recetas"></a>

                        -->

                    </div>
                    <div id="conmargen_right_bottom"></div>
                </div>

                <!--[IF INDEX]
                <div id="frame_facebook">
                <a href="#" class="facebook" title="CompanyName"><span>CompanyName</span> en Facebook</a>
                <div class="breakL"></div>
                <fb:like href="#" layout="button_count" show_faces="true" width="100" font="tahoma"></fb:like>
                </div>
                -->

                <br/>   

            </div> <!-- cierre del container white -->
        </div> <!-- cierre del container black -->

        <div id="footer">   
                <div class="footer_comment">
                    CompanyName Todos los derechos reservados 2011
                </div>
        </div>

    </div> <!-- cierre del main -->
<br/>

</body>

</html>

例如contact.php,内容将是一个表单,在页面顶部我有这个巨大的php代码,我在这里验证和所有。

如果有人能让我走上正确的道路,我将不胜感激。先感谢您。

【问题讨论】:

标签: php model-view-controller templates variables


【解决方案1】:

您可能有一百种不同的方法可以解决这个问题,每种方法都有自己的优缺点 - 正如您已经说过的那样,使用数据库和/或 ajax 调用和/或页眉和页脚。您确实必须弄清楚哪种方式最适合您的特定项目或编码风格,或两者兼而有之。

但是 - 如果你真的只想要“template.html”,但有一些包含 PHP、javascript、MySQL 或其他任何内容的页面 - 那么我会建议。

使用 {PAGE_TITLE}、{MAIN_CONTENT} 或任何您需要的占位符创建 template.html。

创建 page1.php/page2.php 等并执行任何服务器端工作,生成变量以匹配您的占位符。将它们存储为数组可能会很方便,即:

PAGE_VARS array( 
                 ['TITLE'] => My Page
                 ['CONTENT'] => This is my page content
               )

在“页面”脚本的末尾,将 template.html 的全部内容加载到字符串中

$template = file_get_contents('template.html')

然后,使用基本循环使用替换变量构建您的模板:

foreach ($PAGE_VARS as $KEY=>$VALUE) {       
   $template = str_replace("{".$KEY."}",$VALUE,$template)
}

(随意使用上面的一些正则表达式变得更聪明,可能更高效,这只是一个简单的例子。)

输出你的模板。

echo $template;

【讨论】:

  • 感谢您的帮助,我还有一个疑问,您说“这是我的页面内容”,是否可以放置大量内容?有 div 和额外的 php?
  • 传递给$PAGE_VARS的数据应该是最终的内容。例如,如果要显示 MySQL 查询的结果,首先生成查询,然后将结果设置为 $PAGE_VARS['CONTENT']。
  • 而且,是的,您可以在占位符中使用 HTML,但不能在 PHP 中使用。正如我上面解释的那样,你不应该需要任何东西。
【解决方案2】:

您可以像这样创建一个快速类(class.php),作为您的“模板引擎”:

class Template {
    var $contents;

    function load($file) {
        if ($fp = fopen($file, "r")) {
            $this->contents = fread($fp, filesize($file));
            fclose($fp);
        }
    }

    function replace($str,$var) {
        $this->contents = str_replace("<".$str.">",$var,$this->contents);
    }

    function show() {
        $search = array(
                '/\t/', //Remove Tabs
                '/<!--[^\[-]+?-->/', //Remove Comments
                '/\n\n/' //Remove empty lines
                );
            $replace = array(
                '',
                '',
                ''
                );
        $this->contents = preg_replace($search, $replace, $this->contents);
        echo $this->contents;
    }
}

在你的 template.html 文件中,在你想要放置内容的地方添加特殊标签,如下所示:

<html><head></head>
<body>
<div id="id1"><page_title></div>
</body>
</html>

...

然后创建一个函数来写入标签(每个区域一个):

function writetitle($s) {
    $GLOBALS['writes']++;
    $GLOBALS['page_title'] .= $s;
    return;
}

最后,在你的 page.php 中,调用类,编写你的内容,生成页面:

require_once('class.php');
//Load Class
$template = new Template;
$template->load("template.html");

//Some query :
$query = mysql_query('SELECT...');
$res = mysql_num_rows($query);

//write your content :
writetitle('my title, '.$res.'');

//Generate the page :
$template->show();

这样做,您可以创建任意数量的区域。 writetitle 的作用类似于 echo,因此您可以进行查询和任何您想要的操作。

希望对你有帮助。

【讨论】:

  • 我在 php 中真的很新,但是当你说每个区域一个时,你的意思是:function writetitle($s) { $GLOBALS['writes']++; $GLOBALS['page_title'] .= $s; $GLOBALS['extra_CSS'] .= $s; ... 返回; }??像这样对吗?,
【解决方案3】:

关于让 PHP 解析你的模板文件,我建议使用 PHP 而不是你自己的伪代码来编写模板。

完全可以这样写

...
<body>
<?php if($fooBar == "hahahaha"):?>
  <a href="www.foobar.com">The cool foobar link</a>
<?php endif;?>
</body>
...

然后,我将创建一个包含所有常见 html 等的 layout 文件。然后使用小模板 sn-ps 将其插入到主要内容所在的布局中。 通过在您的模板中包含实际的 PHP 代码,PHP 引擎可以处理它们,您不必编写自己的逻辑来处理循环、if 语句等。

看看 Zend Framework,你会很好地了解如何编写你的模板引擎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 2016-12-23
    • 1970-01-01
    • 2021-09-17
    • 2015-10-09
    • 2020-08-14
    • 2018-10-10
    • 2020-09-19
    相关资源
    最近更新 更多