Skip to content

Commit 4f0286b

Browse files
dev
1 parent 30b1c40 commit 4f0286b

File tree

10 files changed

+119
-40
lines changed

10 files changed

+119
-40
lines changed

src/filters/FilterField.php

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,22 @@ class FilterField extends Field
5959
*/
6060
public $modes = [];
6161

62+
/**
63+
* Вызывается перед применением определенного мода
64+
* @var callable|null
65+
*/
66+
public $beforeModeApplyCallback = null;
67+
68+
/**
69+
* @var bool Добавлять название таблицы к атрибуту?
70+
*/
71+
public $isAddAttributeTableName = true;
72+
6273
public function getBaseModes()
6374
{
6475
return [
6576
FilterModeEmpty::class,
6677
FilterModeNotEmpty::class,
67-
68-
/*FilterModeEq::class,
69-
FilterModeNe::class,
70-
FilterModeGt::class,
71-
FilterModeLt::class,
72-
FilterModeGte::class,
73-
FilterModeLte::class,
74-
FilterModeLike::class,*/
7578
];
7679
}
7780
/**
@@ -102,6 +105,7 @@ public function init()
102105

103106
$this->on('apply', [$this, '_applyEvent']);
104107
}
108+
105109
public function _applyEvent(QueryFiltersEvent $queryFiltersEvent)
106110
{
107111
$value = $queryFiltersEvent->field->value;
@@ -132,22 +136,24 @@ public function _applyEvent(QueryFiltersEvent $queryFiltersEvent)
132136
$fullFilterAttribute = $this->filterAttribute;
133137

134138
$query = $queryFiltersEvent->query;
135-
if (!strpos($this->filterAttribute, ".") && $query->modelClass && !$query->from) {
136-
$modelClass = $query->modelClass;
137-
$tableName = $modelClass::tableName();
138-
$fullFilterAttribute = "{$tableName}.{$fullFilterAttribute}";
139-
139+
140+
if ($this->isAddAttributeTableName) {
141+
if (!strpos($this->filterAttribute, ".") && $query->modelClass && !$query->from) {
142+
$modelClass = $query->modelClass;
143+
$tableName = $modelClass::tableName();
144+
$fullFilterAttribute = "{$tableName}.{$fullFilterAttribute}";
145+
}
140146
}
141-
/*if ($queryFiltersEvent->widget && $queryFiltersEvent->widget->asModelTable && !strpos(".", $fullFilterAttribute)) {
142-
$fullFilterAttribute = $queryFiltersEvent->widget->asModelTable . "." . $fullFilterAttribute;
143-
}*/
144-
/*
145-
$modelClassName = $queryFiltersEvent->widget->modelClassName;
146-
$tableName = $modelClassName::tableName();
147-
$fullFilterAttribute = $tableName . "." . $this->filterAttribute;*/
147+
148148

149149
$filterMode->attributeName = $fullFilterAttribute;
150150

151+
if ($this->beforeModeApplyCallback && is_callable($this->beforeModeApplyCallback)) {
152+
$userCallback = call_user_func($this->beforeModeApplyCallback, $queryFiltersEvent, $this);
153+
if (!$userCallback) {
154+
return true;
155+
}
156+
}
151157
$filterMode->applyQuery($queryFiltersEvent->query);
152158
}
153159
/**

src/filters/NumberFilterField.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,36 @@
2020
use skeeks\cms\queryfilters\filters\modes\FilterModeRange;
2121

2222
/**
23+
*
24+
*
25+
* 'marginality_per_filter' => [
26+
'label' => 'Маржинальность, %',
27+
'class' => NumberFilterField::class,
28+
'field' => [
29+
'class' => NumberField::class
30+
],
31+
'isAddAttributeTableName' => false,
32+
'beforeModeApplyCallback' => function(QueryFiltersEvent $e, NumberFilterField $field) {
33+
/**
34+
* @var $query ActiveQuery
35+
$query = $e->dataProvider->query;
36+
37+
if (ArrayHelper::getValue($e->field->value, "value.0") || ArrayHelper::getValue($e->field->value, "value.1")) {
38+
39+
$field->setIsHaving();
40+
41+
$query->addSelect([
42+
'marginality_per_filter' => new Expression("(selling_price - purchase_price) / selling_price * 100"),
43+
]);
44+
$query->groupBy([ShopStoreProduct::tableName().'.id']);
45+
}
46+
47+
48+
return true;
49+
},
50+
],
51+
52+
2353
* @author Semenov Alexander <[email protected]>
2454
*/
2555
class NumberFilterField extends FilterField
@@ -29,6 +59,7 @@ class NumberFilterField extends FilterField
2959
public $modes = [
3060
FilterModeEmpty::class,
3161
FilterModeNotEmpty::class,
62+
3263
FilterModeEq::class,
3364
FilterModeNe::class,
3465
FilterModeGt::class,
@@ -37,4 +68,17 @@ class NumberFilterField extends FilterField
3768
FilterModeLte::class,
3869
FilterModeRange::class,
3970
];
71+
72+
/**
73+
* @param bool $value
74+
*/
75+
public function setIsHaving($value = true)
76+
{
77+
foreach ($this->modes as $mode)
78+
{
79+
if (isset($mode->isHaving)) {
80+
$mode->isHaving = $value;
81+
}
82+
}
83+
}
4084
}

src/filters/modes/FilterModeEq.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use yii\base\Component;
1616
use yii\db\ActiveQuery;
1717

18-
class FilterModeEq extends FilterMode
18+
class FilterModeEq extends NumberFilterMode
1919
{
2020
const ID = 'eq';
2121

@@ -42,7 +42,7 @@ public function applyQuery(ActiveQuery $activeQuery)
4242
return;
4343
}
4444

