2011-09-17 129 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