有人可以帮助我。
如何在Smarty模板文件中调用PHP类公共函数,例如。
我在电影类中有2个功能
GetAllMovies(); // Gets all Movies
和
GetMovie($movie_id); // Gets movie by movie id
现在我正在调用GetAllMovies();
并将其分配给模板
<?php
include 'movie.class.php';
$movie = new Movie();
$movies = $movie->GetAllMovies();
$smarty->assign('movies',$movies);
<?
现在在模板文件中我有一个foreach
电影声明。
{foreach from=$movies key=key item=mov}
// Access Movie ID, Title And Images
{/foreach}
现在我要做的是在GetMovie($movie_id);
语句中调用foreach
,例如做这样的事情。
将电影课程分配给Smarty模板。
$smarty->assign('movie',$movie);
然后使用$movie
来调用函数,例如
{foreach from=$movies key=key item=mov}
{assign var=movie_info value=$movie::GetMovie($mov.id)}
{$movie_info.rating}
{/foreach}
有人可以指出我正确的方向。
答案 0 :(得分:3)
它看起来真的令人毛骨悚然,但如果你真的想以这种方式使用它,我建议在PHP方面创建数组,并将其分解为:
$movies = array();
$movie = new Movie();
foreach ($movie->GetAllMovies() as $key => $movieDetails) {
$mov = new Movie();
$movies[] = $mov->getMovie($movieDetails['id']);
}
$smarty->assign('movies',$movies);
并且在smarty中你可以循环你的$ movies数组
{foreach from=$movies key=key item=mov}
{$mov.rating}
{/foreach}
答案 1 :(得分:2)
基于此: http://www.smarty.net/docs/en/advanced.features.static.classes.tpl
这应该有效:
{assign var=movie_info value=Movie::GetMovie($mov.id)}
至少如果它是现有的静态方法......
答案 2 :(得分:2)
我不会告诉你怎么做,因为它对我没有任何意义。
模板引擎用于显示数据,您应该在Model / Controller中获取数据。您应该分配准备显示的Smarty数据,并在Smarty中显示它。
所以在你的情况下:
$smarty->assign('movies',$movies);
你应该使用:
$movies = $movie->GetAllMovies();
foreach ($movies as $k => $v) {
$movies[$k]['details'] = $movie->GetMovie($v['id');
}
然后在Smarty:
{foreach from=$movies key=key item=mov}
{$mov.details.rating}
{/foreach}
但如果我是你,我会考虑获取数据。我假设你从数据库中获取电影,所以使用:
$movies = $movie->GetAllMovies(); // 1 query
foreach ($movies as $k => $v) {
$movies[$k]['details'] = $movie->GetMovie($v['id'); // n queries
}
您对数据库运行n+1
次查询,其中n
是电影的数量。
很可能不是这样,你可以运行一个查询到数据库(取决于你使用连接的结构,甚至没有),所以如果你能以最好的方式获得数据,你应该重新考虑。
答案 3 :(得分:1)
我认为正确的方法是以“准备显示”的形式提取电影数据,例如数组,关联数组或其多维对应物,聪明的可以立即处理{foreach } 标签。也许看起来像是:
array (
0 => array ( 0 => 'PHP the Movie 1', 1 => '2009', 2 => 'Coder 1', 3 => '3', ),
1 => array ( 0 => 'PHP the Movie 2', 1 => '2010', 2 => 'Coder 2', 3 => '2', ),
2 => array ( 0 => 'PHP the Movie 3', 1 => '2011', 2 => 'Coder 3', 3 => '1', ),
)
array (
0 => array (
'title' => 'PHP the Movie 1',
'year' => '2009',
'director' => 'Coder 1',
'rating' => '3', ),
1 => array (
'title' => 'PHP the Movie 2',
'year' => '2010',
'director' => 'Coder 2',
'rating' => '2', ),
2 => array (
'title' => 'PHP the Movie 3',
'year' => '2011',
'director' => 'Coder 3',
'rating' => '1', ),
)
array (
0 => array (
'title' => 'PHP the Movie 1',
'year' => '2009',
'director' => 'Coder 1',
'rating' => '3', ),
1 => array (
'title' => 'PHP the Movie 2',
'year' => '2010',
'director' => 'Coder 2',
'rating' => '2', ),
2 => array (
'title' => 'PHP the Movie 3',
'year' => '2011',
'director' => 'Coder 3',
'rating' => '1', ),
)
只有我的拙见,但我实际上在工作时使用它来显示smarty的数据集,并为服务器的AJAX请求构建JSON响应。
答案 4 :(得分:0)
您可以在电影类中使用静态方法。
例如,如果您的班级名为“MovieClass”,那么您可以:
MovieClass::GetMovie($mov.id);
要创建静态方法,请在声明类中的方法时使用以下格式
public static GetMovie($mov.id)
{
...
}