Passed
Push — master ( 75b4ea...e63bba )
by Jean-Christophe
01:59
created

HtmlDoubleElement::getContentInstances()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
<?php
2
namespace Ajax\common\html;
3
4
use Ajax\JsUtils;
5
use Ajax\semantic\html\collections\form\HtmlFormField;
6
use Ajax\semantic\html\collections\form\HtmlForm;
7
8
class HtmlDoubleElement extends HtmlSingleElement {
9
10
	/**
11
	 *
12
	 * @var mixed
13
	 */
14
	protected $content;
15
16
	protected $wrapContentBefore = "";
17
18
	protected $wrapContentAfter = "";
19
20
	protected $_editableContent;
21
22
	public function __construct($identifier, $tagName = "p") {
23
		parent::__construct($identifier, $tagName);
24
		$this->_template = '<%tagName% id="%identifier%" %properties%>%wrapContentBefore%%content%%wrapContentAfter%</%tagName%>';
25
	}
26
27
	public function setContent($content) {
28
		$this->content = $content;
29
		return $this;
30
	}
31
32
	public function getContent() {
33
		return $this->content;
34
	}
35
36
	public function addContent($content, $before = false) {
37
		if (! \is_array($this->content)) {
38
			if (isset($this->content))
39
				$this->content = array(
40
					$this->content
41
				);
42
			else
43
				$this->content = array();
44
		}
45
		if ($before)
46
			array_unshift($this->content, $content);
47
		else
48
			$this->content[] = $content;
49
		return $this;
50
	}
51
52
	/*
53
	 * (non-PHPdoc)
54
	 * @see \Ajax\bootstrap\html\HtmlSingleElement::run()
55
	 */
56
	public function run(JsUtils $js) {
57
		parent::run($js);
58
		if ($this->content instanceof HtmlDoubleElement) {
59
			$this->content->run($js);
60
		} else if (\is_array($this->content)) {
61
			foreach ($this->content as $itemContent) {
62
				if ($itemContent instanceof HtmlDoubleElement) {
63
					$itemContent->run($js);
64
				}
65
			}
66
		}
67
	}
68
69
	public function setValue($value) {}
70
71
	public function wrapContent($before, $after = "") {
72
		$this->wrapContentBefore .= $before;
73
		$this->wrapContentAfter = $after . $this->wrapContentAfter;
74
		return $this;
75
	}
76
77
	/**
78
	 * Wraps the element with a container.
79
	 *
80
	 * @param HtmlDoubleElement $container
81
	 * @return \Ajax\common\html\HtmlDoubleElement
82
	 */
83
	public function wrapWith(HtmlDoubleElement $container) {
84
		return $container->setContent($this);
85
	}
86
87
	public function getContentInstances($class) {
88
		return $this->_getContentInstances($class, $this->content);
89
	}
90
91
	protected function _getContentInstances($class, $content) {
92
		$instances = [];
93
		if ($content instanceof $class) {
94
			$instances[] = $content;
95
		} elseif ($content instanceof HtmlDoubleElement) {
96
			$instances = \array_merge($instances, $content->getContentInstances($class));
97
		} elseif (\is_array($content)) {
98
			foreach ($content as $element) {
99
				$instances = \array_merge($instances, $this->_getContentInstances($class, $element));
100
			}
101
		}
102
		return $instances;
103
	}
104
105
	/**
106
	 * Transforms the element into a link
107
	 *
108
	 * @return HtmlDoubleElement
109
	 */
110
	public function asLink($href = NULL, $target = NULL) {
111
		if (isset($href))
112
			$this->setProperty("href", $href);
113
		if (isset($target))
114
			$this->setProperty("target", $target);
115
		return $this->setTagName("a");
116
	}
117
118
	public function getTextContent() {
119
		if (is_array($this->content)) {
120
			return strip_tags(implode("", $this->content));
121
		}
122
		return strip_tags($this->content);
123
	}
124
125
	public function asEditable(HtmlFormField $field, $asForm = false, $setValueProperty = "val()") {
126
		$idF = $field->getIdentifier();
127
		$idE = $idF;
128
		if ($asForm) {
129
			$frm = new HtmlForm("frm-" . $field->getIdentifier());
130
			$frm->setProperty("onsubmit", "return false;");
131
			$fields = $frm->addFields();
132
			$idE = $frm->getIdentifier();
133
			$fields->addItem($field);
134
			$fields->addButtonIcon("bt-okay", "check", "green mini", "\$('#" . $idE . "').trigger('validate',{value: $('#'+idF+' input').val()});");
135
			$fields->addButtonIcon("bt-cancel", "close", "mini", "\$('#" . $idE . "').trigger('endEdit');");
136
			$this->_editableContent = $frm;
137
			$keypress = "";
138
			$focusOut = "";
139
		} else {
140
			$focusOut = "if(e.relatedTarget==null)elm.trigger('endEdit');";
141
			$this->_editableContent = $field;
142
			$keypress = "$('#" . $idF . "').keyup(function(e){if(e.which == 13) {\$('#" . $idE . "').trigger('validate',{value: $('#'+idF+' input').val()});}if(e.keyCode===27) {\$('#" . $idE . "').trigger('endEdit');}});";
143
		}
144
		$this->_editableContent->setProperty("style", "display:none;");
145
		$this->onCreate("let idF='" . $idF . "';let idE='" . $idE . "';let elm=$('#'+idE);let self=$('#" . $this->getIdentifier() . "');" . $keypress . "elm.on('validate',function(){self.html($('#'+idE+' input')." . $setValueProperty . ");elm.trigger('endEdit');});elm.on('endEdit',function(){self.show();$(this).hide();});elm.focusout(function(e){" . $focusOut . "});");
146
		$this->onClick("let self=$(this);self.hide();" . $field->setJsContent("self.html()") . ";$('#" . $idF . " input').trigger('change');elm.show();$('#'+idE+' input').focus();");
147
	}
148
149
	/**
150
	 *
151
	 * {@inheritdoc}
152
	 * @see \Ajax\common\html\BaseHtml::compile_once()
153
	 */
154
	protected function compile_once(\Ajax\JsUtils $js = NULL, &$view = NULL) {
155
		if (! $this->_compiled && isset($this->_editableContent)) {
156
			$this->wrap("", $this->_editableContent);
157
		}
158
		parent::compile_once($js, $view);
159
	}
160
}
161