Skip to content

Commit 375a488

Browse files
committed
Extracted value preparer for base column
1 parent 7986ca9 commit 375a488

File tree

5 files changed

+223
-21
lines changed

5 files changed

+223
-21
lines changed

src/components/BaseColumn.php

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -248,27 +248,8 @@ protected function prepareValue($contextParams = [])
248248
if ($this->value instanceof \Closure) {
249249
$value = call_user_func($this->value, $data, $contextParams);
250250
} else {
251-
$value = null;
252-
if ($data instanceof ActiveRecordInterface ) {
253-
$relation = $data->getRelation($this->name, false);
254-
if ($relation !== null) {
255-
$value = $relation->findFor($this->name, $data);
256-
} elseif ($data->hasAttribute($this->name)) {
257-
$value = $data->getAttribute($this->name);
258-
} else {
259-
$value = $data->{$this->name};
260-
}
261-
} elseif ($data instanceof Model) {
262-
$value = $data->{$this->name};
263-
} elseif (is_array($data)) {
264-
$value = ArrayHelper::getValue($data, $this->name, null);
265-
} elseif(is_string($data) || is_numeric($data)) {
266-
$value = $data;
267-
}
268-
269-
if ($this->defaultValue !== null && $this->isEmpty($value)) {
270-
$value = $this->defaultValue;
271-
}
251+
$valuePreparer = new ValuePreparer($this->name, $this->defaultValue);
252+
$value = $valuePreparer->prepare($data);
272253
}
273254

274255
return $value;

