在Smarty模板中调用PHP类公共函数

时间:2014-07-22 19:42:17

标签: php smarty

有人可以帮助我。

如何在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}

有人可以指出我正确的方向。

5 个答案:

答案 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)
{
     ...
}