/**
  * @param Query $query
  */
 protected function applyTranslatorGedmoHints(Query &$query)
 {
     if (BELCEBUR_GEDMO_TRANSLATION_LOCALE !== 'BELCEBUR_GEDMO_TRANSLATION_LOCALE') {
         $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, $this->gedmoWalker);
         $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, BELCEBUR_GEDMO_TRANSLATION_LOCALE);
         $query->setHint(TranslatableListener::HINT_FALLBACK, TRUE);
     }
 }
 /**
  * @param Query $query
  * @param string $locale
  * @throws \Exception
  */
 protected function setTranslatableQueryHints(Query $query, $locale)
 {
     if (!class_exists('Gedmo\\Translatable\\TranslatableListener')) {
         throw new \Exception('"Translatable" extension missing. "stof/doctrine-extensions-bundle" needs to be installed');
     }
     $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');
     $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);
     $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK, 1);
 }
Example #3
0
 /**
  * {@inheritdoc}
  */
 public function apply($fromAlias, $fromIdentifier, $resourcePrefix, array $requesterIdentifiers, $mask, array $orX = [])
 {
     $this->query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'AlexDpy\\Acl\\Database\\Filter\\DoctrineOrmAclWalker');
     $this->query->setHint('acl_permissions_table_name', $this->getAclSchema()->getPermissionsTableName());
     $this->query->setHint('acl_resource_prefix', $resourcePrefix);
     $this->query->setHint('acl_requester_identifiers', $requesterIdentifiers);
     $this->query->setHint('acl_mask', $mask);
     $this->query->setHint('acl_from_alias', $fromAlias);
     $this->query->setHint('acl_from_identifier', $fromIdentifier);
     $this->query->setHint('acl_or_x', $orX);
     return $this->query;
 }
Example #4
0
 /**
  * Apply ACL filter
  *
  * @param  QueryBuilder | Query   $query
  * @param  array                  $permissions
  * @param  string | UserInterface $identity
  * @param  string                 $alias
  * @param  array|Query|QueryBuilder $extraCriteria
  *
  * @return Query
  */
 public function apply($query, array $permissions = array('VIEW'), $identity = null, $alias = null, $extraCriteria = false)
 {
     if (null === $identity) {
         $token = $this->securityContext->getToken();
         $identity = $token->getUser();
     }
     $query->setHint(static::HINT_ACL_EXTRA_CRITERIA, $this->getExtraCriteria($extraCriteria));
     if ($query instanceof QueryBuilder) {
         $query = $this->cloneQuery($query->getQuery());
     } elseif ($query instanceof Query) {
         $query = $this->cloneQuery($query);
     } else {
         throw new \Exception();
     }
     $maskBuilder = new MaskBuilder();
     foreach ($permissions as $permission) {
         $mask = constant(get_class($maskBuilder) . '::MASK_' . strtoupper($permission));
         $maskBuilder->add($mask);
     }
     $entity = $this->getEntityFromAlias($query, $alias);
     $metadata = $entity['metadata'];
     $alias = $entity['alias'];
     $table = $metadata->getQuotedTableName($this->em->getConnection()->getDatabasePlatform());
     $aclQuery = $this->getExtraQuery($this->getClasses($metadata), $this->getIdentifiers($identity), $maskBuilder->get());
     $hintAclMetadata = false !== $query->getHint('acl.metadata') ? $query->getHint('acl.metadata') : array();
     $hintAclMetadata[] = array('query' => $aclQuery, 'table' => $table, 'alias' => $alias);
     $query->setHint('acl.metadata', $hintAclMetadata);
     $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, $this->aclWalker);
     return $query;
 }
