/** * @return Query|null */ public function getQuery() { if (is_null($this->query)) { $queryBuilder = $this->getQueryBuilder(); $this->adaptQueryBuilder($queryBuilder); // Apply filters $filters = $this->getFilterBuilder()->getCurrentFilters(); /* @var Filter $filter */ foreach ($filters as $filter) { /* @var AbstractORMFilterType $type */ $type = $filter->getType(); $type->setQueryBuilder($queryBuilder); $filter->apply(); } // Apply sorting if (!empty($this->orderBy)) { $orderBy = $this->orderBy; if (!strpos($orderBy, '.')) { $orderBy = 'b.' . $orderBy; } $queryBuilder->orderBy($orderBy, $this->orderDirection == 'DESC' ? 'DESC' : 'ASC'); } // Apply ACL restrictions (if applicable) if (!is_null($this->permissionDef) && !is_null($this->aclHelper)) { $this->query = $this->aclHelper->apply($queryBuilder, $this->permissionDef); } else { $this->query = $queryBuilder->getQuery(); } } return $this->query; }
/** * @param int|null $parentId The parent node id * @param string $lang The locale * @param string $permission The permission (read, write, ...) * @param AclHelper $aclHelper The acl helper * @param bool $includeHiddenFromNav Include nodes hidden from navigation or not * * @return Node[] */ public function getChildNodes($parentId, $lang, $permission, AclHelper $aclHelper, $includeHiddenFromNav = false) { $qb = $this->createQueryBuilder('b')->select('b', 't', 'v')->leftJoin('b.nodeTranslations', 't', 'WITH', 't.lang = :lang')->leftJoin('t.publicNodeVersion', 'v', 'WITH', 't.publicNodeVersion = v.id')->where('b.deleted = 0')->setParameter('lang', $lang)->addOrderBy('t.weight', 'ASC')->addOrderBy('t.title', 'ASC'); if (!$includeHiddenFromNav) { $qb->andWhere('b.hiddenFromNav != true'); } if (is_null($parentId)) { $qb->andWhere('b.parent is NULL'); } elseif ($parentId !== false) { $qb->andWhere('b.parent = :parent')->setParameter('parent', $parentId); } $query = $aclHelper->apply($qb, new PermissionDefinition(array($permission))); return $query->getResult(); }
/** * @covers Kunstmaan\AdminBundle\Helper\Security\Acl\AclHelper::apply * @covers Kunstmaan\AdminBundle\Helper\Security\Acl\AclHelper::cloneQuery */ public function testApplyAnonymous() { /* @var $queryBuilder QueryBuilder */ $queryBuilder = $this->getMockBuilder('Doctrine\\ORM\\QueryBuilder')->disableOriginalConstructor()->getMock(); $query = new Query($this->em); $query->setParameter('paramName', 'paramValue', 'paramType'); $queryBuilder->expects($this->any())->method('getQuery')->will($this->returnValue($query)); $queryBuilder->expects($this->once())->method('getRootEntities')->will($this->returnValue(array('Kunstmaan\\NodeBundle\\Entity\\Node'))); $queryBuilder->expects($this->once())->method('getRootAliases')->will($this->returnValue(array('n'))); $roles = array(); $this->token->expects($this->once())->method('getRoles')->will($this->returnValue($roles)); $this->rh->expects($this->once())->method('getReachableRoles')->with($roles)->will($this->returnValue($roles)); $this->token->expects($this->any())->method('getUser')->will($this->returnValue('anon.')); $permissionDef = new PermissionDefinition(array('view'), 'Kunstmaan\\NodeBundle\\Entity\\Node'); /* @var $query Query */ $query = $this->object->apply($queryBuilder, $permissionDef); $this->assertEquals(MaskBuilder::MASK_VIEW, $query->getHint('acl.mask')); $this->assertEquals($permissionDef->getEntity(), $query->getHint('acl.root.entity')); $this->assertEquals('rootTable', $query->getHint('acl.entityRootTableName')); $this->assertEquals('n', $query->getHint('acl.entityRootTableDqlAlias')); $aclQuery = $query->getHint('acl.extra.query'); $this->assertContains('"IS_AUTHENTICATED_ANONYMOUSLY"', $aclQuery); }