0

我正在使用这个 php 代码(来自这里的一个问题):

<?php

define(TEMPLATES_LOCATION, 'templates/');

function TemplateFunction ($template, $replaces) {
    $template = file_get_contents(TEMPLATES_LOCATION . $template);
    if (is_array($replaces)) {
        foreach($replaces as $replacekey => $replacevalue){
            $template = str_replace('{$' . $replacekey . '}', $replacevalue, $template);
        }
    }
    return $template;
}

$keys = array(
    'TITLE' => 'This is page title',
    'HEADER' => 'This is some header',
    'GALLERY' => 'php while loop here'
);

echo TemplateFunction('body.tpl', $keys);

?>

我的模板文件的设置方式是以下 HTML:

<body>
<div id="gallery">{GALLERY}</div>
</body>

所以{GALLERY}在哪里,php脚本应该用我自动生成的替换它,<li><img src="images/'.$filename.'"/></li>它正在从mysql请求生成的while循环中运行

我认为可能有用的是:

$keys = array(
        'TITLE' => 'This is page title',
        'HEADER' => 'This is some header',
        'GALLERY' => 'while($row = mysql_fetch_array($result)){<li><img src="'.$row['filename'].'"/></li>})'
);

但它没有:(

4

4 回答 4

1

重新您的代码:

$keys = array(
        'TITLE' => 'This is page title',
        'HEADER' => 'This is some header',
        'GALLERY' => 'while($row = mysql_fetch_array($result)){<li><img src="'.$row['filename'].'"/></li>})'
);

我认为以这种方式将 PHP 代码嵌入到模板数据中是非常糟糕的做法。请允许我为您提供一个完全不同的解决方案...

首先,我们需要封装代码。您上面显示的代码试图从$result变量中获取数据,但$result其本身显然已在其他地方设置。这不好,因为如果我们想改变画廊功能的工作方式,我们需要搜索整个代码以找到它的不同部分。

相反,您应该将该功能编写为一个独立的函数(或者如果它对于单个函数来说太复杂,则为一个类),它将加载数据并对其进行处理。

让我们调用那个函数loadGallery()。它可能看起来像这样:

function loadGallery() {
    $output = '';
    $result = mysql_query('...gallery query here...');
    while($row = mysql_fetch_array($result)) {
        $output .= "<li><img src='{$row['filename']}'/></li>";
    }
    return '<ul>'.$output.'</ul>';
}

显然,它可能比这复杂得多(例如,您可能想要对其进行分页,或提供类别选项;这些将被写为函数的参数)。为简洁起见,我也没有在这里写任何错误检查等。

现在您已经获得了该功能,您可以将其插入模板引擎。您需要在模板中引用该函数。

您目前有这样的模板标记{TITLE}。在您的代码中,这些标记使用纯文本交换str_replace()。没关系。但是在这种情况下,我们现在想要调用一个函数,所以我们需要有一种不同的标记。

让我们像这样写画廊标记:{FUNCTION:loadGallery}而不是{GALLERY}像你现在拥有的那样。

现在,您可以在模板引擎中添加一些代码来查看这些{function:}标记并用函数调用替换它们。(当然你也可以保留现有的简单str_replace()方法)

$funcReplaces = array(   //similar to your existing $keys array, but for allowed functions
    'loadGallery'
);

foreach($funcReplaces as $replaceFunc){
    $template = str_replace('{function:' . $replaceFunc . '}', $replaceFunc(), $template);
}

这将运行该函数并将输出放入模板中。

所以这回答了你的问题。

然而,我应该指出的是,在编写模板引擎时,从技术和安全角度来看,您还需要考虑许多其他问题。以上描述了解决手头特定问题的基本方法,但它并不是一个出色的全唱全舞模板引擎。它仍然只是一个非常基本的。

没关系,如果这就是你所需要的,但如果你期望这个系统会增长,值得注意的是,整个领域都是这个问题,其他人已经解决了,而且解决得很好。有几个非常好的可用于 PHP 的模板引擎。我建议您最好的做法是调查其中的一些,也许使用其中之一而不是自己编写。

一些你可以尝试的:

希望有帮助。

于 2013-04-19T14:52:42.593 回答
0

您不能“在数组中执行 PHP 代码”。您只需以编程方式构建数组:

while (/* something */) {
    $keys['GALLERY'][] = $something;
}
于 2013-04-17T13:27:07.493 回答
0

我发现我编写的以下代码是解决我的问题的正确方法:

$gallery = array();
while($row = mysql_fetch_assoc($result))
{
   $gallery[] = '<li><a href="'.$row['gallery_image_filename'].'" target="_blank"><img src="'.$row['gallery_image_filename'].'" width="'.$final_image_width.'" height="auto" style="margin: '.$other_margin.'px '.$gallery_image_margin.'px '.$other_margin.'px 0px"/></a></li>';
}
$gallery = implode(' ', $gallery);

然后我可以将我的 $gallery 变量连接到'GALLERY' => 'value'值中,并根据需要输出所有数据库结果。感谢大家的帮助 :)

于 2013-04-17T20:39:27.240 回答
-2

好吧,您可以创建一个class带有__toString魔法的方法,该方法将处理您画廊中的所有图像,然后返回字符串。

   class TemplateGallery{
       private $images = array();

       public function addImage($src){
           $images[] = $src;
       }

       public function __toString(){
           $str = "";
           foreach($images as $image){
               $str .= sprintf('<li><img src="%s"></li>',$image);
           }
           return $str;
       }
   }

好吧,正如评论中的人所说,这太“难”了,所以,你可以使用一个“预处理”函数,它会处理你的图像数组,然后返回你的模板字符串。

$images = array(/* Put images src here */);
function processGallery($images){
    $str = "";
    foreach($images as $image){
        $str .= sprintf('<li><img src="%s"></li>',$image);
    }
    return $str;
}

然后在你的array.

于 2013-04-17T13:30:23.050 回答