Hi all!
xPDOAccessibleObject::loadCollection() (and same methods) not execute query already with accesses conditions. I mean, if we have 100 modResources and 50 modResources in modResourceGroup, xPDO will collect all rows, and then will check load policies. It`s wrong. We must on select-time check load permissions.
I have example.
Have row clases: ModzillaProject extends modAccessibleSimpleObject and ModzillaAccess extends modAccess. In ModzillaAccess we have record for modUsers and modUserGroups policies. I want to grand policies for users and groups separated. But i need select only records for ModzillaProject not existing in ModzillaAccess (no policies - may anything) OR with policies for current user OR with policies for current user groups. And do this via SQL-query.
I add method ModzillaAccess::addCheckListConditions():
public static function addCheckListConditions(xPDO & $xpdo, xPDOCriteria $criteria){
if(empty($criteria->hasCheckListConditions)){
if(!$xpdo->user->get('sudo')){
$criteria->leftJoin('ModzillaAccess', 'Accesses');
$criteria->leftJoin('modUserGroupMember', 'membergroup',
"Accesses.principal_class='modUserGroup'
AND Accesses.principal = membergroup.user_group");
$criteria->where(array(
'Accesses.id' => null,
));
$criteria->orCondition(array(
"Accesses.principal_class" => "modUser",
"AND:Accesses.principal:=" => $xpdo->user->get('id'),
));
}
$criteria->hasCheckListConditions = true;
}
return $criteria;
}
And i may execute queries like this:
// create new query
$q = $modx->newQuery('ModzillaProject');
// add permissions checking conditions
ModzillaAccess::addCheckListConditions($modx, $q);
// Also can counf records
$total = $modx->getCount('ModzillaProject', $q);
// get collection
$projects = $modx->getCollection('ModzillaProject', $q);
On xPDOAccessibleObject::loadCollection() when xPDO collect all record with conditions, it`s will be checked by ModzillaProject::findPolicy() and ModzillaProject::checkPolicy().
P.S. sorry for my "english":(