src/components/ValuePreparer.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: execut
5+
* Date: 12/3/19
6+
* Time: 11:37 AM
7+
*/
8+
9+
namespace unclead\multipleinput\components;
10+
11+
12+
use yii\base\Model;
13+
use yii\db\ActiveRecordInterface;
14+
use yii\helpers\ArrayHelper;
15+
16+
class ValuePreparer
17+
{
18+
protected $model = null;
19+
protected $name = null;
20+
protected $defaultValue = null;
21+
public function __construct($name = null, $defaultValue = null)
22+
{
23+
$this->name = $name;
24+
$this->defaultValue = $defaultValue;
25+
}
26+
27+
public function prepare($data, $contextParams = [])
28+
{
29+
$value = null;
30+
if ($data instanceof ActiveRecordInterface) {
31+
$relation = $data->getRelation($this->name, false);
32+
if ($relation !== null) {
33+
$value = $relation->findFor($this->name, $data);
34+
} else if ($data->hasAttribute($this->name)) {
35+
$value = $data->getAttribute($this->name);
36+
} else {
37+
$value = $data->{$this->name};
38+
}
39+
} else if ($data instanceof Model) {
40+
$value = $data->{$this->name};
41+
} else
42+
if (is_array($data)) {
43+
$value = ArrayHelper::getValue($data, $this->name, null);
44+
} else if(is_string($data) || is_numeric($data)) {
45+
$value = $data;
46+
}
47+
//
48+
if ($this->defaultValue !== null && $this->isEmpty($value)) {
49+
$value = $this->defaultValue;
50+
}
51+
52+
return $value;
53+
}
54+
55+
protected function isEmpty($value)
56+
{
57+
return $value === null || $value === [] || $value === '';
58+
}
59+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: execut
5+
* Date: 12/3/19
6+
* Time: 11:25 AM
7+
*/
8+
9+
namespace unclead\multipleinput\tests\unit\components;
10+
use unclead\multipleinput\components\ValuePreparer;
11+
use unclead\multipleinput\tests\unit\data\TestActiveRecord;
12+
use unclead\multipleinput\tests\unit\data\TestActiveRecordRelated;
13+
use unclead\multipleinput\tests\unit\data\TestModel;
14+
use unclead\multipleinput\tests\unit\TestCase;
15+
use yii\db\ActiveQuery;
16+
17+
class ValuePreparerTest extends TestCase
18+
{
19+
public function testPrepareWithEmptyValue() {
20+
$model = new TestModel();
21+
$defaultValue = 1;
22+
$preparer = new ValuePreparer(null, $defaultValue);
23+
$this->assertEquals($defaultValue, $preparer->prepare(null));
24+
$this->assertEquals($defaultValue, $preparer->prepare([]));
25+
$this->assertEquals($defaultValue, $preparer->prepare(''));
26+
}
27+
28+
public function testPrepareStringOrNumber() {
29+
$model = new TestModel();
30+
$preparer = new ValuePreparer();
31+
$this->assertEquals(1, $preparer->prepare(1));
32+
$this->assertEquals('1', $preparer->prepare('1'));
33+
}
34+
35+
public function testPrepareArrayKey() {
36+
$model = new TestModel();
37+
$preparer = new ValuePreparer('test');
38+
$this->assertEquals(1, $preparer->prepare([
39+
'test' => 1
40+
]));
41+
}
42+
43+
public function testPrepareModelAttribute() {
44+
$model = new TestModel();
45+
$exprectedValue = [
46+
'test'
47+
];
48+
$model->email = $exprectedValue;
49+
$preparer = new ValuePreparer('email');
50+
$this->assertEquals($exprectedValue, $preparer->prepare($model));
51+
}
52+
53+
public function testPrepareActiveRecordDirectAttribute() {
54+
$model = new TestActiveRecord();
55+
$exprectedValue = 'test';
56+
$model->email = $exprectedValue;
57+
$preparer = new ValuePreparer('email');
58+
$this->assertEquals($exprectedValue, $preparer->prepare($model));
59+
}
60+
61+
public function testPrepareActiveRecordRelation() {
62+
$relatedModel = new TestActiveRecordRelated();
63+
$model = $this->createMock(TestActiveRecord::class);
64+
$query = $this->createMock(ActiveQuery::class);
65+
$query->expects($this->once())
66+
->method('findFor')
67+
->with('testRelation', $model)
68+
->willReturn($relatedModel);
69+
70+
$model->expects($this->once())
71+
->method('getRelation')
72+
->with('testRelation', false)
73+
->willReturn($query);
74+
75+
$preparer = new ValuePreparer('testRelation');
76+
77+
$result = $preparer->prepare($model);
78+
79+
$this->assertEquals($relatedModel, $result);
80+
}
81+
82+
public function testPrepareActiveRecordDatabaseAttribute() {
83+
$model = new TestActiveRecord();
84+
$exprectedValue = 'test';
85+
$model->setDatabaseAttribute($exprectedValue);
86+
87+
$preparer = new ValuePreparer('databaseAttribute');
88+
$this->assertEquals($exprectedValue, $preparer->prepare($model));
89+
}
90+
}

tests/unit/data/TestActiveRecord.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: execut
5+
* Date: 12/3/19
6+
* Time: 1:14 PM
7+
*/
8+
9+
namespace unclead\multipleinput\tests\unit\data;
10+
11+
12+
use yii\db\ActiveRecord;
13+
14+
class TestActiveRecord extends ActiveRecord
15+
{
16+
/**
17+
* @var string
18+
*/
19+
public $email;
20+
21+
public function rules()
22+
{
23+
return [
24+
['email', 'safe']
25+
];
26+
}
27+
28+
public function attributeLabels()
29+
{
30+
return [
31+
'email' => 'Email',
32+
];
33+
}
34+
35+
public function getTestHasOneRelation() {}
36+
37+
public function attributes()
38+
{
39+
return ['databaseAttribute']; // TODO: Change the autogenerated stub
40+
}
41+
42+
protected $_databaseAttribute = null;
43+
public function setDatabaseAttribute($value) {
44+
$this->_databaseAttribute = $value;
45+
}
46+
47+
public function getAttribute($name)
48+
{
49+
if ($name === 'databaseAttribute') {
50+
return $this->_databaseAttribute;
51+
}
52+
53+
return parent::getAttribute($name);
54+
}
55+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: execut
5+
* Date: 12/3/19
6+
* Time: 2:14 PM
7+
*/
8+
9+
namespace unclead\multipleinput\tests\unit\data;
10+
11+
12+
use yii\db\ActiveRecord;
13+
14+
class TestActiveRecordRelated extends ActiveRecord
15+
{
16+
17+
}

0 commit comments

Comments
 (0)