We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
  • 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":(
      MODX Revolution expert
      Follow ME on Twitter | Feel free ask any question on MODX-club