2009-12-13 85 views
0

我正在使用Symfony 1.2.9(與Propel ORM)創建網站。我已經開始使用管理生成器來實現管理功能。向管理生成器生成的管理頁面添加交互

但是我遇到了一個輕微的'問題'。我的模型是相關的(例如,一個表可能有幾個1:N關係和N:N關係)。我還沒有找到一種方法來解決這個令人滿意的呢。作爲戰術解決方案(對於列表視圖),我決定只顯示父對象,然後添加交互以顯示相關對象。

我將使用博客模型來說明這一點。

這裏有一個博客模式的關係:

N:與博客鏈接中號的關係(機型博客卷) 1:N與博文關係(模型提交給博客的一篇文章)

我最初打算顯示博客的(分頁)博客帖子列表,當它被選中時,使用AJAX,但我用管理生成器掙扎了很多,所以我擱置了這個想法 - 除非有人足夠闡明瞭如何做到這一點。

相反,我現在所做的(作爲一種戰術/臨時溶液),是我加入互動的列表視圖,允許用戶:

  1. 查看該博客滾動列表在 博客上該行

  2. 查看這篇文章的博客上該行

  3. 列表添加後在博客上塔排

在以上所有內容中,我已經編寫了基本上將請求轉發給適當操作(管理員生成)的操作。但是,我需要傳遞一些參數(如博客ID等),以便返回正確的博客文章或博客文章列表等。

我肯定有做我想要做的更好的方法,但如果沒有在這裏是我的問題:

  1. 我如何可以獲取涉及特定對象行(的
    點擊鏈接)的列表視圖(例如,在這個例子中,博客對象)

  2. 一旦有了對象,我可能會選擇提取各個領域:ID等 如何傳遞這些管理員生成的操作的參數?

關於第二個問題,我的猜測是,這可能是爲了做到這一點(我可能是錯的)

public function executeMyAddedBlogRollInteractionLink(sfWebRequest $request) 
{ 
    // get the object *somehow* (I'm guessing this may work) 
    $object = $this->getRoute()->getObject(); 

    // retrieve the required parameters from the object, and build a query string 
    $query_str=$object->getId(); 

    //forward the request to the generated code (action to display blogroll list in this case) 
    $this->forward('backendmodulename',"getblogrolllistaction?params=$query_string"); 
} 

這感覺就像一個黑客攻擊的一位,但我不知道該怎麼辦。我也不會熱衷於發送參數(可能包括user_id等,通過GET,甚至POST也不是那麼安全,因爲瀏覽器正在做什麼請求是相當有前途的)。如果有一種比我上面提出的更好的方式來實現具有1個或更多M:N關係的對象所需的這種管理,我將非常高興聽到「推薦」的方式。

我記得閱讀有關標記某些行動爲內部。即只能從應用內調用。我想知道在這種情況下這是否有用?

回答

0

我假設你的應用程序被稱爲後端。假設有兩個模型,BlogPost和BlogPostComment。這些使用admin生成的模塊(稱爲blog_post和blog_post_comment)進行管理。

我相信你想要在backend.php/blog_post的列表頁面上顯示每個BlogPost的鏈接。這些鏈接將帶您到backend.php/blog_post_comment,它應該只顯示與相關BlogPost相關的評論。

在應用程序/後端/ blog_post /模板,創建一個名爲_commentslink.php文件,並把這個在它:在應用程序/後端/ blog_post /配置/ generator.yml中

<a href="<?php echo url_for('blog_post_comment_collection', array('action' => 'filter', 'blog_post_comment_filters[blogpost_id]'=>$blog_post->getId())) ?>">View Comments</a> 

然後,你需要包括這部分在列表視圖中的字段:

.... 
param: 
    config: 
    list: 
     display: [ id, title, _commentslink ] 

注意_commentslink - 中_告訴它,而不是使用尋找模型領域的部分。在這種情況下,您的對象可在此部分中獲得,如$ <型號的名稱> - $ blog_post。

本質上,這個方法所做的就是鏈接到評論列表上的過濾器通常所用的相同動作,並將相關條件傳遞給它,以使其通過blogpost_id進行過濾。

如果您在後端啓用了CSRF保護,則需要禁用它,否則此方法將無法工作。這是在apps/backend/config/settings.yml中設置的。在那裏會有一個名爲csrf_secret的設置 - 它應該設置爲false來禁用csrf。

如果您需要支持表單中的1:N關係,您應該嘗試使用symfony 1.3/1.4。 1.3根據我的經驗,從1.2.x開始免費升級 - 1.4是相同的,但刪除了不推薦使用的功能。

+0

嗨本 - 道歉的延遲響應。關於你的建議,有一個小問題(至少AFAI知道)。博客和博客帖是不同的模型,因此屬於不同的模塊。看起來在你的解決方案中,部分模板需要在同一個模塊中......? (* Sigh *) – 2009-12-14 14:58:03

+0

基本上,我需要找到一種將參數從一個模塊傳遞到另一個模塊的方法,同時使用'添加交互'到列表視圖。這就是我要去的地方... – 2009-12-14 14:59:51

+1

_postlist部分進入博客模式(我應該稱之爲評論列表)。將它放在那裏是正確的,它是指向與特定博客文章相關的評論列表的鏈接。 – benlumley 2009-12-14 16:06:22