45-
$activeQuery->andWhere([$this->attributeName => $this->value]);
45+
$activeQuery->{$this->getAndWhereQuery()}([$this->attributeName => $this->value]);
4646
}
4747

4848

src/filters/modes/FilterModeGt.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use yii\base\Component;
1616
use yii\db\ActiveQuery;
1717

18-
class FilterModeGt extends FilterMode
18+
class FilterModeGt extends NumberFilterMode
1919
{
2020
const ID = 'gt';
2121

@@ -45,7 +45,7 @@ public function applyQuery(ActiveQuery $activeQuery)
4545
return;
4646
}
4747

48-
$activeQuery->andWhere([">", $this->attributeName, $this->value]);
48+
$activeQuery->{$this->getAndWhereQuery()}([">", $this->attributeName, $this->value]);
4949
}
5050

5151

src/filters/modes/FilterModeGte.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use yii\base\Component;
1616
use yii\db\ActiveQuery;
1717

18-
class FilterModeGte extends FilterMode
18+
class FilterModeGte extends NumberFilterMode
1919
{
2020
const ID = 'gte';
2121

@@ -45,7 +45,7 @@ public function applyQuery(ActiveQuery $activeQuery)
4545
return;
4646
}
4747

48-
$activeQuery->andWhere([">=", $this->attributeName, $this->value]);
48+
$activeQuery->{$this->getAndWhereQuery()}([">=", $this->attributeName, $this->value]);
4949
}
5050

5151

src/filters/modes/FilterModeLt.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use yii\base\Component;
1616
use yii\db\ActiveQuery;
1717

18-
class FilterModeLt extends FilterMode
18+
class FilterModeLt extends NumberFilterMode
1919
{
2020
const ID = 'lt';
2121

@@ -45,7 +45,7 @@ public function applyQuery(ActiveQuery $activeQuery)
4545
return;
4646
}
4747

48-
$activeQuery->andWhere(["<", $this->attributeName, $this->value]);
48+
$activeQuery->{$this->getAndWhereQuery()}(["<", $this->attributeName, $this->value]);
4949
}
5050

5151

src/filters/modes/FilterModeLte.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use yii\base\Component;
1616
use yii\db\ActiveQuery;
1717

18-
class FilterModeLte extends FilterMode
18+
class FilterModeLte extends NumberFilterMode
1919
{
2020
const ID = 'lte';
2121

@@ -45,7 +45,7 @@ public function applyQuery(ActiveQuery $activeQuery)
4545
return;
4646
}
4747

48-
$activeQuery->andWhere(["<=", $this->attributeName, $this->value]);
48+
$activeQuery->{$this->getAndWhereQuery()}(["<=", $this->attributeName, $this->value]);
4949
}
5050

5151

src/filters/modes/FilterModeNe.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,10 @@
88

99
namespace skeeks\cms\queryfilters\filters\modes;
1010

11-
use skeeks\cms\IHasImage;
12-
use skeeks\cms\IHasName;
1311
use skeeks\cms\queryfilters\filters\FilterField;
14-
use skeeks\cms\traits\THasName;
15-
use yii\base\Component;
1612
use yii\db\ActiveQuery;
1713

18-
class FilterModeNe extends FilterMode
14+
class FilterModeNe extends NumberFilterMode
1915
{
2016
const ID = 'ne';
2117

@@ -41,8 +37,8 @@ public function applyQuery(ActiveQuery $activeQuery)
4137
if (is_string($this->value) && $this->value == '') {
4238
return;
4339
}
44-
45-
$activeQuery->andWhere(["!=", $this->attributeName, $this->value]);
40+
41+
$activeQuery->{$this->getAndWhereQuery()}(["!=", $this->attributeName, $this->value]);
4642
}
4743

4844

src/filters/modes/FilterModeRange.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use skeeks\cms\queryfilters\filters\FilterField;
1212
use yii\db\ActiveQuery;
1313

14-
class FilterModeRange extends FilterMode
14+
class FilterModeRange extends NumberFilterMode
1515
{
1616
const ID = 'range';
1717

@@ -39,10 +39,10 @@ public function init()
3939
public function applyQuery(ActiveQuery $activeQuery)
4040
{
4141
if ($this->value) {
42-
$activeQuery->andWhere([">=", $this->attributeName, $this->value]);
42+
$activeQuery->{$this->getAndWhereQuery()}([">=", $this->attributeName, $this->value]);
4343
}
4444
if ($this->value2) {
45-
$activeQuery->andWhere(["<=", $this->attributeName, $this->value2]);
45+
$activeQuery->{$this->getAndWhereQuery()}(["<=", $this->attributeName, $this->value2]);
4646
}
4747
}
4848

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
/**
3+
* @link https://cms.skeeks.com/
4+
* @copyright Copyright (c) 2010 SkeekS
5+
* @license https://cms.skeeks.com/license/
6+
* @author Semenov Alexander <[email protected]>
7+
*/
8+
9+
namespace skeeks\cms\queryfilters\filters\modes;
10+
11+
use skeeks\cms\IHasImage;
12+
use skeeks\cms\IHasName;
13+
use skeeks\cms\queryfilters\filters\FilterField;
14+
use skeeks\cms\traits\THasName;
15+
use yii\base\Component;
16+
use yii\db\ActiveQuery;
17+
18+
abstract class NumberFilterMode extends FilterMode
19+
{
20+
21+
/**
22+
* @var bool
23+
*/
24+
public $isHaving = false;
25+
26+
/**
27+
* @return string
28+
*/
29+
public function getAndWhereQuery()
30+
{
31+
return $this->isHaving ? "andHaving" : "andWhere";
32+
}
33+
}

0 commit comments

Comments
 (0)