0

我已经阅读并听说将 PHP 和 HTML 标记尽可能分开是非常明智的。现在我的问题是我该怎么做?我真的找不到答案,所以我决定问你。我正在考虑使用 POST 功能。

查看我的代码:

<div class="aftelklok rondenSB">
    <a href="?page=agenda">
    <?php 
    // countdown function
    // parameters: (year, month, day, hour, minute, seconds)
    countdown(2013,2,24,18,0,0);
    function countdown($year, $month, $day, $hour, $minute, $seconds)
    {
        // make a unix timestamp for the given date
        $the_countdown_date = mktime($hour, $minute, $seconds, $month, $day, $year, -1);

        // get current unix timestamp
        $today = time();

        $difference = $the_countdown_date - $today;
        if ($difference < 0) $difference = 0;

        $days_left = floor($difference/60/60/24);
        $hours_left = floor(($difference - $days_left*60*60*24)/60/60);
        $minutes_left = floor(($difference - $days_left*60*60*24 - $hours_left*60*60)/60);
        $seconds_left = floor($difference - $days_left*60*60*24 - $hours_left*60*60 - $minutes_left*60);
        if($difference > 0){ echo "Nog ".$days_left." dagen ".$hours_left." uur               .$minutes_left." minuten  tot de dienst"; }
        else{ echo "De vorige dienst is afgelopen."; } 
    }
    ?> 
    </a>
</div>

所以我想要的只是回声,但所有的 php 代码不在我的 div 中,而是在 html 代码之上。喜欢:

<?php ..... ?>
<html>
<body>
echo
</body>
</html>
4

7 回答 7

1

正如 pemeon 所说,Smarty是一种非常聪明(双关语)的方法。

如果您想了解有关背景的更多信息,您可能想在谷歌上搜索“ PHP 中的模型-视图-控制器”或类似的东西。基本上,它是关于将您的视图(所有演示文稿,例如 HTML)与您的代码逻辑(控制器)和您的数据对象/源(模型)分开。

Smarty很好,但您需要一些学习时间来弄清楚模板引擎是如何设计的、如何使用它以及如何将其应用于您的特定挑战。

如果您目前不想要这么大的解决方案,并且希望从更小更容易开始,您可以围绕功能编写自己的非常简单的模板“引擎”file_get_contents(...)str_ireplace. 这个想法看起来像这样:您将 HTML 内容放在不包含任何 php 代码但动态创建内容的占位符的模板文件中(例如 *.html 或 *.tpl 文件结尾):

示例:main-layout.tpl

<html>
<head><title>${Title}</title></head>
<body>
<img src="yourfancylogo.png" alt="Header logo"><br>
<a href="#">Here some navigation</a> | <a href="#">...</a> | ... <br>
${Content}
<hr>
<div id="footer">&copy; 2013 John Doe - <a href="index.php?requestedpage=contact">Contact us</a></div>
</body>
</html>

示例:welcome.tpl

<h1>Hello, ${Username}! Nice to see you!</h1>
<p>So your username is ${Username}? Then you might want to read our terms of service before starting to use our app:</p>
<pre>${TOS}</pre>

示例:tos-document.txt

1) An apple a day keeps the doctor away!
2) No Smoking!
3) ...

在您的 php 脚本中,您可以执行以下操作:

<?php

  $template = file_get_contents('main-layout.tpl');

  if (isset($_GET['requestedpage'])) {
    // Parameter given!
    $requestedPage = $_GET['requestedpage'];
  } else {
    // No page parameter. Assume "home".
    $requestedPage = "home";
  }

  $username = "Monty";   // get from session data

  if ($requestedPage == 'home') {
    // -- begin handler code for page "home" --
    $title = "Start Page - Welcome";
    $content = file_get_contents('welcome.tpl');
    $tos = file_get_contents('tos-document.txt');
    $content = str_ireplace('${TOS}', $tos, $content);
    // -- end handler code for page "home" --
  } else if ($requestedPage == 'aboutus') {
    ...
  } else {
    $title = "Page Not Found - Error";
    $content = file_get_contents('error404.tpl');
    $content = str_ireplace('${PageThatWasNotFound}', htmlentities($requestedPage), $content);
  }

  $output = str_ireplace('${Content}', $content, $template);
  $output = str_ireplace('${Title}', htmlentities($title), $output);
  $output = str_ireplace('${Username}', htmlentities($username), $output);

  die($output);

