-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathWFormRelationHasMany.php
118 lines (92 loc) · 3.08 KB
/
WFormRelationHasMany.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
/**
* @author Weavora Team <[email protected]>
* @link http://weavora.com
* @copyright Copyright (c) 2011 Weavora LLC
*/
class WFormRelationHasMany extends WFormRelation {
public $type = CActiveRecord::HAS_MANY;
public function setAttributes($bunchOfAttributes) {
parent::setAttributes($bunchOfAttributes);
$relationClass = $this->info[WFormRelation::RELATION_CLASS];
$relationPk = $relationClass::model()->getMetaData()->tableSchema->primaryKey;
$modelsDictionary = array();
foreach ($this->getRelatedModels() as $relationModel) {
if ($relationModel->primaryKey) {
$modelsDictionary[$relationModel->primaryKey] = $relationModel;
}
}
$relationModels = array();
foreach ($bunchOfAttributes as $key => &$attributes) {
if (!is_array($attributes) && is_numeric($attributes)) {
$attributes = array($relationPk => $attributes);
}
if (isset($attributes[$relationPk])) {
if (isset($modelsDictionary[$attributes[$relationPk]])) {
$relationModel = $modelsDictionary[$attributes[$relationPk]];
} else {
$relationModel = $relationClass::model()->findByPk($attributes[$relationPk]) ?: new $relationClass();
}
} else {
$relationModel = new $relationClass();
}
$relationModel->attributes = $attributes;
$relationModels[$key] = $relationModel;
}
$this->model->{$this->name} = $relationModels;
}
public function validate() {
$isValid = true;
$relatedModels = $this->getRelatedModels();
if (count($relatedModels) == 0 && $this->required)
return false;
foreach ($relatedModels as $key => $relationModel) {
if (!$relationModel->validate()) {
if ($this->unsetInvalid) {
unset($relatedModels[$key]);
$this->model->{$this->name} = $relatedModels;
} else {
$isValid = false;
}
}
}
return $isValid;
}
public function save() {
$foreignKey = $this->info[WFormRelation::RELATION_FOREIGN_KEY];
if ($this->mode == self::MODE_REPLACE) {
foreach($this->getActualRelatedModels() as $model)
$this->addToLazyDelete($model);
}
$relatedModels = $this->getRelatedModels();
if (count($relatedModels) == 0 && $this->required)
return false;
$isSuccess = true;
foreach ($relatedModels as $index => $relationModel) {
$this->removeFromLazyDelete($relationModel);
$relationModel->$foreignKey = $this->model->primaryKey;
$isSuccess = $relationModel->save() && $isSuccess;
}
return $isSuccess;
}
public function getRelatedModels() {
if (!$this->model->{$this->name} || (!$this->isAttributesPerformed() && $this->isPreloaded())) {
$this->model->{$this->name} = array();
}
return (array) $this->model->{$this->name};
}
public function getActualRelatedModels() {
if ($this->model->isNewRecord)
return array();
$modelClone = clone $this->model;
return (array) $modelClone->getRelated($this->name, true);
}
public function delete() {
if (!$this->cascadeDelete)
return true;
$isSuccess = true;
foreach($this->getActualRelatedModels() as $model)
$isSuccess = $model->delete() && $isSuccess;
return $isSuccess;
}
}