1
|
|
|
<?php
|
2
|
|
|
/**
|
3
|
|
|
* @author Nikita Melnikov <[email protected]>
|
4
|
|
|
* @link https://github.com/shogodev/argilla/
|
5
|
|
|
* @copyright Copyright © 2003-2014 Shogo
|
6
|
|
|
* @license http://argilla.ru/LICENSE
|
7
|
|
|
* @package frontend.models
|
8
|
|
|
*
|
9
|
|
|
* @property string $src
|
10
|
|
|
* @property string $src_frontend
|
11
|
|
|
* @property int $src_id
|
12
|
|
|
* @property string $dst
|
13
|
|
|
* @property string $dst_frontend
|
14
|
|
|
* @property int $dst_id
|
15
|
|
|
*
|
16
|
|
|
* @method static Association model(string $class = __CLASS__)
|
17
|
|
|
*/
|
18
|
|
|
class Association extends FActiveRecord
|
19
|
|
|
{
|
20
|
|
|
private $modelName;
|
21
|
|
|
|
22
|
5 |
|
public function getKeys()
|
23
|
|
|
{
|
24
|
5 |
|
return CHtml::listData($this->getData(), 'pk', 'pk');
|
25
|
|
|
}
|
26
|
|
|
|
27
|
|
|
/**
|
28
|
|
|
* @param CDbCriteria|null $criteria
|
29
|
|
|
* @param string|null $sorting
|
30
|
|
|
* @param bool $pagination
|
31
|
|
|
* @param string|null $filters
|
32
|
|
|
*
|
33
|
|
|
* @return BaseList
|
34
|
|
|
* @throws CHttpException
|
35
|
|
|
*/
|
36
|
1 |
View Code Duplication |
public function getList(CDbCriteria $criteria = null, $sorting = null, $pagination = false, $filters = null)
|
|
|
|
|
37
|
|
|
{
|
38
|
1 |
|
$className = $this->modelName.'List';
|
39
|
1 |
|
if( !class_exists($className) )
|
40
|
1 |
|
throw new CHttpException(500, 'Не удалось найти класс '.$className);
|
41
|
|
|
|
42
|
1 |
|
$criteria = $this->getAssociationCriteria($criteria);
|
43
|
|
|
|
44
|
1 |
|
return Yii::createComponent($className, $criteria, $sorting, $pagination, $filters);
|
45
|
|
|
}
|
46
|
|
|
|
47
|
|
|
/**
|
48
|
|
|
* @param CDbCriteria|null $criteria
|
49
|
|
|
* @return array|FActiveRecord[]
|
50
|
|
|
*/
|
51
|
1 |
View Code Duplication |
public function getModels(CDbCriteria $criteria = null)
|
|
|
|
|
52
|
|
|
{
|
53
|
1 |
|
$criteria = $this->getAssociationCriteria($criteria);
|
54
|
|
|
|
55
|
|
|
/**
|
56
|
|
|
* @var FActiveRecord $model
|
57
|
|
|
*/
|
58
|
1 |
|
$model = new $this->modelName;
|
59
|
1 |
|
return $model->findAll($criteria);
|
60
|
|
|
}
|
61
|
|
|
|
62
|
|
|
/**
|
63
|
|
|
* @param FActiveRecord $model
|
64
|
|
|
* @param string $targetModelName
|
65
|
|
|
*
|
66
|
|
|
* @return $this
|
67
|
|
|
*/
|
68
|
4 |
View Code Duplication |
public function setSource(FActiveRecord $model, $targetModelName)
|
|
|
|
|
69
|
|
|
{
|
70
|
4 |
|
$this->modelName = $targetModelName;
|
71
|
|
|
|
72
|
4 |
|
$criteria = new CDbCriteria();
|
73
|
4 |
|
$criteria->select = 'dst_id AS pk';
|
74
|
|
|
|
75
|
4 |
|
$criteria->compare('src_frontend', get_class($model));
|
76
|
4 |
|
$criteria->compare('src_id', $model->primaryKey);
|
77
|
4 |
|
$criteria->compare('dst_frontend', $this->modelName);
|
78
|
4 |
|
$this->setDbCriteria($criteria);
|
79
|
|
|
|
80
|
4 |
|
return $this;
|
81
|
|
|
}
|
82
|
|
|
|
83
|
|
|
/**
|
84
|
|
|
* @param FActiveRecord $model
|
85
|
|
|
* @param string $targetModelName
|
86
|
|
|
*
|
87
|
|
|
* @return $this
|
88
|
|
|
*/
|
89
|
1 |
View Code Duplication |
public function setDestination(FActiveRecord $model, $targetModelName)
|
|
|
|
|
90
|
|
|
{
|
91
|
1 |
|
$this->modelName = $targetModelName;
|
92
|
|
|
|
93
|
1 |
|
$criteria = new CDbCriteria();
|
94
|
1 |
|
$criteria->select = 'src_id AS pk';
|
95
|
|
|
|
96
|
1 |
|
$criteria->compare('dst_frontend', get_class($model));
|
97
|
1 |
|
$criteria->compare('dst_id', $model->primaryKey);
|
98
|
1 |
|
$criteria->compare('src_frontend', $this->modelName);
|
99
|
1 |
|
$this->setDbCriteria($criteria);
|
100
|
|
|
|
101
|
1 |
|
return $this;
|
102
|
|
|
}
|
103
|
|
|
|
104
|
5 |
|
private function getData()
|
105
|
|
|
{
|
106
|
5 |
|
$command = $this->dbConnection->schema->commandBuilder->createFindCommand($this->tableName(), $this->getDbCriteria());
|
107
|
5 |
|
return $command->queryAll();
|
108
|
|
|
}
|
109
|
|
|
|
110
|
|
|
/**
|
111
|
|
|
* @param CDbCriteria|null $criteria
|
112
|
|
|
*
|
113
|
|
|
* @return CDbCriteria
|
114
|
|
|
*/
|
115
|
2 |
View Code Duplication |
private function getAssociationCriteria(CDbCriteria $criteria = null)
|
|
|
|
|
116
|
|
|
{
|
117
|
2 |
|
if( !$criteria )
|
118
|
2 |
|
$associationCriteria = new CDbCriteria();
|
119
|
|
|
else
|
120
|
|
|
$associationCriteria = clone $criteria;
|
121
|
|
|
|
122
|
2 |
|
$associationCriteria->addInCondition('t.id', $this->getKeys());
|
123
|
|
|
|
124
|
2 |
|
return $associationCriteria;
|
125
|
|
|
}
|
126
|
|
|
} |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.