Example #5
0
 /**
  * Adds a hint to a query object
  *
  * @param Query  $query
  * @param string $name
  * @param mixed  $value
  *
  * @return bool TRUE if the hint is added; otherwise, FALSE
  */
 public function addHint(Query $query, $name, $value)
 {
     $result = false;
     if ($name === Query::HINT_CUSTOM_TREE_WALKERS) {
         $walkers = $query->getHint(Query::HINT_CUSTOM_TREE_WALKERS);
         if (false === $walkers) {
             $walkers = [$value];
             $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $walkers);
             $result = true;
         } elseif (!in_array($value, $walkers, true)) {
             $walkers[] = $value;
             $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $walkers);
             $result = true;
         }
     } elseif ($name === Query::HINT_CUSTOM_OUTPUT_WALKER) {
         if ($query->getHint($name) !== $value) {
             $query->setHint($name, $value);
             $result = true;
         }
     } else {
         $query->setHint($name, $value);
         $result = true;
     }
     return $result;
 }
 /**
  * @param \Doctrine\ORM\Query $query          The Doctrine Query
  * @param array               $fields         Fields to export
  * @param string              $dateTimeFormat
  */
 public function __construct(Query $query, array $fields, $dateTimeFormat = 'r')
 {
     $this->query = clone $query;
     $this->query->setParameters($query->getParameters());
     foreach ($query->getHints() as $name => $value) {
         $this->query->setHint($name, $value);
     }
     $this->propertyAccessor = PropertyAccess::createPropertyAccessor();
     $this->propertyPaths = array();
     foreach ($fields as $name => $field) {
         if (is_string($name) && is_string($field)) {
             $this->propertyPaths[$name] = new PropertyPath($field);
         } else {
             $this->propertyPaths[$field] = new PropertyPath($field);
         }
     }
     $this->dateTimeFormat = $dateTimeFormat;
 }
 /**
  * Updates the configured query object with the where-clause and query-hints.
  *
  * @param string $prependQuery Prepends this string to the where-clause
  *                             (" WHERE " or " AND " for example)
  *
  * @return self
  */
 public function updateQuery($prependQuery = ' WHERE ')
 {
     $whereCase = $this->getWhereClause($prependQuery);
     if ('' !== $whereCase) {
         $this->query->setDQL($this->query->getDQL() . $whereCase);
         $this->query->setHint($this->getQueryHintName(), $this->getQueryHintValue());
     }
     return $this;
 }
Example #8
0
 /**
  * Add a custom TreeWalker $walker class name to
  * be included in the CustomTreeWalker hint list
  * of the given $query
  *
  * @param Query $query
  * @param string $walker
  * @return void
  */
 public static function addCustomTreeWalker(Query $query, $walker)
 {
     $customTreeWalkers = $query->getHint(Query::HINT_CUSTOM_TREE_WALKERS);
     if ($customTreeWalkers !== false && is_array($customTreeWalkers)) {
         $customTreeWalkers = array_merge($customTreeWalkers, array($walker));
     } else {
         $customTreeWalkers = array($walker);
     }
     $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $customTreeWalkers);
 }
 /**
  * @param \Doctrine\ORM\Query $query          The Doctrine Query
  * @param array               $fields         Fields to export
  * @param string              $dateTimeFormat
  */
 public function __construct(Query $query, array $fields, $dateTimeFormat = 'r')
 {
     $this->query = clone $query;
     $this->query->setParameters($query->getParameters());
     foreach ($query->getHints() as $name => $value) {
         $this->query->setHint($name, $value);
     }
     // Note : will be deprecated in Symfony 3.0, conserved for 2.2 compatibility
     // Use createPropertyAccessor() for 3.0
     // @see Symfony\Component\PropertyAccess\PropertyAccess
     $this->propertyAccessor = PropertyAccess::getPropertyAccessor();
     $this->propertyPaths = array();
     foreach ($fields as $name => $field) {
         if (is_string($name) && is_string($field)) {
             $this->propertyPaths[$name] = new PropertyPath($field);
         } else {
             $this->propertyPaths[$field] = new PropertyPath($field);
         }
     }
     $this->dateTimeFormat = $dateTimeFormat;
 }
 public function setHint(\Doctrine\ORM\Query $query)
 {
     return $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');
 }
Example #11
0
 /**
  * Appends a custom tree walker to the tree walkers hint.
  *
  * @param Query $query
  * @param string $walkerClass
  */
 private function appendTreeWalker(Query $query, $walkerClass)
 {
     $hints = $query->getHint(Query::HINT_CUSTOM_TREE_WALKERS);
     if ($hints === false) {
         $hints = array();
     }
     $hints[] = $walkerClass;
     $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $hints);
 }
