2014-07-22 34 views
0

有人可以幫我解決這個問題嗎?在Smarty模板中調用PHP類公共函數

如何在Smarty模板文件中調用PHP類公共函數,例如。

我裏面的電影類

GetAllMovies(); // Gets all Movies 

2個功能和

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} 

可能有人請點我在正確的方向。

+4

看來你不明白MVC是怎麼一回事。 –

+0

我不知道Smarty的模板,但在你的爲例,你使用'$電影:: GetMovie($ mov_id)'是不是假設是'$ movie-> GetMovie($ mov_id)'? (考慮''::調用靜態函數) – Sebastien

+0

爲什麼下投票,這是一個真正的問題,我問Smarty的我不想知道MVC – Seven00MB

回答

0

你可以在你的影片類中使用靜態方法。

例如,如果你的類被命名爲「MovieClass」,那麼你可以有:

MovieClass::GetMovie($mov.id); 

要創建一個靜態方法聲明你的類裏面的方法時,只需要使用以下格式

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

這是一個不好用靜態方法的... – Sebastien

+0

你爲什麼這麼說? 我認爲這是一個很好的靜態方法。他需要一些與Movie類相關的功能,因此它屬於靜態函數。 – vitsalis

+0

靜態方法可以在不instanciating類的對象,因此,如果沒有''MovieClass' GetMovie()的一個對象可稱爲'會引起麻煩。唯一的辦法就是如果你想爲MovieClass的所有實例返回每部電影,那麼你對靜態方法的使用是一個好的方法。 – Sebastien

2

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

這應該工作:

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

至少如果它是一個靜態方法...

+0

我認爲它是一個有效的答案,但我不認爲這是使用靜態方法的「好」方法。 – Sebastien

+0

+1我同意這可能不是靜態類的最佳用法。儘管如此,這是Smarty網站的一個實例,因此也是一個有效的解決方案。我無法看到一個贊同的例子downvote作爲邏輯... – War10ck

3

它看起來真的令人毛骨悚然的,但如果你真的想以這種方式來使用它,我建議創建PHP端陣列,它assing給Smarty像:

$movies = array(); 
$movie = new Movie(); 
foreach ($movie->GetAllMovies() as $key => $movieDetails) { 
    $mov = new Movie(); 
    $movies[] = $mov->getMovie($movieDetails['id']); 
} 

$smarty->assign('movies',$movies); 

和智者可以循環thrue您$電影陣列

{foreach from=$movies key=key item=mov} 
    {$mov.rating} 
{/foreach} 
2

我不會告訴你該怎麼做,因爲它沒有任何意義我。

模板引擎用於顯示數據,您應該在模型/控制器中獲取數據。您應該分配給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是電影的數量。

這很可能是代替這一點,你可以運行一個查詢數據庫(取決於您使用的結構連接或甚至沒有),所以如果你得到的數據是最好的方式,你應該重新考慮。

1

我認爲正確的做法是將您的電影數據以「準備展示」的形式展現,例如數組,聯合數組或其多維對應物,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響應。