【问题标题】:Calling PHP Class Public Function Inside Smarty Template在 Smarty 模板中调用 PHP 类公共函数
【发布时间】:2014-07-22 19:42:16
【问题描述】:

谁能帮帮我。

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

现在我想做的是在这个foreach 语句中调用GetMovie($movie_id);,例如做这样的事情。

将电影类分配给 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}

有人可以指点我正确的方向吗?

【问题讨论】:

  • 看来你不明白 MVC 到底是什么。
  • 我不知道 smarty 模板,但在你的例子中你使用 $movie::GetMovie($mov_id) 不是应该是 $movie-&gt;GetMovie($mov_id) 吗? (考虑::调用静态函数)
  • 为什么投反对票这是一个真正的问题,我要求 Smarty 我不想了解 MVC
  • @Sebastien 这就是我的想法,但 smarty 的例子显示不同
  • @Seven00MB 正如我已经说过的,我不了解 Smarty 模板,但我知道 PHP,我认为您必须对该函数使用正常调用,除非它是静态的。但我不认为这是这里的问题,这只是一个观察。

标签: php smarty


【解决方案1】:

它看起来非常令人毛骨悚然,但如果你真的想以这种方式使用它,我建议在 PHP 端创建数组并将其分配给 smarty,例如:

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

【讨论】:

    【解决方案2】:

    基于此: http://www.smarty.net/docs/en/advanced.features.static.classes.tpl

    这应该可行:

    {assign var=movie_info value=Movie::GetMovie($mov.id)}
    

    至少如果它是一个现有的静态方法...

    【讨论】:

    • 我认为这是一个有效的答案,但我不认为这是使用静态方法的“好”方式。
    • +1 我同意这可能不是静态类的最佳用途。尽管如此,它是来自 Smarty 网站的一个实际示例,因此是一个有效的解决方案。我看不出对一个被认可的例子投反对票是合乎逻辑的......
    【解决方案3】:

    我不会告诉你怎么做,因为这对我来说没有任何意义。

    模板引擎用于显示数据,您应该在模型/控制器中获取数据。您应该将准备显示的数据分配给 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 是电影的数量。

    很有可能您可以对数据库运行一个查询(取决于您的结构是否使用连接),因此您应该重新考虑是否以最佳方式获取数据。

    【讨论】:

      【解决方案4】:

      我认为正确的方法是将您的电影数据以“准备显示”的形式提取,例如数组、关联数组或 smarty 可以立即使用 {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', ), 
      )
      

      这只是我的拙见,但我实际上在工作中使用它来显示数据集以及为服务器的 AJAX 请求构建 JSON 响应。

      【讨论】:

        【解决方案5】:

        您可以在电影类中使用静态方法。

        例如,如果您的课程名为“MovieClass”,那么您可以:

        MovieClass::GetMovie($mov.id);
        

        要创建静态方法,只需在类中声明方法时使用以下格式

        public static GetMovie($mov.id)
        {
             ...
        }
        

        【讨论】:

        • 你为什么这么说?我认为这是一个很好的使用静态方法。他需要一些与 Movie 类相关的功能,因此它属于静态函数。
        • 可以在不实例化类的对象的情况下调用静态方法,因此如果没有MovieClass 的对象GetMovie() 会引起麻烦。如果您想为MovieClass 的所有实例返回每部电影,那么您成为“良好”使用静态方法的唯一方法。
        • 不,不会。它有一个参数movieId 来指定你想要哪部电影,所以它不需要MovieClass 对象的实例。
        • 除非在那种情况下不是糟糕的功能是 OOP... -EDIT- 编程是糟糕的(OOP)而不是 OP(只是为了清楚)
        • 此外,为了使这个函数有效,它需要一个私有属性之类的东西,它是实例的集合或movie_id,以便它可以通过参数返回电影请求。这不是MovieClass,而是LibraryMovieClass。甚至比它仍然需要(使 oop 有意义)有一个 MovieClass 来实例化电影,否则它不是 OOP 的好习惯......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2011-06-13
        • 2017-05-19
        • 2013-04-24
        • 2021-04-16
        相关资源
        最近更新 更多