Example #12
0
 /**
  * Returns valid IDs for a specific entity with ACL restrictions for current user applied
  *
  * @param PermissionDefinition $permissionDef
  *
  * @throws InvalidArgumentException
  *
  * @return array
  */
 public function getAllowedEntityIds(PermissionDefinition $permissionDef)
 {
     $rootEntity = $permissionDef->getEntity();
     if (empty($rootEntity)) {
         throw new InvalidArgumentException("You have to provide an entity class name!");
     }
     $builder = new MaskBuilder();
     foreach ($permissionDef->getPermissions() as $permission) {
         $mask = constant(get_class($builder) . '::MASK_' . strtoupper($permission));
         $builder->add($mask);
     }
     $query = new Query($this->em);
     $query->setHint('acl.mask', $builder->get());
     $query->setHint('acl.root.entity', $rootEntity);
     $sql = $this->getPermittedAclIdsSQLForUser($query);
     $rsm = new ResultSetMapping();
     $rsm->addScalarResult('id', 'id');
     $nativeQuery = $this->em->createNativeQuery($sql, $rsm);
     $transform = function ($item) {
         return $item['id'];
     };
     $result = array_map($transform, $nativeQuery->getScalarResult());
     return $result;
 }
Example #13
0
 /**
  * Sets hints for result query
  *
  * @param Query $query
  */
 protected function setQueryHints(Query $query)
 {
     if (!empty($this->queryHints)) {
         foreach ($this->queryHints as $name => $value) {
             if (defined("Doctrine\\ORM\\Query::{$name}")) {
                 $name = constant("Doctrine\\ORM\\Query::{$name}");
             }
             $query->setHint($name, $value);
         }
     }
 }
Example #14
0
 /**
  * Add hints to the query
  *
  * @param Query       $query  Query
  * @param string|null $locale Lecale to which fallback
  *
  * @return Query
  */
 public function setTranslatableHint(Query $query, $locale = null)
 {
     $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');
     $query->setHint(TranslatableListener::HINT_INNER_JOIN, false);
     $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);
     $query->setHint(TranslatableListener::HINT_FALLBACK, true);
     return $query;
 }
Example #15
0
 /**
  * Adds a Query hint to a Query Object
  * @param \Doctrine\ORM\Query $query
  * @return \Doctrine\ORM\Query 
  */
 public function addHintToQuery(\Doctrine\ORM\Query $query)
 {
     return $query->setHint($this->getConfiguration()->GetQueryHintName(), $this->getConfiguration()->GetQueryHintValue());
 }
 /**
  * Loads all translations with all translatable
  * fields from the given entity
  * 
  * @link https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md#entity-domain-object
  *
  * @param Query   $query
  * @param string  $locale
  * @param string  $result = {'array', 'object'}
  * @param boolean $INNER_JOIN
  * @param boolean $FALLBACK
  * @param boolean $lazy_loading
  *      
  * @return Query   
  * @access public
  * @author Etienne de Longeaux <*****@*****.**>
  */
 public function setTranslatableHints(Query $query, $locale, $INNER_JOIN = false, $FALLBACK = true, $lazy_loading = true)
 {
     // BE CARFULL ::: Strange Issue with Query Hint and APC
     $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');
     // if you use memcache or apc. You should set locale and other options like fallbacks to query through hints. Otherwise the query will be cached with a first used locale
     $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);
     // take locale from session or request etc.
     if ($INNER_JOIN) {
         $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_INNER_JOIN, $INNER_JOIN);
         // will use INNER joins for translations instead of LEFT joins, so that in case if you do not want untranslated records in your result set for instance.
     }
     if (!$lazy_loading) {
         // to avoid lazy-loading.
         $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
     }
     $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK, $FALLBACK);
     // fallback to default values in case if record is not translated
     //        $config = $this->container->get('doctrine')->getManager()->getConfiguration();
     //        if ($config->getCustomHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION) === null) {
     //            $config->addCustomHydrationMode(
     //                TranslationWalker::HYDRATE_OBJECT_TRANSLATION,
     //                'Gedmo\\Translatable\\Hydrator\\ORM\\ObjectHydrator'
     //            );
     //        }
     $query->setHydrationMode(\Gedmo\Translatable\Query\TreeWalker\TranslationWalker::HYDRATE_OBJECT_TRANSLATION);
     $query->setHint(Query::HINT_REFRESH, true);
     return $query;
 }
