Passed
Push — master ( 7a8d95...2ebdf0 )
by Jean-Christophe
02:02
created

FieldAsTrait::fieldAsHeader()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 7
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 1
nop 4
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
1
<?php
2
namespace Ajax\semantic\widgets\base;
3
use Ajax\service\JString;
4
use Ajax\semantic\html\elements\HtmlImage;
5
use Ajax\semantic\html\base\constants\Size;
6
use Ajax\semantic\html\elements\HtmlLabel;
7
use Ajax\semantic\html\modules\HtmlProgress;
8
use Ajax\semantic\html\modules\HtmlRating;
9
use Ajax\semantic\html\elements\HtmlHeader;
10
use Ajax\semantic\html\collections\form\HtmlFormCheckbox;
11
use Ajax\semantic\html\collections\form\HtmlFormInput;
12
use Ajax\semantic\html\collections\form\HtmlFormDropdown;
13
use Ajax\semantic\html\collections\form\HtmlFormTextarea;
14
use Ajax\semantic\html\collections\form\HtmlFormFields;
15
use Ajax\semantic\html\collections\HtmlMessage;
16
use Ajax\semantic\html\elements\HtmlButton;
17
use Ajax\service\JArray;
18
use Ajax\semantic\html\elements\html5\HtmlLink;
19
use Ajax\semantic\html\elements\HtmlFlag;
20
use Ajax\common\html\BaseHtml;
21
use Ajax\semantic\html\collections\form\HtmlFormField;
22
use Ajax\semantic\html\collections\form\HtmlFormRadio;
23
use Ajax\semantic\html\base\HtmlSemDoubleElement;
24
use Ajax\semantic\html\elements\HtmlIcon;
25
use Ajax\semantic\html\elements\HtmlList;
26
27
/**
28
 * trait used in Widget
29
 * @author jc
30
 * @property InstanceViewer $_instanceViewer
31
 * @property boolean $_edition
32
 * @property mixed _modelInstance
33
 */
