Skip to content

Commit

Permalink
various fixes for phpstan level9 code analysis #3
Browse files Browse the repository at this point in the history
  • Loading branch information
Josef Stich committed Apr 3, 2024
1 parent ae7fc37 commit 36d32a9
Show file tree
Hide file tree
Showing 19 changed files with 401 additions and 97 deletions.
85 changes: 67 additions & 18 deletions Controller/Component/FilterComponent.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,46 @@
*/
class FilterComponent extends Component
{
/**
* @var string[]
*/
public $components = array('Session');

/**
* @var array<string, array<string, mixed>>
*/
public $settings = array();

/**
* @var array<mixed>
*/
public $nopersist = array();

/**
* @var array<string, array<string, mixed>>
*/
public $formData = array();

/**
* @var array<mixed>
*/
protected $_request_settings = array();

/**
* @param ComponentCollection $collection
* @param array<mixed> $settings
*/
public function __construct(ComponentCollection $collection, $settings = array())
{
parent::__construct($collection, $settings);
$this->_request_settings = $settings;
}

public function initialize(Controller $controller)
/**
* @param Controller $controller
* @return void
*/
public function initialize(Controller $controller): void
{
if (!isset($controller->filters)) {
return;
Expand All @@ -50,7 +76,10 @@ public function initialize(Controller $controller)

foreach ($settings as $model => $filter) {
if (!isset($controller->{$model})) {
trigger_error(__('Filter model not found: %s', $model));
$errMsg = __('Filter model not found: %s', $model);
if (is_string($errMsg)) {
trigger_error($errMsg);
}
continue;
}

Expand All @@ -64,6 +93,7 @@ public function startup(Controller $controller)
return;
}

/** @var array<string, array<mixed>> $settings */
$settings = $this->settings[$controller->name][$controller->request->action];

if (!in_array('Filter.Filter', $controller->helpers)) {
Expand All @@ -73,15 +103,18 @@ public function startup(Controller $controller)
$sessionKey = sprintf('FilterPlugin.Filters.%s.%s', $controller->name, $controller->request->action);
$filterFormId = $controller->request->query('filterFormId');
if ($controller->request->is('get') && !empty($filterFormId)) {
$this->formData = $controller->request->query('data');
$dataFromQuery = $controller->request->query('data');
if (is_array($dataFromQuery)) {
$this->formData = $dataFromQuery;
}
} elseif (!$controller->request->is('post') || !isset($controller->request->data['Filter']['filterFormId'])) {
$persistedData = array();

if ($this->Session->check($sessionKey)) {
$persistedData = $this->Session->read($sessionKey);
}

if (empty($persistedData)) {
if (empty($persistedData) || !is_array($persistedData)) {
return;
}

Expand All @@ -95,7 +128,10 @@ public function startup(Controller $controller)

foreach ($settings as $model => $options) {
if (!isset($controller->{$model})) {
trigger_error(__('Filter model not found: %s', $model));
$errMsg = __('Filter model not found: %s', $model);
if (is_string($errMsg)) {
trigger_error($errMsg);
}
continue;
}

Expand All @@ -109,12 +145,16 @@ public function beforeRender(Controller $controller)
return;
}

/** @var array<string, array<string, array<mixed>>> $models */
$models = $this->settings[$controller->name][$controller->request->action];
$viewFilterParams = array();

foreach ($models as $model => $fields) {
if (!isset($controller->$model)) {
trigger_error(__('Filter model not found: %s', $model));
$errMsg = __('Filter model not found: %s', $model);
if (is_string($errMsg)) {
trigger_error($errMsg);
}
continue;
}

Expand Down Expand Up @@ -172,6 +212,7 @@ public function beforeRender(Controller $controller)
$options['type'] = 'select';

$selectOptions = array();
/** @var Model $workingModel */
$workingModel = ClassRegistry::init($fieldModel);

if (isset($settings['selectOptions'])) {
Expand All @@ -180,15 +221,15 @@ public function beforeRender(Controller $controller)

if (isset($settings['selector'])) {
if (!method_exists($workingModel, $settings['selector'])) {
trigger_error
(
__(
'Selector method "%s" not found in model "%s" for field "%s"!',
$settings['selector'],
$fieldModel,
$fieldName
)
$errMsg = __(
'Selector method "%s" not found in model "%s" for field "%s"!',
$settings['selector'],
$fieldModel,
$fieldName
);
if (is_string($errMsg)) {
trigger_error($errMsg);
}
return;
}

Expand Down Expand Up @@ -246,8 +287,7 @@ public function beforeRender(Controller $controller)
$options['value'] = $settings['default'];
}

$viewFilterParams[] = array
(
$viewFilterParams[] = array(
'name' => sprintf('%s.%s', $fieldModel, $fieldName),
'options' => $options
);
Expand All @@ -273,10 +313,18 @@ public function beforeRender(Controller $controller)
$controller->set('viewFilterParams', $viewFilterParams);
}

private function __updatePersistence($controller, $settings)
/**
* @param Controller $controller
* @param array<mixed> $settings
* @return void
*/
private function __updatePersistence(Controller $controller, array $settings): void
{
if ($this->Session->check('FilterPlugin.NoPersist')) {
$this->nopersist = $this->Session->read('FilterPlugin.NoPersist');
$nopersistFromSession = $this->Session->read('FilterPlugin.NoPersist');
if (is_array($nopersistFromSession)) {
$this->nopersist = $nopersistFromSession;
}
}

if (isset($settings['nopersist'])) {
Expand All @@ -299,6 +347,7 @@ private function __updatePersistence($controller, $settings)
$actions = array();
}

/** @var string[] $actions */
if (empty($actions) && $controller->name != $nopersistController) {
if ($this->Session->check(sprintf('FilterPlugin.Filters.%s', $nopersistController))) {
$this->Session->delete(sprintf('FilterPlugin.Filters.%s', $nopersistController));
Expand Down
77 changes: 55 additions & 22 deletions Model/Behavior/FilteredBehavior.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,15 @@ class FilteredBehavior extends ModelBehavior
/**
* Keeps current values after filter form post.
*
* @var array
* @var array<string, array<mixed>>
*/
protected $_filterValues = array();

/**
* @param Model $Model
* @param array<mixed> $settings
* @return void
*/
public function setup(Model $Model, $settings = array())
{
foreach ($settings as $key => $value) {
Expand All @@ -44,7 +49,12 @@ public function setup(Model $Model, $settings = array())
$this->_filterValues[$Model->alias] = array();
}

public function beforeFind(Model $Model, $query)
/**
* @param Model $Model
* @param array<mixed> $query
* @return array<mixed>
*/
public function beforeFind(Model $Model, $query): array
{
if (isset($query['nofilter']) && $query['nofilter'] === true) {
return $query;
Expand All @@ -64,12 +74,14 @@ public function beforeFind(Model $Model, $query)
}

$settings = $this->settings[$Model->alias];
/** @var array<string, array<mixed>> $values */
$values = $this->_filterValues[$Model->alias];

foreach ($settings as $field => $options) {
$this->addFieldToFilter($Model, $query, $settings, $values, $field, $options);
}

/** @var Model $Model */
if (method_exists($Model, 'afterDataFilter')) {
$callbackOptions['values'] = $this->_filterValues[$Model->alias];
$callbackOptions['settings'] = $this->settings[$Model->alias];
Expand All @@ -84,7 +96,16 @@ public function beforeFind(Model $Model, $query)
return $query;
}

protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field, $field_options)
/**
* @param Model $Model
* @param array<mixed> $query
* @param array<mixed> $settings
* @param array<string, array<mixed>> $values
* @param string $field
* @param array<mixed> $field_options
* @return void
*/
protected function addFieldToFilter(Model &$Model, array &$query, array $settings, array $values, string $field, array $field_options): void
{
$configurationModelName = $Model->alias;
$configurationFieldName = $field;
Expand All @@ -99,7 +120,10 @@ protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field

if ($field_options['required'] && !isset($values[$configurationModelName][$configurationFieldName])) {
// TODO: implement a bit of a user friendly handling of this scenario..
trigger_error(__('No value present for required field %s and default value not present', $field));
$errMsg = __('No value present for required field %s and default value not present', $field);
if (is_string($errMsg)) {
trigger_error($errMsg);
}
return;
}

Expand Down Expand Up @@ -175,9 +199,10 @@ protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field
*
* @param Model $Model
* @param Model $relatedModel
* @return array Cake join array
* @param string $linkModelName
* @return array<mixed> Cake join array
*/
protected function buildFilterJoin(Model &$Model, Model &$relatedModel, $linkModelName)
protected function buildFilterJoin(Model &$Model, Model &$relatedModel, string $linkModelName): array
{
$conditions = array();
$relationTypes = array('hasMany', 'hasOne', 'belongsTo', 'hasAndBelongsToMany');
Expand Down Expand Up @@ -240,7 +265,14 @@ protected function buildFilterJoin(Model &$Model, Model &$relatedModel, $linkMod
$customConditions = array($customConditions);
}

$filterConditions = preg_replace(sprintf('#(?<![A-Za-z])%s(?![A-Za-z])#', $relatedModel->alias), $relatedModelAlias, $customConditions);
$filterConditions = preg_replace(
sprintf(
'#(?<![A-Za-z])%s(?![A-Za-z])#',
$relatedModel->alias
),
(is_string($relatedModelAlias) ? $relatedModelAlias : ''),
$customConditions
);
$conditions = array_merge($conditions, $filterConditions);
}

Expand Down Expand Up @@ -280,12 +312,12 @@ protected function buildFilterJoin(Model &$Model, Model &$relatedModel, $linkMod
/**
* Build query conditions and add them to $query.
*
* @param array $query Cake query array.
* @param array<string, array<mixed>> $query Cake query array.
* @param string $field Filter field.
* @param array $options Configuration options for this field.
* @param array<mixed> $options Configuration options for this field.
* @param mixed $value Field value.
*/
protected function buildFilterConditions(array &$query, $field, $options, $value)
protected function buildFilterConditions(array &$query, string $field, array $options, $value): void
{
$conditionFieldFormats = array (
'like' => '%s like',
Expand All @@ -310,6 +342,7 @@ protected function buildFilterConditions(array &$query, $field, $options, $value

switch ($options['type']) {
case 'text':
/** @var bool|float|int|string|null $value */
if (strlen(trim(strval($value))) == 0) {
break;
}
Expand Down Expand Up @@ -354,15 +387,16 @@ protected function buildFilterConditions(array &$query, $field, $options, $value
/**
* Makes a string SQL-safe.
*
* @param string $string String to sanitize.
* @param mixed $string String to sanitize.
* @param string $connection Database connection being used.
* @return string SQL safe string.
* @return mixed SQL safe string.
*/
private function __escape($string, $connection = 'default')
private function __escape($string, string $connection = 'default')
{
if (is_numeric($string) || $string === null || is_bool($string)) {
if (!is_string($string)) {
return $string;
}
/** @var DboSource $db */
$db = ConnectionManager::getDataSource($connection);
$string = $db->value($string, 'string');
$start = 1;
Expand All @@ -375,11 +409,11 @@ private function __escape($string, $connection = 'default')
/**
* Makes an array SQL-safe.
*
* @param string|array $data Data to sanitize.
* @param string $options DB connection being used.
* @param mixed $data Data to sanitize.
* @param string $connection DB connection being used.
* @return mixed Sanitized data.
*/
private function __clean($data, $connection = 'default')
private function __clean($data, string $connection = 'default')
{
if (empty($data)) {
return $data;
Expand All @@ -397,9 +431,9 @@ private function __clean($data, $connection = 'default')
* Sets filter values.
*
* @param Model $Model Current model.
* @param array $values Filter values.
* @param array<mixed> $values Filter values.
*/
public function setFilterValues(&$Model, $values = array())
public function setFilterValues(Model &$Model, array $values = array()): void
{
$values = $this->__clean($values, $Model->useDbConfig);
$this->_filterValues[$Model->alias] = array_merge($this->_filterValues[$Model->alias], (array)$values);
Expand All @@ -408,10 +442,9 @@ public function setFilterValues(&$Model, $values = array())
/**
* Gets filter values.
*
* @param Model $Model Current model.
* @return array
* @return array<mixed>
*/
public function getFilterValues($Model)
public function getFilterValues(): array
{
return $this->_filterValues;
}
Expand Down
2 changes: 1 addition & 1 deletion Test/Case/AllTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

class AllFilterTests extends CakeTestSuite
{
public static function suite()
public static function suite(): CakeTestSuite
{
$suite = new CakeTestSuite('All FilterPlugin tests');

Expand Down
Loading

0 comments on commit 36d32a9

Please sign in to comment.