在PHP中创建视图 - 最佳实践

8

我正在与另外两名开发人员一起开发一个网站。我的责任仅限于创建视图。

数据以对象的形式提供,我有getter来读取数据,然后创建XHTML页面。

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

非常感谢。


6
PHP本身可以用作模板语言,为此您可能需要打开短标签(不一定需要,但这样写起来较少)。 - kapa
@baz: 当然可以。你也可以用汇编语言编写出很棒的网站。 - NikiC
你在使用框架还是自己编写的代码? - dqhendricks
@nikic 你试过了吗?这真是太棒了。 - zaf
@nikic - 你一定要被授予金球奖。 :P - Sujit Agarwal
显示剩余3条评论
3个回答

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="" />

因为在第二个代码片段中,img元素之间有一个实际的\n字符。如果这些元素是内联元素,浏览器会将其解释为空格并在图像之间显示一个实际的空格。


在我看来,这才是正确的做法。事实上,老实说,使用模板系统已经过时了。模板系统的缺点是,是的,你写了它,你知道如何使用它,但是当你雇用一个新的开发人员时会发生什么?他现在不仅需要阅读你的代码,还要学习你的模板系统。 - Dalton Conley
@Dalton,有许多像Smarty这样的广泛使用的模板系统。 - kapa
为什么在XHTML中不建议使用短标签? - binaryLV
@binaryLV XHTML基本上是一个XML文档。指定XML头(<?xml version="1.0" encoding="UTF-8"?>)将与PHP的短标签冲突。如果你知道你在做什么,就不会有问题,但你应该小心谨慎。 - kapa

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;
}
}

现在你可以创建模板并从任何地方调用它,就像这样

$this->view->my_data = "data";
$this->view->render('index/index');
//

在你的index/index.php文件中,你可以调用数据$this->my_data;


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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接