14 public $rightsTable =
'Rights';
16 private $_items = array();
17 private $_itemChildren = array();
30 if( $this->hasItemChild($itemName, $childName)===
false )
47 public function assign($itemName, $userId, $bizRule=null, $data=null)
50 if( $this->getAuthAssignment($itemName, $userId)===null )
64 if( $allowCaching && $this->_items===array() )
68 if( $allowCaching && isset($this->_items[ $name ]) )
70 return $this->_items[ $name ];
73 else if( ($item = parent::getAuthItem($name))!==null )
92 if( $this->_items===array() )
97 foreach( $this->_items as $name=>$item )
99 if( in_array($name, $names) )
102 $items[ $item->getType() ][ $name ] = $item;
104 $items[ $name ] = $item;
126 if( $type===null && $userId===null )
128 $command=$this->db->createCommand()
129 ->select(
'name,t1.type,description,t1.bizrule,t1.data,weight')
130 ->from($this->itemTable.
' t1')
131 ->leftJoin($this->rightsTable.
' t2',
'name=itemname')
132 ->order(
't1.type DESC, weight ASC');
134 else if( $userId===null )
136 $command=$this->db->createCommand()
137 ->select(
'name,t1.type,description,t1.bizrule,t1.data,weight')
138 ->from($this->itemTable.
' t1')
139 ->leftJoin($this->rightsTable.
' t2',
'name=itemname')
140 ->where(
't1.type=:type')
141 ->order(
't1.type DESC, weight ASC');
142 $command->bindValue(
':type', $type);
144 else if( $type===null )
146 $command=$this->db->createCommand()
147 ->select(
'name,t1.type,description,t1.bizrule,t1.data,weight')
148 ->from($this->itemTable.
' t1')
149 ->leftJoin($this->assignmentTable .
' t2',
'name=t2.itemname')
150 ->leftJoin($this->rightsTable.
' t3',
'name=t3.itemname')
151 ->where(
'userid=:userid')
152 ->order(
't1.type DESC, weight ASC');
153 $command->bindValue(
':userid', $userId);
157 $command=$this->db->createCommand()
158 ->select(
'name,t1.type,description,t1.bizrule,t1.data,weight')
159 ->from($this->itemTable.
' t1')
160 ->leftJoin($this->assignmentTable .
' t2',
'name=t2.itemname')
161 ->leftJoin($this->rightsTable.
' t3',
'name=t3.itemname')
162 ->where(
't1.type=:type AND userid=:userid')
163 ->order(
't1.type DESC, weight ASC');
164 $command->bindValue(
':type', $type);
165 $command->bindValue(
':userid', $userId);
169 foreach($command->queryAll() as $row)
170 $items[ $row[
'name'] ] =
new CAuthItem($this, $row[
'name'], $row[
'type'], $row[
'description'], $row[
'bizrule'], unserialize($row[
'data']));
192 $key = $names===(array)$names ? implode(
'|', $names) : $names;
195 if( $allowCaching && isset($this->_itemChildren[ $key ])===true )
197 return $this->_itemChildren[ $key ];
203 if( is_string($names) )
205 $condition =
'parent='.$this->db->quoteValue($names);
208 else if( $names===(array)$names && $names!==array() )
210 foreach($names as &$name)
211 $name=$this->db->quoteValue($name);
213 $condition =
'parent IN ('.implode(
', ', $names).
')';
224 $command = $this->db->createCommand()
225 ->select(
'name, type, description, bizrule, data')
226 ->from(
"{$this->itemTable}, {$this->itemChildTable}")
227 ->where(
"{$condition} AND name=child");
230 foreach( $command->queryAll() as $row )
232 if( ($data = @unserialize($row[
'data']))===false )
235 $children[ $row[
'name'] ] =
new CAuthItem($this, $row[
'name'], $row[
'type'], $row[
'description'], $row[
'bizrule'], $data);
242 return $this->_itemChildren[ $key ] = $children;
246 public function getAssignmentsByItemName($name)
249 $command = $this->db->createCommand()
251 ->from($this->assignmentTable)
252 ->where(
'itemname=:itemname');
253 $command->bindValue(
':itemname', $name);
255 $assignments=array();
256 foreach($command->queryAll() as $row)
258 if(($data=@unserialize($row[
'data']))===
false)
261 $assignments[ $row[
'userid'] ] =
new CAuthAssignment($this, $row[
'itemname'], $row[
'userid'], $row[
'bizrule'], $data);
273 foreach( $result as $weight=>$itemname )
277 $command = $this->db->createCommand()
279 ->from($this->rightsTable)
280 ->where(
'itemname=:itemname');
281 $command->bindValue(
':itemname', $itemname);
284 if( $command->queryScalar()>0 )
289 $command = $this->db->createCommand()
290 ->update($this->rightsTable, array(
'weight'=> $weight),
'itemname=:itemname', array(
':itemname' => $itemname));
298 if( ($item = $this->
getAuthItem($itemname))!==null )
302 $command = $this->db->createCommand()
303 ->insert($this->rightsTable, array(
'itemname' => $itemname,
'type'=>$item->getType(),
'weight'=>$weight));