?>

使用模板和要插入的数据的这种分离,您可以稍后修改您的布局/模板,而无需接触您的 php 脚本。例如,如果您想修改所有页面上显示的页眉或页脚,您只需进行单点更改,因为您可以从多个模板块模块化组装您的网站。

为了保持上述 php 源代码的可读性,当您的源代码变大时,您可以将所有处理程序代码放入单独的 php 文件中。您可以将它们包含在主源文件中includerequire包含在主源文件中。

但请注意:您必须转义所有可能来自用户输入的占位符值 - 无论您是从数据库还是直接从$_GET$_POST(-> XSS 漏洞)获取它们。所有输入都是邪恶的!

于 2013-02-10T00:25:23.060 回答
0

最好的方法是使用一些模板引擎,如smartytwig。如果您没有时间学习,您现在可以在顶部编写代码,当您想在 ie 中使用一些计算时,您可以使用 .

<?php
    // calculations
    $foo = 'foo';
?>
<html>
<body>
<div><?=$foo?></div>
</body>
</html>

而当你开始使用这种“分离”(文件顶部的php代码)和底部的html,你将使用这个快捷版本的回显功能,你将很容易转变为使用模板系统。

于 2013-02-09T23:52:56.120 回答
0

您不能在 PHP 块之外使用 php 函数或变量。但是,可以在 php 中存储一个值,variable然后在一个小的 PHP 块中使用它。

例如:

<?php
// ...
$foo = 42;
// ...
?>

然后

<html><body>
    <p>Answer is <?php echo $foo; ?></p>
</body></html>

或者

<html><body>
    <p>Answer is <?= $foo; ?></p>
</body></html>
于 2013-02-09T23:53:12.233 回答
0

您可以将您的 php 放在一个单独的文件中,然后使用includeor require

do_stuff.php:

<?php
  // some calculations
  echo "stuff";
?>

然后在你的html...

索引.php:

<html>
<body>
<?php include 'do_stuff.php'; ?>
</body>
</html>

关于包括

于 2013-02-09T23:47:41.407 回答
0

目标不应该是php远离html代码,目标应该是让业务逻辑远离表现逻辑。其中一种方法是利用模型-视图-控制器布局,或者您可以使用许多其他范例之一。这种方法的要点是使更改一个部分独立于另一个:想象创建一个单独的移动端或json前端,它执行所有完全相同的逻辑,但输出完全不同。如果业务逻辑和表示逻辑完全纠缠在一起,您将很难,可能需要复制或公然复制代码,以及创建两个需要保持同步的不同分支,使其维护成为一场噩梦。

于 2013-02-10T00:34:37.350 回答
0

我现在正在使用这种框架,它有点像 MrSnurb 制作的框架,但后来用 HTML 而不是 php。你觉得这个框架怎么样?

<?php
if(isset($_GET['page'])) {
    $page = $_GET['page'];
}else{
    $page = "home";
}   
?>
<!DOCTYPE html>
<html>
<head>
<title> Younited - <?php echo $page; ?></title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="js/slides.min.jquery.js"></script>
</head>
 <body>
<div class="container ronden">  
    <?php 
        include "partials/header.php";
        include "partials/menu.php"; 
    ?>
<div class="content">   
    <?php
        if (file_exists("partials/pages/".$page.".php")) {
            include "partials/pages/".$page.".php";
        }   
        else{ echo "<p>De pagina <b>".$page."</b> bestaat niet.</p>"; 
        } 
        include "partials/sidebar.php"; 
    ?>  
</div>
</div>
    <?php
        include "partials/footer.php";  
    ?>
</body>
</html>
于 2013-02-10T13:14:05.620 回答
-1

使用一些模板引擎,如smarty。创建您的 html 代码模板并推送变量。

于 2013-02-09T23:42:41.413 回答