34
trait FieldAsTrait{
35
36
	abstract protected function _getFieldIdentifier($prefix,$name="");
37
	abstract public function setValueFunction($index,$callback);
38
	abstract protected function _getFieldName($index);
39
	abstract protected function _getFieldCaption($index);
40
	abstract protected function _buttonAsSubmit(BaseHtml &$button,$event,$url,$responseElement=NULL,$parameters=NULL);
41
42
	/**
43
	 * @param HtmlFormField $element
44
	 * @param array $attributes
45
	 */
46
	protected function _applyAttributes(BaseHtml $element,&$attributes,$index,$instance=null){
47
		if(isset($attributes["jsCallback"])){
48
			$callback=$attributes["jsCallback"];
49
			if(\is_callable($callback)){
50
				$callback($element,$instance,$index,InstanceViewer::$index);
51
			}
52
		}
53
		unset($attributes["rules"]);
54
		unset($attributes["ajax"]);
55
		unset($attributes["visibleHover"]);
56
		$element->fromArray($attributes);
57
	}
58
59
	private function _getLabelField($caption,$icon=NULL){
60
		$label=new HtmlLabel($this->_getFieldIdentifier("lbl"),$caption,$icon);
61
		return $label;
62
	}
63
64
65
	protected function _addRules(HtmlFormField $element,&$attributes){
66
		if(isset($attributes["rules"])){
67
			$rules=$attributes["rules"];
68
			if(\is_array($rules)){
69
				$element->addRules($rules);
70
			}
71
			else{
72
				$element->addRule($rules);
73
			}
74
			unset($attributes["rules"]);
75
		}
76
	}
77
78
	protected function _prepareFormFields(HtmlFormField &$field,$name,&$attributes){
79
		$field->setName($name);
80
		$this->_addRules($field, $attributes);
81
		return $field;
82
	}
83
84
	protected function _fieldAs($elementCallback,&$index,$attributes=NULL,$prefix=null){
85
		$this->setValueFunction($index,function($value,$instance,$index,$rowIndex) use (&$attributes,$elementCallback,$prefix){
86
			$caption=$this->_getFieldCaption($index);
87
			$name=$this->_getFieldName($index);
88
			$id=$this->_getFieldIdentifier($prefix,$name);
89
			if(isset($attributes["name"])){
90
				$name=$attributes["name"];
91
				unset($attributes["name"]);
92
			}
93
			$element=$elementCallback($id,$name,$value,$caption);
94
			if(\is_array($attributes)){
95
				$this->_applyAttributes($element, $attributes,$index,$instance);
96
			}
97
			$element->setDisabled(!$this->_edition);
98
			return $element;
99
		});
100
			return $this;
101
	}
102
103
104
	public function fieldAsProgress($index,$label=NULL, $attributes=array()){
105
		$this->setValueFunction($index,function($value) use($label,$attributes){
106
			$pb=new HtmlProgress($this->_getFieldIdentifier("pb"),$value,$label,$attributes);
107
			return $pb;
108
		});
109
			return $this;
110
	}
111
112
	public function fieldAsRating($index,$max=5, $icon=""){
113
		$this->setValueFunction($index,function($value) use($max,$icon){
114
			$rating=new HtmlRating($this->_getFieldIdentifier("rat"),$value,$max,$icon);
115
			return $rating;
116
		});
117
			return $this;
118
	}
119
120
	public function fieldAsLabel($index,$icon=NULL,$attributes=NULL){
121
		return $this->_fieldAs(function($id,$name,$value) use($icon){
122
			$lbl=new HtmlLabel($id,$value);
123
			if(isset($icon))
124
				$lbl->addIcon($icon);
125
				return $lbl;
126
		}, $index,$attributes,"label");
127
	}
128
129
	public function fieldAsHeader($index,$niveau=1,$icon=NULL,$attributes=NULL){
130
		return $this->_fieldAs(function($id,$name,$value) use($niveau,$icon){
131
			$header=new HtmlHeader($id,$niveau,$value);
132
			if(isset($icon))
133
				$header->asIcon($icon, $value);
134
			return $header;
135
		}, $index,$attributes,"header");
136
	}
137
138
139
	public function fieldAsImage($index,$size=Size::MINI,$circular=false){
140
		$this->setValueFunction($index,function($img) use($size,$circular){
141
			$image=new HtmlImage($this->_getFieldIdentifier("image"),$img);$image->setSize($size);if($circular)$image->setCircular();
142
			return $image;
143
		});
144
			return $this;
145
	}
146
147
	public function fieldAsFlag($index){
148
		$this->setValueFunction($index,function($flag){
149
			$flag=new HtmlFlag($this->_getFieldIdentifier("flag"),$flag);
150
			return $flag;
151
		});
152
			return $this;
153
	}
154
155
	public function fieldAsIcon($index){
156
		$this->setValueFunction($index,function($icon){
157
			$icon=new HtmlIcon($this->_getFieldIdentifier("icon"),$icon);
158
			return $icon;
159
		});
160
			return $this;
161
	}
162
163
	public function fieldAsAvatar($index,$attributes=NULL){
164
		return $this->_fieldAs(function($id,$name,$value){
165
			$img=new HtmlImage($id,$value);
166
			$img->asAvatar();
167
			return $img;
168
		}, $index,$attributes,"avatar");
169
	}
170
171
	public function fieldAsRadio($index,$attributes=NULL){
172
		return $this->_fieldAs(function($id,$name,$value) use($attributes){
173
			$input= new HtmlFormRadio($id,$name,$value,$value);
174
			return $this->_prepareFormFields($input, $name, $attributes);
175
		}, $index,$attributes,"radio");
176
	}
177
178
	public function fieldAsRadios($index,$elements=[],$attributes=NULL){
179
		return $this->_fieldAs(function($id,$name,$value,$caption) use ($elements){
180
			return HtmlFormFields::radios($name,$elements,$caption,$value);
181
		}, $index,$attributes,"radios");
182
	}
183
	
184
	public function fieldAsList($index,$classNames="",$attributes=NULL){
185
		return $this->_fieldAs(function($id,$name,$value,$caption) use($classNames){
186
			$result= new HtmlList($name,$value);
187
			$result->addClass($classNames);
188
			return $result;
189
		}, $index,$attributes,"list");
190
	}
191
192
	public function fieldAsInput($index,$attributes=NULL){
193
		return $this->_fieldAs(function($id,$name,$value,$caption) use ($attributes){
194
			$input= new HtmlFormInput($id,$caption,"text",$value);
195
			return $this->_prepareFormFields($input, $name, $attributes);
196
		}, $index,$attributes,"input");
197
	}
198
199
	public function fieldAsTextarea($index,$attributes=NULL){
200
		return $this->_fieldAs(function($id,$name,$value,$caption) use ($attributes){
201
			$textarea=new HtmlFormTextarea($id,$caption,$value);
202
			return $this->_prepareFormFields($textarea, $name, $attributes);
203
		}, $index,$attributes,"textarea");
204
	}
205
206
	public function fieldAsElement($index,$tagName="div",$baseClass="",$attributes=NULL){
207
		return $this->_fieldAs(function($id,$name,$value,$caption) use ($attributes,$tagName,$baseClass){
208
			$div=new HtmlSemDoubleElement($id,$tagName,$baseClass);
209
			$div->setContent(\htmlentities($value));
210
			$textarea=new HtmlFormField("field-".$id, $div,$caption);
211
			return $this->_prepareFormFields($textarea, $name, $attributes);
212
		}, $index,$attributes,"element");
213
	}
214
215
216
	public function fieldAsHidden($index,$attributes=NULL){
217
		if(!\is_array($attributes)){
218
			$attributes=[];
219
		}
220
		$attributes["inputType"]="hidden";
221
		$attributes["style"]="display:none;";
222
		return $this->fieldAsInput($index,$attributes);
223
	}
224
225
	public function fieldAsCheckbox($index,$attributes=NULL){
226
		return $this->_fieldAs(function($id,$name,$value,$caption) use($attributes){
227
			if($caption===null || $caption==="")
228
				$caption="";
229
			$input=new HtmlFormCheckbox($id,$caption,$this->_instanceViewer->getIdentifier());
230
			$input->setChecked(JString::isBooleanTrue($value));
231
			return $this->_prepareFormFields($input, $name, $attributes);
232
		}, $index,$attributes,"ck");
233
	}
234
235
	public function fieldAsDropDown($index,$elements=[],$multiple=false,$attributes=NULL){
236
		return $this->_fieldAs(function($id,$name,$value,$caption) use($elements,$multiple,$attributes){
237
			$dd=new HtmlFormDropdown($id,$elements,$caption,$value);
238
			$dd->asSelect($name,$multiple);
239
			return $this->_prepareFormFields($dd, $name, $attributes);
240
		}, $index,$attributes,"dd");
241
	}
242
243
	public function fieldAsMessage($index,$attributes=NULL){
244
		return $this->_fieldAs(function($id,$name,$value,$caption){
245
			$mess= new HtmlMessage("message-".$id,$caption);
246
			$mess->addHeader($value);
247
			return $mess;
248
		}, $index,$attributes,"message");
249
	}
250
251
	public function fieldAsLink($index,$attributes=NULL){
252
		return $this->_fieldAs(function($id,$name,$value,$caption){
253
			$lnk= new HtmlLink("message-".$id,"#",$caption);
254
			return $lnk;
255
		}, $index,$attributes,"link");
256
	}
257
258
	/**Change fields type
259
	 * @param array $types an array or associative array $type=>$attributes
260
	 */
261
	public function fieldsAs(array $types){
262
		$i=0;
263
		if(JArray::isAssociative($types)){
264
			foreach ($types as $type=>$attributes){
265
				if(\is_int($type))
266
					$this->fieldAs($i++,$attributes,[]);
267
				else{
268
					$type=preg_replace('/\d/', '', $type );
269
					$this->fieldAs($i++,$type,$attributes);
270
				}
271
			}
272
		}else{
273
			foreach ($types as $type){
274
				$this->fieldAs($i++,$type);
275
			}
276
		}
277
	}
278
279
	public function fieldAs($index,$type,$attributes=NULL){
280
		$method="fieldAs".\ucfirst($type);
281
		if(\method_exists($this, $method)){
282
			if(!\is_array($attributes)){
283
				$attributes=[$index];
284
			}else{
285
				\array_unshift($attributes, $index);
286
			}
287
			\call_user_func_array([$this,$method], $attributes);
288
		}
289
	}
290
291
	public function fieldAsSubmit($index,$cssStyle=NULL,$url=NULL,$responseElement=NULL,$attributes=NULL){
292
		return $this->_fieldAs(function($id,$name,$value,$caption) use ($url,$responseElement,$cssStyle,$attributes){
293
			$button=new HtmlButton($id,$caption,$cssStyle);
294
			$this->_buttonAsSubmit($button,"click",$url,$responseElement,@$attributes["ajax"]);
295
			return $button;
296
		}, $index,$attributes,"submit");
297
	}
298
299
	public function fieldAsButton($index,$cssStyle=NULL,$attributes=NULL){
300
		return $this->_fieldAs(function($id,$name,$value,$caption) use ($cssStyle){
301
			$button=new HtmlButton($id,$value,$cssStyle);
302
			return $button;
303
		}, $index,$attributes,"button");
304
	}
305
}
306