2011-09-17 163 views
0

我正在建一個CMS類網站,會有很多管理員用戶。 ACL適用於業務層。但是現在我們想要將自定義ACL邏輯應用於基於admin用戶所屬城市的模型。擴展zend db選擇

例如: 管理員用戶來自紐約。他可以查看與紐約市相關的內容。

我有很多使用Zend_Db_Select在模型中構建的查詢。現在我已經改變了各地的查詢。有沒有辦法,我可以爲每個查詢添加邏輯 - > where('u.city_id =?',$ admin_user_city_id) 。

在此先感謝。

感謝 VENU

回答

2

我認爲你可能不需要延長Zend_Db_Table_Select。您只需將Zend_Db_Table_AbstractMy_Db_Table_Abstract一起延伸,即可擴展您的所有型號。在該抽象類中,您將擴展默認的select(),返回Zend_Db_Table_Select,並且在返回之前,只需將where子句添加到它。

因此,每次您打電話給$myModel -> select()時,它都會包含您的where子句。

abstract class My_Db_Table_Abstract extends Zend_Db_Table_Abstract 
{ 
    public function select($withFromPart = self::SELECT_WITHOUT_FROM_PART) 
    { 
     $select = parent::select($withFromPart); 
     # Retreive $admin_user_city_id 
     $select -> where('u.city_id = ?', $admin_user_city_id); 
     return $select; 
    } 
} 

當然也意味着你已經做出了正確的加入到你的u表將取決於你在模型上的某處。

+0

如果我想調用db適配器上的選擇對象怎麼辦?我認爲這不會起作用。所以我想擴展Zend_Db_Select .. – Venu

+0

對我來說,數據庫適配器並不是商業代碼的地方。無論如何,如果你想如何去,你仍然可以根據你現在使用的適配器,製作自己的適配器來擴展'Zend_Db_Adapter_Abstract'或'Zend_Db_Adapter_Mysqli'。然後你做同樣的事情,我通過擴展'select()'方法來解釋我的答案。 – jhuet

+0

由於Zend_Db_Table_Select擴展了''Zend_Db_Select'',因此您將不會在該類中進行修改。這就是爲什麼我會優先修改訪問器。 – jhuet