我正在使用这个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>})'
);
但它没有:(
答案 0 :(得分: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);
}
这将运行该函数并将输出放入模板中。
这样就可以为你解答问题。
然而,我应该指出的是,从技术和安全角度来看,编写模板引擎时需要考虑其他问题 lot 。以上描述了解决手头特定问题的基本方法,但它并非一个梦幻般的全能舞蹈模板引擎。它仍然只是一个非常基本的。
这很好,如果这就是你所需要的,但是如果你期望这个系统能够增长,那么值得注意的是,整个领域都是这个问题,其他人已经解决了,并且解决得很好。 PHP有几种非常好的模板引擎。我建议你最好的做法是调查其中的一些,也许可以使用其中一种,而不是自己编写。
你可以尝试一些:
希望有所帮助。
答案 1 :(得分:0)
您不能“在数组中执行PHP代码”。您只需以编程方式构建阵列:
while (/* something */) {
$keys['GALLERY'][] = $something;
}
答案 2 :(得分: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'
值,并根据需要输出所有数据库结果。感谢大家的帮助:))
答案 3 :(得分:-2)
好吧,您可以使用__toString
魔术方法创建class
,该方法将处理您图库中的所有图片,然后返回字符串。
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
上调用该功能。