PageRenderTime 51ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/plugins/system/zoo_zlelements/zoo_zlelements/elements/textareapro/textareapro.php

https://gitlab.com/vnsoftdev/amms
PHP | 400 lines | 209 code | 47 blank | 144 comment | 51 complexity | b3d0cc8e69996d35e22ce6dfeb8a7e5b MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0, GPL-2.0
  1. <?php
  2. /**
  3. * @package ZL Elements
  4. * @author JOOlanders, SL http://www.zoolanders.com
  5. * @copyright Copyright (C) JOOlanders, SL
  6. * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
  7. */
  8. // no direct access
  9. defined('_JEXEC') or die('Restricted access');
  10. /*
  11. Class: ElementTextarea
  12. The textarea element class
  13. */
  14. class ElementTextareaPro extends ElementRepeatablePro implements iSubmittable {
  15. const ROWS = 20;
  16. const COLS = 60;
  17. const MAX_HIDDEN_EDITORS = 5;
  18. /*
  19. Function: Constructor
  20. */
  21. public function __construct() {
  22. // call parent constructor
  23. parent::__construct();
  24. // set callbacks
  25. $this->registerCallback('returndatabyindex');
  26. // register events
  27. $this->app->event->dispatcher->connect('element:afterdisplay', array($this, 'afterDisplay'));
  28. // load default and current language
  29. $this->app->system->language->load("plg_system_zoo_zlelements_textareapro", $this->app->path->path('zlpath:'), 'en-GB', true);
  30. $this->app->system->language->load("plg_system_zoo_zlelements_textareapro", $this->app->path->path('zlpath:'), null, true);
  31. }
  32. /*
  33. Function: afterDisplay
  34. Change the element layout after it has been displayed
  35. Parameters:
  36. $event - object
  37. */
  38. public static function afterDisplay($event)
  39. {
  40. $event['html'] = str_replace('class="element element-textareapro', 'class="element element-textarea element-textareapro', $event['html']);
  41. }
  42. /*
  43. Function: bindData
  44. Set data through data array.
  45. Parameters:
  46. $data - array
  47. Returns:
  48. Void
  49. */
  50. public function bindData($data = array()) {
  51. // set raw input for textarea
  52. $post = $this->app->request->get('post', JREQUEST_ALLOWRAW);
  53. foreach ($data as $index => $instance_data) {
  54. if (isset($post['elements'][$this->identifier][$index]['value'])) {
  55. $data[$index]['value'] = $post['elements'][$this->identifier][$index]['value'];
  56. }
  57. }
  58. parent::bindData($data);
  59. }
  60. /*
  61. Function: _getSearchData
  62. Get repeatable elements search data.
  63. Returns:
  64. String - Search data
  65. */
  66. protected function _getSearchData() {
  67. // clean html tags
  68. $value = $this->app->object->create('JFilterInput')->clean($this->get('value', ''));
  69. return (empty($value) ? null : $value);
  70. }
  71. /*
  72. Function: getRenderedValues
  73. renders the element content
  74. Returns:
  75. array
  76. */
  77. public function getRenderedValues($params=array(), $mode=false, $opts=array())
  78. {
  79. // get results
  80. $result = parent::getRenderedValues($params, $mode, $opts);
  81. if (empty($result)) return null; // if no results abort
  82. // trigger content plugins
  83. if ($this->config->find('specific._jplugins')) {
  84. for ($i = 0; $i < count($result['result']); $i++) {
  85. switch ($mode)
  86. {
  87. // WK Slideset // WK Accordion
  88. case 'slideset.default': case 'accordion.default':
  89. $result['result'][$i]['content'] = $this->app->zoo->triggerContentPlugins($result['result'][$i]['content']);
  90. break;
  91. default:
  92. $result['result'][$i] = $this->app->zoo->triggerContentPlugins($result['result'][$i]);
  93. break;
  94. }
  95. }
  96. }
  97. // clean the results from HTML tags
  98. if ($params->find('specific._strip_tags')) {
  99. for ($i = 0; $i < count($result['result']); $i++) {
  100. switch ($mode)
  101. {
  102. // WK Slideset // WK Accordion
  103. case 'slideset.default': case 'accordion.default':
  104. $result['result'][$i]['content'] = strip_tags($result['result'][$i]['content']);
  105. break;
  106. default:
  107. $result['result'][$i] = strip_tags($result['result'][$i]);
  108. break;
  109. }
  110. }
  111. }
  112. // truncate
  113. if ($max_length = $params->find('specific._max_car', 0))
  114. {
  115. $tr_mode = $params->find('specific._max_car_mode', 1);
  116. $tr_suffix = $params->find('specific._max_car_suffix', '...');
  117. // group all text & truncate
  118. if (isset($max_length) && $max_length > 0 && count($result['result']) > 1 && $tr_mode == 1)
  119. {
  120. $result_len = 0;
  121. for ($i = 0; $i < count($result['result']); $i++) switch (preg_replace('/\..+/', '', $mode)) // return the mode without any post . text
  122. {
  123. // WK Slideset // WK Accordion
  124. case 'slideset': case 'accordion':
  125. $text = $result['result'][$i]['content'];
  126. $result_len += strlen(strip_tags($text));
  127. if ($result_len > $max_length){
  128. $truncate_len = $i > 1 ? $result_len - $max_length : $max_length;
  129. $result['result'][$i]['content'] = $this->app->zlstring->truncate($text, $truncate_len, $tr_suffix);
  130. $result['result'] = array_slice($result['result'], 0, $i+1); // remove the rest
  131. $result['report']['limited'] = true;
  132. break;
  133. } else { $result['result'][$i]['content'] = $text; }
  134. break;
  135. default:
  136. $text = $result['result'][$i];
  137. $result_len += strlen(strip_tags($text));
  138. if ($result_len > $max_length){
  139. $truncate_len = $i > 1 ? $result_len - $max_length : $max_length;
  140. $result['result'][$i] = $this->app->zlstring->truncate($text, $truncate_len, $tr_suffix);
  141. $result['result'] = array_slice($result['result'], 0, $i+1); // remove the rest
  142. $result['report']['limited'] = true;
  143. break;
  144. } else { $result['result'][$i] = $text; }
  145. break;
  146. }
  147. }
  148. // truncate individualy
  149. else if (isset($max_length) && $max_length > 0)
  150. {
  151. $limited_once = false;
  152. for ($i = 0; $i < count($result['result']); $i++) switch (preg_replace('/\..+/', '', $mode)) // return the mode without any post . text
  153. {
  154. // WK Slideset // WK Accordion
  155. case 'slideset': case 'accordion':
  156. if (strlen($result['result'][$i]['content']) > $max_length){
  157. $result['result'][$i]['content'] = $this->app->zlstring->truncate($result['result'][$i]['content'], $max_length, $tr_suffix);
  158. $limited_once == true;
  159. }
  160. break;
  161. default:
  162. if (strlen($result['result'][$i]) > $max_length){
  163. $result['result'][$i] = $this->app->zlstring->truncate($result['result'][$i], $max_length, $tr_suffix);
  164. $limited_once == true;
  165. }
  166. break;
  167. }
  168. $result['report']['limited'] = $limited_once ? $result['report']['limited'] : true;
  169. }
  170. }
  171. return $result;
  172. }
  173. /*
  174. Function: _render
  175. Renders the repeatable element.
  176. Parameters:
  177. $params - AppData render parameter
  178. Returns:
  179. String - html
  180. */
  181. protected function _render($params = array(), $mode=false, $opts=array())
  182. {
  183. // prepare the widgetkit mode
  184. $mode = "{$params->find('layout.widgetkit._widget')}.{$params->find('layout.widgetkit._style')}";
  185. // render layout or value
  186. $main_layout = basename($params->find('layout._layout', 'default.php'), '.php');
  187. if ($layout = $this->getLayout('render/'.$main_layout.'/_sublayouts/'.$params->find('layout._sublayout', '_default.php')))
  188. {
  189. return $this->renderLayout($layout, compact('params'));
  190. }
  191. else
  192. {
  193. switch (preg_replace('/\..+/', '', $mode)) // return the mode without any post . text
  194. {
  195. // WK Slideset // WK Accordion
  196. case 'slideset': case 'accordion':
  197. $wkitem = array();
  198. $wkitem['set'] = '';
  199. $wkitem['title'] = $this->get('title');
  200. $wkitem['content'] = $this->get('value');
  201. $wkitem['navigation'] = $this->get('title');
  202. return $wkitem;
  203. break;
  204. default:
  205. return $this->get('value');
  206. break;
  207. }
  208. }
  209. }
  210. /*
  211. Function: returnDataByIndex
  212. Renders the element data - use for ajax requests
  213. */
  214. public function returnDataByIndex($index = 0) {
  215. // returns the element with specified index
  216. $this->rewind();
  217. $value = '';
  218. foreach ($this as $self) {
  219. if ($self->index() == (int)$index) {
  220. $value = $this->get('value', '');
  221. }
  222. }
  223. return $value;
  224. }
  225. /*
  226. Function: loadAssets
  227. Load elements css/js assets.
  228. Returns:
  229. Void
  230. */
  231. public function loadAssets($params = array()) {
  232. parent::loadAssets();
  233. $params = $this->app->data->create($params);
  234. $trusted = $params->get('trusted_mode', true);
  235. $editor = $this->config->find('specific._editor');
  236. $doc = $this->app->document;
  237. if ($editor != 'joomlaeditor') {
  238. $doc->addScript('elements:textareapro/assets/js/textareapro.min.js');
  239. if ($editor == 'customeditor' && $trusted)
  240. $doc->addScript('zlfw:assets/js/jquery.plugins/jquery.tinymce.js');
  241. if ($this->config->find('specific._input_limit', 0) && $editor != 'customeditor')
  242. $doc->addScript('zlfw:assets/js/jquery.plugins/jquery.inputlimiter.min.js');
  243. }
  244. if ($editor == 'joomlaeditor' && $this->config->get('repeatable')) {
  245. $doc->addScript('elements:textarea/textarea.js');
  246. }
  247. $doc->addStylesheet('elements:textareapro/assets/css/textareapro.css');
  248. return $this;
  249. }
  250. /*
  251. Function: renderSubmission
  252. Renders the element in submission.
  253. Parameters:
  254. $params - AppData submission parameters
  255. Returns:
  256. String - html
  257. */
  258. public function renderSubmission($params = array()) {
  259. $this->loadAssets($params);
  260. return $this->_renderRepeatable('_renderSubmission', $params);
  261. }
  262. /*
  263. Function: _renderSubmission
  264. Renders the element in submission.
  265. Parameters:
  266. $params - submission parameters
  267. Returns:
  268. String - html
  269. */
  270. public function _renderSubmission($params = array()) {
  271. /* // get params
  272. $trusted_mode = $params->get('trusted_mode');
  273. if ($layout = $this->getLayout('submission.php')) {
  274. return $this->renderLayout($layout,
  275. compact('trusted_mode')
  276. );
  277. }*/
  278. return $this->_edit();
  279. }
  280. /*
  281. Function: _validateSubmission
  282. Validates the submitted element
  283. Parameters:
  284. $value - AppData value
  285. $params - AppData submission parameters
  286. Returns:
  287. Array - cleaned value
  288. */
  289. public function _validateSubmission($values, $params)
  290. {
  291. // init vars
  292. $required = $params->get('required');
  293. // validate values
  294. $value = $this->app->validator->create('string', array('required' => $required))->clean($values->get('value'));
  295. $title = $this->app->validator->create('string', array('required' => false))->clean($values->get('title'));
  296. return compact('value', 'title');
  297. }
  298. /* YOO Joomla Editor compatibility
  299. ---------------------------------------------------------------------------------------------------------------------------*/
  300. /*
  301. Function: edit
  302. Renders the edit form field.
  303. Returns:
  304. String - html
  305. */
  306. public function edit() {
  307. if ($this->config->find('specific._editor') == 'joomlaeditor')
  308. return $this->_renderRepeatable(null, $this->app->data->create()->set('trusted_mode', true));
  309. else return parent::edit();
  310. }
  311. /*
  312. Function: _renderRepeatable
  313. Renders the repeatable
  314. Returns:
  315. String - output
  316. */
  317. protected function _renderRepeatable($function, $params = array()) {
  318. if ($this->config->find('specific._editor') == 'joomlaeditor'){
  319. $params = $this->app->data->create($params);
  320. $this->rewind();
  321. return $this->config->get('repeatable') ? $this->renderLayout($this->getLayout('edit/edit_yoo.php'), compact('params')) : $this->_addEditor(0, $this->get('value', $this->config->get('default')), $params->get('trusted_mode', false));
  322. } else {
  323. return parent::_renderRepeatable($function, $params);
  324. }
  325. }
  326. protected function _addEditor($index, $value = '', $trusted_mode = true) {
  327. // render layout
  328. if ($layout = $this->getLayout('edit/_edit_yoo.php'))
  329. {
  330. return '<div>'.$this->renderLayout($layout, compact('index', 'value', 'trusted_mode')).'</div>';
  331. }
  332. }
  333. public function getYooControlName($name, $index) {
  334. return "elements[{$this->identifier}][{$index}][$name]";
  335. }
  336. }