LifeType 中文開發論壇

開發 => 核心補強 => 主題作者是: robin 於 七月 27, 2007, 04:34:45 下午



主題: 关于MVC在模版调用方法的问题请教
作者: robin七月 27, 2007, 04:34:45 下午
我在SUMMARY模块,看如下的模版写法:

 {foreach from=$users item=user}
   {include file="summary/user.template"}
    {/foreach}



       {if $user->hasPicture()}
   {assign var=picture value=$user->getPicture()}
        <img src="{$picture->getPreviewLink()}"  width="60" height="80" class="postgrav" />
    {else}
        <img src="templates/summary/nouser.gif" class="postgrav" width="60" height="80" alt="{$user->getUsername()|strip_tags}" />   
    {/if}

        <h3><a href="?op=UserProfile&amp;userId={$user->getId()}">{$user->getUsername()}</a></h3>
      <div class="subtitle">
       <b>{$locale->tr("blogs")}:</b>
       {assign var=userBlogs value=$user->getBlogs()}
       {foreach from=$userBlogs item=userBlog name=userBlogsLoop}
        {assign var=urlGen value=$userBlog->getBlogRequestGenerator()}
        <a href="{$urlGen->blogLink()}">{$userBlog->getBlog()}</a>{if !$smarty.foreach.userBlogsLoop.last}, {/if}
       {/foreach}
      </div>
      
      <div class="footer">{$user->getAboutMyself()|strip_tags}</div>
      <div class="clearleft">&nbsp;</div>
-----------------------------
          问题是:我发现这里调用了$user->getAboutMyself,$user->getBlogs()等等的方法,但是这些是userinfo的方法,可是我在这个模版相关的models,和view里,都没有new这个类,所以这是通过什么样的方法来调用的呢?

         我很想了解这是怎么写的,因此,我现在在研究MVC,我发现要用SMARTY模版来显示一个多维数组里的指写信息有些复杂,我不想用先生成一个ID数组,再FOREACH这个ID数组,把用ID来调用方法来重新取得要的值。因为我发现LIFETYPE不是这么做的,但是我又找不出它是怎么做的。

另外不知道用SMARTY来处理是否可行,比如一个多维数组:

                 $fruits = array(
     array("a"=>"orange","b"=>"banana","c"=>"apple"),
     array("a"=>"banana","b"=>"orange","c"=>"apple"),
     array("a"=>"orange","b"=>"banana","c"=>"apple"),
);

怎么样用foreach里面的值,并能对它们进行布局。



主題: Re: 关于MVC在模版调用方法的问题请教
作者: robin七月 30, 2007, 01:31:54 下午
这个问题已经解决,呵呵!

现在在研究的问题是:

              怎样对部分ACTION的进行去缓存,包括本机的CACHE,以及服务器的SMARTY的CACHE,有研究过的可以告诉小弟一声吗?


主題: Re: 关于MVC在模版调用方法的问题请教
作者: markwu七月 30, 2007, 01:58:26 下午
1. user 是從 users 來的,而 users 是 userInfo 的 collection/array, 這是從 /class/summary/view/summaryuserlistview.class.php 所 assign 進來的。

2. 基本上 action 不會有 cache,而是 view 才有 cache。你可以看一下 /class/summary/view/summarycachedview.class.php 這個 class,基本上他會依造你所傳進來的參數進行 md5 的運算,產生單一 cache 檔案。當 view 已經被 cache 過,下一次就不會再去產生 cache。

所以你的 view 要改成cache 版本,就要繼承 SummaryCachedView 而非 SummaryView。

Mark


主題: Re: 关于MVC在模版调用方法的问题请教
作者: robin八月 01, 2007, 02:44:55 下午
1. user 是从 users 来的,而 users 是 userInfo 的 collection/array, 这是从 /class/summary/view/summaryuserlistview.class.php 所 assign 进来的。

2. 基本上 action 不会有 cache,而是 view 才有 cache。你可以看一下 /class/summary/view/summarycachedview.class.php 这个 class,基本上他会依造你所传进来的参数进行 md5 的运算,产生单一 cache 档案。当 view 已经被 cache 过,下一次就不会再去产生 cache。

所以你的 view 要改成cache 版本,就要继承 SummaryCachedView 而非 SummaryView。

Mark

谢谢强哥回复偶的提问:

[1],偶对这个 collection/array,还是不很了解,这么说,那些方法,只是从每一个数组中取得所要的值,不是再根据ID从数据库取了吧?比如:{$user->getUsername()}。
我现在是这样来解决的:首先DAO里生成一个总数组,然后在ACTION里传到一个变量,再在SMARTY通过以下的跑出来:

---------------------

   {section name=question loop=$Questions}
     <li class="item">
   姓名: {$Questions[question].name}<br>
   博客: {$Questions[question].blogaddress}<br>
   问题: {$Questions[question].message}<br>
   </li>
{/section}
----------------------

[2]对于第二个问题,就也是我要这个OP的VIEW没有CACHE的说,就继承SUMMARYVIEW了,不过这样里面调用的方法体也要更着改了,我会尽快试试效果。

再次谢谢!


主題: Re: 关于MVC在模版调用方法的问题请教
作者: markwu八月 01, 2007, 03:33:41 下午
這就要看你的寫法了。

在 LifeType 中,每一個類別 (post, comment, link, xxx ) 都有一個相對的 model,在這個 model 中會定義如何去存取,更新這些物件。另外每一個類別,也都有類別的定義檔,去定義如何存取物件內的屬性。

所以所以如果從 model 中取出的是一個 userInfo 的 array,我們假設 $users 好了。我們就必須用 $userInfo 的方法 (method) 來取用這些屬性。

所以從你的程式中,我看不出來,你是怎麼把 Questions 取出來的。假設,他只是個資料 array,而非是 obejct 的 array,那麼你這樣寫就對了。

另外 Questions 他在Action/View 中被取出後,必須要 assign 到 view 的變數中,透過 setValue('Questions', $questions); 。

這樣在模版終究可以透過 $Questions 來取用你從 model 中所取出的資料或是 obecjt 的 array.

Mark