/** * @param \Cake\Event\Event $event * @param \Cake\ORM\Query $query * @param \ArrayObject $options * @param bool $primary * @return void */ public function beforeFind(Event $event, Query $query, ArrayObject $options, $primary) { if (!$primary && !$this->_config['recursive']) { return; } $field = $this->_config['field']; if (!$field) { return; } $query->find('hashed'); $idField = $this->_primaryKey; if ($primary && $field === $idField) { $query->traverseExpressions(function ($expression) { if (method_exists($expression, 'getField') && ($expression->getField() === $this->_primaryKey || $expression->getField() === $this->_table->alias() . '.' . $this->_primaryKey)) { $expression->setValue($this->decodeHashid($expression->getValue())); } return $expression; }); } if (!$this->_config['recursive']) { return; } foreach ($this->_table->associations() as $association) { if ($association->target()->hasBehavior('Hashid') && $association->finder() === 'all') { $association->finder('hashed'); } } }
/** * Callback to set the `obfuscated` finder on all associations. * * @param \Cake\ORM\Behavior\Event $event Event. * @param \Cake\ORM\Query $query Query. * @param \ArrayObject $options Options. * @param bool $primary True if this is the primary table. * @return void */ public function beforeFind(Event $event, Query $query, ArrayObject $options, $primary) { if (empty($options['obfuscate']) || !$primary) { return; } $query->traverseExpressions(function ($expression) { $pk = $this->_table->primaryKey(); if (method_exists($expression, 'getField') && in_array($expression->getField(), [$pk, $this->_table->aliasField($pk)])) { $expression->setValue($this->elucidate($expression->getValue())); } return $expression; }); foreach ($this->_table->associations() as $association) { if ($association->target()->hasBehavior('Obfuscate') && 'all' === $association->finder()) { $association->finder('obfuscate'); } } }
/** * Auto-detects find operations performed using the primary key and increments the * associated view counter(s). * * @param \Cake\Event\Event $event * @param \Cake\ORM\Query $query * @param \ArrayObject $options * @param $primary */ public function beforeFind(Event $event, Query $query, ArrayObject $options, $primary) { if (!$primary) { return; } $query->traverseExpressions(function ($expression) use($query, $options) { $primaryKey = $this->_table->primaryKey(); $allowedFields = [$primaryKey, $this->_table->aliasField($primaryKey)]; if (!method_exists($expression, 'getField') || !in_array($expression->getField(), $allowedFields)) { return $expression; } foreach ($this->config('counters') as $counter => $config) { $args = [$query, $options, $counter]; if (!empty($config['callback']) && is_callable($config['callback']) && !call_user_func_array($config['callback'], $args)) { continue; } $config['strategy']->increment($this->_table, $counter, $expression->getValue()); } }); }
/** * Callback to always return rows that have not been `trashed`. * * @param \Cake\Event\Event $event Event. * @param \Cake\ORM\Query $query Query. * @param \ArrayObject $options Options. * @param bool $primary Primary or associated table being queries. * @return void */ public function beforeFind(Event $event, Query $query, ArrayObject $options, $primary) { $field = $this->getTrashField(); $check = false; $query->traverseExpressions(function ($expression) use(&$check, $field) { if ($expression instanceof IdentifierExpression) { !$check && ($check = $expression->getIdentifier() === $field); } }); if ($check) { return; } $query->andWhere($query->newExpr()->isNull($field)); }