用PHP创建视图 - 最佳实践

时间:2011-06-03 15:55:09

标签: php templates xhtml separation-of-concerns

我正在与其他2位开发者合作开发一个网站。我只负责创建视图。

数据在对象中可用,我有读取数据然后创建XHTML页面。

在不使用任何模板引擎的情况下,最佳做法是什么?

非常感谢。

3 个答案:

答案 0 :(得分:11)

如果您不想使用模板引擎,可以使用PHP的基本模板功能。

实际上,您应该只编写HTML,并且只要您需要输出变量的值,请使用<?php打开PHP部件并使用?>将其关闭。我将假设$data是您的数据对象的示例。

例如:

<div id="fos"><?php echo $data->getWhatever(); ?></div>

请注意,所有PHP控件结构(如ifforeachwhile等)也具有可用于模板化的语法。您可以在他们的PHP手册页中查看这些内容。

例如:

<div id="fos2">
<?php if ($data->getAnother() > 0) : ?>
    <span>X</span>
<?php else : ?>
    <span>Y</span>
<?php endif; ?>
</div>

如果您知道将在服务器上启用短标签使用,为简单起见,您也可以使用它们(不建议使用XML和XHTML)。使用短标签,您只需使用<?打开PHP部件,然后使用?>关闭它。此外,<?=$var?>是回显某事的简写。

短标签的第一个例子:

<div id="fos"><?=$data->getWhatever()?></div>

你应该知道你在哪里使用换行符和空格。浏览器将收到您编写的相同文本(PHP部分除外)。我的意思是:

编写此代码:

<?php
    echo '<img src="x.jpg" alt="" />';
    echo '<img src="y.jpg" alt="" />';
?>

与此不相同:

<img src="x.jpg" alt="" />
<img src="y.jpg" alt="" />

因为在第二个元素中,\n个元素之间有一个实际的img,它将被浏览器翻译为空格字符,如果它们是内联的,则显示为图像之间的实际空间

答案 1 :(得分:0)

使用单独的文件来读取数据:

<?php
 if ($foo == False)
  {
  $bar = 1;
  }
 else
  {
  $bar = 0;
  }
?>

然后在HTML文件中引用结果状态:

require 'logic.php';

<html>
  <!--...-->
  <input type="text" value="<?php echo $bar; ?>" > //Logic is separated from markup
  <!--...-->
</html>

答案 2 :(得分:0)

我不知道我真的得到你的问题。所以,如果我的回答不是真的,我想删除

这个类将创建简单的视图

class View
{

public function render($filename, $render_without_header_and_footer = false)
{
    // page without header and footer, for whatever reason
    if ($render_without_header_and_footer == true) {
        require VIEWS_PATH . $filename . '.php';
    } else {
        require VIEWS_PATH . '_templates/header.php';
        require VIEWS_PATH . $filename . '.php';
        require VIEWS_PATH . '_templates/footer.php';
    }
}


private function checkForActiveController($filename, $navigation_controller)
{
    $split_filename = explode("/", $filename);
    $active_controller = $split_filename[0];

    if ($active_controller == $navigation_controller) {
        return true;
    }
    // default return
    return false;
}

private function checkForActiveAction($filename, $navigation_action)
{
    $split_filename = explode("/", $filename);
    $active_action = $split_filename[1];

    if ($active_action == $navigation_action) {
        return true;
    }
    // default return of not true
    return false;
}

private function checkForActiveControllerAndAction($filename, $navigation_controller_and_action)
{
    $split_filename = explode("/", $filename);
    $active_controller = $split_filename[0];
    $active_action = $split_filename[1];

    $split_filename = explode("/", $navigation_controller_and_action);
    $navigation_controller = $split_filename[0];
    $navigation_action = $split_filename[1];

    if ($active_controller == $navigation_controller AND $active_action == $navigation_action) {
        return true;
    }
    // default return of not true
    return false;
}
}

soo现在您可以创建模板,并可以从

中的任何位置调用它
$this->view->my_data = "data";
$this->view->render('index/index');
//

在您的index / index.php上,您可以调用数据$ this-&gt; my_data;