Passed
Push — master ( e1ca0a...c1379c )
by Jean-Christophe
04:54
created

CRUDHelper::getFKIntances()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 10
ccs 8
cts 8
cp 1
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 3
crap 3
1
<?php
2
3
namespace Ubiquity\controllers\crud;
4
5
use Ubiquity\orm\OrmUtils;
6
use Ubiquity\utils\http\URequest;
7
use Ubiquity\orm\DAO;
8
use Ubiquity\orm\parser\Reflexion;
9
use Ubiquity\cache\database\DbCache;
10
use Ubiquity\db\SqlUtils;
11
use Ubiquity\utils\base\UString;
12
13
class CRUDHelper {
14 5
	public static function getIdentifierFunction($model) {
15 5
		$pks = self::getPks ( $model );
16
		return function ($index, $instance) use ($pks) {
17 5
			$values = [ ];
18 5
			foreach ( $pks as $pk ) {
19 5
				$getter = "get" . ucfirst ( $pk );
20 5
				if (method_exists ( $instance, $getter )) {
21 5
					$values [] = $instance->{$getter} ();
22
				}
23
			}
24 5
			return implode ( "_", $values );
25 5
		};
26
	}
27
	
28 1
	public static function search($model,$search,$fields,$initialCondition="1=1"){
29 1
		$words=preg_split("@(\s*?(\(|\)|\|\||\&\&)\s*?)@", $search);
30 1
		if($words!==false){
31 1
			$words=array_filter($words,'strlen');
32 1
			$condition=$search;
33 1
			foreach ($words as $word){
34 1
				$word=trim($word);
35 1
				$condition=UString::replaceFirstOccurrence($word, "(".SqlUtils::getSearchWhere($fields,$word).")", $condition);
36
			}
37
			
38 1
			$condition=str_replace("||", " OR ", $condition);
39 1
			$condition=str_replace("&&", " AND ", $condition);
40 1
			$condition='('.$condition.') AND '.$initialCondition.'';
41
		}else{
42
			$condition=$initialCondition;
43
		}
44 1
		return DAO::getAll($model,$condition);
45
	}
46
	
47 3
	public static function update($instance,$values) {
48 3
		$className=\get_class($instance);
49 3
		$fieldsInRelationForUpdate=OrmUtils::getFieldsInRelationsForUpdate_($className);
50 3
		$manyToOneRelations=$fieldsInRelationForUpdate["manyToOne"];
51 3
		$manyToManyRelations=$fieldsInRelationForUpdate["manyToMany"];
52
		
53 3
		$members=array_keys($values);
54 3
		OrmUtils::setFieldToMemberNames($members, $fieldsInRelationForUpdate["relations"]);
55 3
		$update=false;
56
		
57 3
		$fieldTypes=OrmUtils::getFieldTypes($className);
58 3
		foreach ( $fieldTypes as $property => $type ) {
59 3
			if ($type == "tinyint(1)") {
60
				if (isset($values[$property])) {
61
					$values[$property]=1;
62
				} else {
63
					$values[$property]=0;
64
				}
65
			}
66
		}
67 3
		URequest::setValuesToObject($instance, $values);
68 3
		if($manyToOneRelations){
69
			self::updateManyToOne($manyToOneRelations, $members, $className, $instance, $values);
70
		}
71 3
		if (isset($instance)) {
72 3
			if ($instance->_new) {
73 1
				$update=DAO::insert($instance);
74
			} else {
75 2
				$update=DAO::update($instance);
76 2
				if (DbCache::$active) {
77
					// TODO update dbCache
78
				}
79
			}
80 3
			if ($update && $manyToManyRelations) {
81
				self::updateManyToMany($manyToManyRelations, $members, $className, $instance, $values);
82
			}
83
		}
84 3
		return $update;
85
	}
86
	
87
	protected static function updateManyToOne($manyToOneRelations,$members,$className,$instance,$values){
88
		foreach ( $manyToOneRelations as $member ) {
89
			if (array_search($member, $members)!==false) {
90
				$joinColumn=OrmUtils::getAnnotationInfoMember($className, "#joinColumn", $member);
91
				if ($joinColumn) {
92
					$fkClass=$joinColumn["className"];
93
					$fkField=$joinColumn["name"];
94
					if (isset($values[$fkField])) {
95
						$fkObject=DAO::getOne($fkClass, $values["$fkField"]);
96
						Reflexion::setMemberValue($instance, $member, $fkObject);
97
					}
98
				}
99
			}
100
		}
101
	}
102
	
103
	protected static function updateManyToMany($manyToManyRelations,$members,$className,$instance,$values){
104
		foreach ( $manyToManyRelations as $member ) {
105
			if(array_search($member, $members)!==false){
106
				if (($annot=OrmUtils::getAnnotationInfoMember($className, "#manyToMany", $member)) !== false) {
107
					$newField=$member . "Ids";
108
					$fkClass=$annot["targetEntity"];
109
					$fkObjects=DAO::getAll($fkClass, self::getMultiWhere($values[$newField], $className));
110
					if (Reflexion::setMemberValue($instance, $member, $fkObjects)) {
111
						DAO::insertOrUpdateManyToMany($instance, $member);
112
					}
113
				}
114
			}
115
		}
116
	}
117
	
118 5
	private static function getPks($model) {
119 5
		$instance=new $model();
120 5
		return OrmUtils::getKeyFields($instance);
121
	}
122
	
123
	private static function getMultiWhere($ids, $class) {
124
		$pk=OrmUtils::getFirstKey($class);
125
		$ids=explode(",", $ids);
126
		if (sizeof($ids) < 1)
127
			return "";
128
		$strs=[ ];
129
		$idCount=\sizeof($ids);
130
		for($i=0; $i < $idCount; $i++) {
131
			$strs[]=$pk . "='" . $ids[$i] . "'";
132
		}
133
		return implode(" OR ", $strs);
134
	}
135
	
136 2
	public static function getFkIntance($instance,$model,$member,$included=false){
137 2
		$result=[];
138 2
		if (($annot=OrmUtils::getAnnotationInfoMember($model, "#oneToMany", $member)) !== false) {
139 2
			$objectFK=DAO::getOneToMany($instance, $member,$included);
140 2
			$fkClass=$annot["className"];
141
		} elseif (($annot=OrmUtils::getAnnotationInfoMember($model, "#manyToMany", $member)) !== false) {
142
			$objectFK=DAO::getManyToMany($instance, $member);
143
			$fkClass=$annot["targetEntity"];
144
		} else {
145
			$objectFK=Reflexion::getMemberValue($instance, $member);
146
			if(!is_object($objectFK)){
147
				$objectFK=DAO::getManyToOne($instance, $member,$included);
148
			}
149
			if (isset($objectFK))
150
				$fkClass=\get_class($objectFK);
151
		}
152 2
		if(isset($fkClass)){
153 2
			$fkTable=OrmUtils::getTableName($fkClass);
154 2
			$result[$member]=compact("objectFK","fkClass","fkTable");
155
		}
156 2
		return $result;
157
	}
158
	
159 2
	public static function getFKIntances($instance,$model,$included=false){
160 2
		$result=[];
161 2
		$relations=OrmUtils::getFieldsInRelations($model);
162 2
		foreach ( $relations as $member ) {
163 2
			$fkInstance=self::getFkIntance($instance, $model, $member,$included);
164 2
			if(sizeof($fkInstance)>0){
165 2
				$result=array_merge($result,$fkInstance);
166
			}
167
		}
168 2
		return $result;
169
	}
170
}
171
172