Example #17
0
 /**
  * Given the Query it returns a new query that is a paginatable query
  * using a modified subselect.
  *
  * @param  Query $query
  * @return Query
  */
 public static function getPaginateQuery(Query $query, $offset, $itemCountPerPage, array $hints = array())
 {
     foreach ($hints as $name => $hint) {
         $query->setHint($name, $hint);
     }
     return $query->setFirstResult($offset)->setMaxResults($itemCountPerPage);
 }
 /**
  * Loads all translations with all translatable
  * fields from the given entity
  *
  * @link https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md#entity-domain-object
  * 
  * @param object $entity Must implement Translatable
  * @return \Doctrine\ORM\Query
  * @param string $locale
  * @param bool    $INNER_JOIN         
  * @access    public
  * 
  * @author Etienne de Longeaux <*****@*****.**>
  */
 public function setTranslatableHints(Query $query, $locale, $INNER_JOIN = false, $FALLBACK = true, $lazy_loading = true)
 {
     $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');
     if ($INNER_JOIN) {
         $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_INNER_JOIN, $INNER_JOIN);
         // will use INNER joins for translations instead of LEFT joins, so that in case if you do not want untranslated records in your result set for instance.
     }
     if (!$lazy_loading) {
         // to avoid lazy-loading.
         $query->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, true);
     }
     $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);
     $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK, $FALLBACK);
     return $query;
 }
 protected function setTranslationHints(Query $query, $locale = null)
 {
     $locale = null === $locale ? $this->defaultLocale : $locale;
     $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker')->setHint(TranslatableListener::HINT_FALLBACK, 1);
     if ($locale) {
         $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);
     }
     return $query;
 }
Example #20
0
 /**
  * Helper function to add mysql specified command to increase the sql performance.
  *
  * @param \Doctrine\ORM\Query $query
  * @param null $index Name of the forced index
  * @param bool $straightJoin true or false. Allow to add STRAIGHT_JOIN select condition
  * @param bool $sqlNoCache
  * @return Query
  */
 public function addCustomHints(Query $query, $index = null, $straightJoin = false, $sqlNoCache = false)
 {
     $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Shopware\\Components\\Model\\Query\\SqlWalker\\ForceIndexWalker');
     if ($straightJoin === true) {
         $query->setHint(SqlWalker\ForceIndexWalker::HINT_STRAIGHT_JOIN, true);
     }
     if ($index !== null) {
         $query->setHint(SqlWalker\ForceIndexWalker::HINT_FORCE_INDEX, $index);
     }
     if ($sqlNoCache === true) {
         $query->setHint(SqlWalker\ForceIndexWalker::HINT_SQL_NO_CACHE, true);
     }
     return $query;
 }
Example #21
0
 /**
  * Add to query share condition
  *
  * @param Query     $query
  * @param Node|null $shareCondition
  */
 protected function addShareConditionToQuery(Query $query, $shareCondition)
 {
     if ($shareCondition) {
         $hints = $query->getHints();
         if (!empty($hints[Query::HINT_CUSTOM_TREE_WALKERS])) {
             $customHints = !in_array(self::ORO_ACL_WALKER, $hints[Query::HINT_CUSTOM_TREE_WALKERS]) ? array_merge($hints[Query::HINT_CUSTOM_TREE_WALKERS], [self::ORO_ACL_WALKER]) : $hints[Query::HINT_CUSTOM_TREE_WALKERS];
         } else {
             $customHints = [self::ORO_ACL_WALKER];
         }
         $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $customHints);
         $query->setHint(AclWalker::ORO_ACL_SHARE_CONDITION, $shareCondition);
     }
 }