2009-12-09 22 views
4

我使用SF 1.2.9構建網站。我想使用管理生成器爲我已使用的對象模型(特別是LIST,編輯和刪除)提供管理功能。多用戶設置Symfony Admin Generator(限制LIST視圖中的記錄)

我已閱讀Symfony文檔(第14章),但除非我非常誤解,否則迄今爲止所有關於這些文檔的示例似乎都只針對單個用戶環境編寫。這意味着返回給用戶的記錄列表基本上就是該表中的所有記錄。在多用戶環境中,這充其量不可置疑,並且可能是安全威脅。將返回給用戶的記錄列表限制爲只有他們擁有(即創建)的記錄纔是必要的要求。

假設我有(陽明)架構像這樣的表:

foobar_dongle: 
    id:   ~ 
    title:  varchar(255) 
    info:  longvarchar 
    owner_id: ~ 
    created_at: ~ 

其中所有者ID是一個FK到用戶表。

假設我生成一個管理模塊是這樣的:

symfony propel:generate-admin backend FoobarDongle --module=dongle 

問: 如何修改的記錄列表中由管理員生成的代碼的LIST一部分返回給用戶發電機?正如我上面提到的那樣,當前(即開箱即用),管理員生成器向用戶呈現(相當天真,我感覺),併爲所管理的模型記錄整套記錄。我需要能夠以某種方式限制該列表,以便我只能返回該用戶擁有的記錄。

這就是我試圖找出如何去做的。

我將非常感謝任何能告訴我如何限制使用管理生成器管理對象模型時返回的記錄列表的人。理想情況下,我希望能夠指定一個具有所有自定義「過濾」邏輯的自定義方法 - 但只要我可以限制用戶可以看到的記錄的列表(在管理員中),僅限於他是所有者,這就是我想要做的。

+0

你可以在管理生成器中使用table_method以及:http://stackoverflow.com/questions/1308215/filter-content-in-symfony-1-2-x-admin-generator – gpilotino 2009-12-11 14:36:07

回答

5

如果你只是想限制一個或兩個模塊返回的對象,這樣做:

轉到actions.class.php文件的模塊。默認情況下,應該沒有方法,並且該類應該從autoModuleNameActions繼承。插入以下方法:

protected function buildQuery() 
{ 
    $query = parent::buildQuery(); 
    // do what ever you like with the query like 
    $query->andWhere('user_id = ?', $this->getUser()->getId()); 
    return $query; 
} 

但是,如果您爲更多模塊執行此操作,這將變得不方便。在這種情況下,我會建議。

如果您想根據管理生成器配置文件中的某些自定義參數進行查詢,則必須擴展此文件。但不只是添加一個新參數。你可以閱讀this article如何做到這一點。

如果您想了解更多關於自動生成的課程,請查看此課程:cache/[app]/[env]/modules/auto[ModuleName]/actions/actions.class.php。評論後


編輯:

我覺得你看在錯誤的類。看這裏:cache/[app]/[env]/modules/auto[ModuleName]/actions/actions.class.php

我成立了一個行走專案以檢查它,這是對你有意思的方法是:

protected function buildCriteria() 
{ 
    if (is_null($this->filters)) 
    { 
    $this->filters = $this->configuration->getFilterForm($this->getFilters()); 
    } 

    $criteria = $this->filters->buildCriteria($this->getFilters()); 

    $this->addSortCriteria($criteria); 

    $event = $this->dispatcher->filter(new sfEvent($this, 'admin.build_criteria'), $criteria); 
    $criteria = $event->getReturnValue(); 

    return $criteria; 
} 

我還張貼了這個類的全部內容,以pastebin。這是一個很大的功能是線245即使你沒有找到這個類,你應該能夠覆蓋該方法是這樣的:

protected function buildCriteria() 
{ 
    $criteria = parent::buildCriteria(); 
    // do something with it 
    return $criteria; 
} 

我不知道這些標準的對象,所以我不能幫你,但我希望其他的事情能幫助你。

+0

我認爲我們正在變暖...我會調查這一點(即嘗試實施您的建議),並在稍後返回反饋。謝謝 – 2009-12-09 22:14:11

+0

這可能已經在上面提到的鏈接中,如果是這樣,請接受我的道歉。我想知道是否可以用一些自定義方法擴展生成的功能。我的意思是,例如,標準功能是CRUD,但是可能會添加其他'操作'(除'新','編輯','刪除'等),然後顯示在生成的管理模塊中。非常感謝您的幫助。 – 2009-12-09 22:20:35

+0

嗨菲利克斯,buildQuery()看起來像一個學說方法可疑。我使用Propel作爲我的ORM(應該早些時候提到它)。你的建議是不是buildQuery()仍然有效? – 2009-12-09 23:08:04

1

您應該使用sfGuardPlugin提供您的登錄/用戶功能 - 它包括可以分配給用戶和/或組的用戶組和權限。

使用security.yml,您可以配置訪問單個操作所需的權限/憑證。 IE:您可以允許每個人訪問列表/更新/刪除操作,但只有擁有創建權限才能訪問創建頁面的人員。

爲sfGuardPlugin的文檔是值得一讀:

http://www.symfony-project.org/plugins/sfGuardPlugin

加在jobeet教程本節介紹sfGuard,還可以使用安全的。陽明海運和證書:

http://www.symfony-project.org/jobeet/1_2/Propel/en/13

並四捨五入,這書頁是有關太:

http://www.symfony-project.org/reference/1_2/en/08-Security(雖然不知道它涵蓋了什麼,是不是在我從Jobeet的鏈接頁面)

+0

謝謝本。問題在於它不僅僅是訪問的情況。我想讓用戶只能看到屬於他們的內容。換句話說(可能更簡潔): 管理生成器正在生成代碼,該代碼被執行用於「列表」操作。我想知道如何在這裏指定我自己的方法,以便我可以控制呈現給用戶的列表。就像這樣(並且到目前爲止我看到的所有文檔中),用戶都會返回數據庫的全部記錄(對於該模型),這是不可接受的。 – 2009-12-09 11:51:26

+0

也許,這真的是我應該問的這個問題: 如何修改管理生成器生成的代碼的'列表'部分中返回給用戶的記錄列表? 正如我上面提到的那樣,當前(即開箱即用),管理生成器向用戶呈現用戶(相當天真地,我感覺),併爲整個模型記錄進行管理。 我需要能夠以某種方式限制該列表,以便我只能返回該用戶擁有的記錄。這正是我想要找出如何去做的。 – 2009-12-09 11:55:33

+0

我已將您的答案標記爲已接受的答案。冒着重複自己的風險....謝謝:) – 2009-12-10 12:44:22