如果我不在我的PHP中使用模板引擎,我的代码应该是什么样的?

时间:2011-12-22 16:36:10

标签: php templates

我不想使用MVC框架。我不想使用模板引擎。我是几个男人开店所在地的所有帽子,没有图形艺术家。我们全力以赴(所有层次)。我不希望代码与演示文稿混合在一起,就像我使用Classic ASP一样。

但是,我不知道我的代码在服务器端和实际演示之间看起来是什么样子。

如果我没有在我的服务器端代码中发布HTML,那么它如何进入HTML页面以便我可以执行<span><?= $myvar ?></span>之类的操作?并将循环放在html页面中?

感谢您的任何建议。

7 个答案:

答案 0 :(得分:5)

对于使用循环和所有,我使用控制结构的替代语法。

一个例子:

<div id="messages"<?php if(!(isset($messages) && count($messages))): ?> class="hidden"<?php endif; ?>>
    <?php if(isset($messages)): ?>
    <?php foreach($messages as $message): ?>
    <div class="message"><?php echo $message; ?></div>
    <?php endforeach; ?>
    <?php endif; ?>
</div>

有关详细信息,请参阅:http://php.net/manual/en/control-structures.alternative-syntax.php

哦,我也使用了一个半MVC结构,我有一个处理模板(视图)的类,基本上它只是一个我创建实例的类,传递一组变量,然后渲染模板实例被破坏了。我在该类中有一个变量数组,然后使用extract来传递include中的所有变量,如下所示:

extract($this->variables, EXTR_SKIP);
include($this->file);

编辑:这是Smarty中的相同例子:

<div id="messages"{if isset($messages) && !count($messages)} class="hidden"{/if}>
    {if isset($messages)}
    {foreach from=$messages item=message}
    <div class="message">{$message}</div>
    {/foreach}
    {/if}
</div>

答案 1 :(得分:2)

简单的PHP项目通常会就地生成完整的HTML而不是填充模板,因此您只需在PHP代码中echo

这会变得混乱,因此您最终会为任何中等复杂的网站编写某种模板系统。

一种可能的替代方法是将您的页面作为完全静态的HTML / CSS提供,并使用AJAX动态获取实际内容(JSON将是一种很好的传输格式,它是JS的原生,可以很容易地从PHP生成)。这可以让你摆脱PHP代码中散布的所有HTML。这是否是可行的替代方案取决于具体情况。

答案 2 :(得分:1)

<span><?= $myvar ?></span>有效。

循环看起来像:

<html>
 <body>

<?php
 for ($i=1; $i<=5; $i++)
   {
   echo "The number is " . $i . "<br />";
   }
 ?>

</body>
 </html> 

取自here

的示例

答案 3 :(得分:0)

我真的建议您使用php Template Inheritance系统。 (不要让它吓到你,它只是一个文件。)这是一组简单的函数,可以帮助您构建可扩展的PHP视图,而不会出现手动包含的问题和限制。

它仍然是纯PHP,所以你不需要学习一些奇怪的模板语言。它可能看起来不多,但一旦你开始使用它就会非常强大。

答案 4 :(得分:0)

可以肯定的是,你可以自己完成所有这些 - 但你想要的仍然是MVC模式,或关注点的分离(“我不希望代码与演示文稿混合”)。或者至少MV,对于非常简单的应用程序(虽然它仍然很脏,让模型直接影响视图)。

实现此目的的最简单方法是首先收集并处理所有数据,然后再打印它们。直接暴露给网络的php文件中不允许使用复杂的代码。

<?php
  require('model.inc');
  process_capuchin_monkey_order_form();
?>
...
<h1>Thank you for your order of <?php echo $order->num_monkeys; ?> monkeys.</h1>
...

答案 5 :(得分:0)

通常您只想确保HTML中的PHP尽可能少。这意味着事先进行所有数据处理,并简单地以一种方式将一组变量传递给包含HTML的方法或函数。

任何与PHP混合的HTML都可以被视为模板。这是一个简化的例子:

// view class

class View {

   public function render($html_template) {
      include('view_path/' . $html_template . '.php');
   }
}

// html template file 'view_path/main.php'

<html>
   <body>
      <h1><?= $this->title ?></h1>
   </body>
</html>

// usage

$view = new View();
$view->title = 'Some Title';
$view->render('main');

答案 6 :(得分:0)

无论你做什么,都应该使用类似MVC的关注点分离。这意味着:

  1. 至少有一个文件都是html,并且有一些变量。 (视图/模板)
  2. 至少有一个文件都是php,只与数据库通信。 (模型)
  3. 至少有一个文件处理http请求,从数据库中提取数据,然后执行视图。
  4. 每个php模板语言的核心是在函数中使用extract()include

    function render_template($___filename, $___data) {
        extract($___data, EXTR_SKIP);
        include $__filename;
    }
    

    你可以通过类接口(视图对象)或输出缓冲来实现这一点,但这是每个模板系统的核心。您的控制器负责简单地为给定视图汇编$__data参数(通常是数据库中的数据)。