1
0

BxBaseEditorQuill.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaBaseView UNA Base Representation Classes
  7. * @{
  8. */
  9. /**
  10. * Quill editor representation.
  11. * @see BxDolEditor
  12. */
  13. class BxBaseEditorQuill extends BxDolEditor
  14. {
  15. /**
  16. * Common initialization params
  17. */
  18. protected static $CONF_COMMON = "
  19. window.{bx_var_editor_call_init} = function() {
  20. var oTextarea = $('{bx_var_selector}');
  21. if(!oTextarea.length || typeof({bx_var_editor_name}) != 'undefined')
  22. return;
  23. {bx_var_editor_name} = bx_editor_init({
  24. skin: '{bx_var_skin}',
  25. name: '{bx_var_editor_name}',
  26. selector: '{bx_var_selector}',
  27. css_class: '{bx_var_css_additional_class}',
  28. toolbar: {toolbar},
  29. root_url: '{bx_url_root}',
  30. query_params: {bx_var_query_params},
  31. insert_as_plain_text: {insert_as_plain_text},
  32. empty_tags: {empty_tags},
  33. allowed_tags: {allowed_tags}
  34. });
  35. oTextarea.addClass('bx-form-input-html').hide();
  36. };
  37. window.{bx_var_editor_call_destroy} = function() {
  38. var oTextarea = $('{bx_var_selector}');
  39. if(!oTextarea.length || typeof({bx_var_editor_name}) == 'undefined')
  40. return;
  41. {bx_var_editor_name} = undefined;
  42. oTextarea.siblings('.ql-toolbar,.ql-container').remove();
  43. oTextarea.removeClass('bx-form-input-html').show();
  44. };";
  45. /**
  46. * Standard view initialization params
  47. */
  48. protected static $CONF_STANDARD = "";
  49. /**
  50. * Minimal view initialization params
  51. */
  52. protected static $CONF_MINI = "";
  53. /**
  54. * Full view initialization params
  55. */
  56. protected static $CONF_FULL = "";
  57. protected $_oTemplate;
  58. protected $_bJsCssAdded = false;
  59. public function __construct ($aObject, $oTemplate)
  60. {
  61. parent::__construct ($aObject);
  62. if ($oTemplate)
  63. $this->_oTemplate = $oTemplate;
  64. else
  65. $this->_oTemplate = BxDolTemplate::getInstance();
  66. }
  67. /**
  68. * Attach editor to HTML element, in most cases - textarea.
  69. * @param $sSelector - jQuery selector to attach editor to.
  70. * @param $iViewMode - editor view mode: BX_EDITOR_STANDARD, BX_EDITOR_MINI, BX_EDITOR_FULL
  71. * @param $bDynamicMode - is AJAX mode or not, the HTML with editor area is loaded dynamically.
  72. */
  73. public function attachEditor ($sSelector, $iViewMode = BX_EDITOR_STANDARD, $bDynamicMode = false, $aAttrs = [])
  74. {
  75. // set visual mode
  76. $sAllowedTags = '';
  77. $sToolbarItems = '';
  78. switch ($iViewMode) {
  79. case BX_EDITOR_MINI:
  80. $sToolbarItems = getParam('sys_quill_toolbar_mini');
  81. $sAllowedTags = getParam('sys_quill_allowed_tags_mini');
  82. $sCustomInit = self::$CONF_MINI;
  83. break;
  84. case BX_EDITOR_FULL:
  85. $sToolbarItems = getParam('sys_quill_toolbar_full');
  86. $sAllowedTags = getParam('sys_quill_allowed_tags_full');
  87. $sCustomInit = self::$CONF_FULL;
  88. break;
  89. case BX_EDITOR_STANDARD:
  90. default:
  91. $sToolbarItems = getParam('sys_quill_toolbar_standard');
  92. $sAllowedTags = getParam('sys_quill_allowed_tags_standard');
  93. $sCustomInit = self::$CONF_STANDARD;
  94. }
  95. if($this->_sButtonsCustom !== false)
  96. $sToolbarItems = $this->_sButtonsCustom;
  97. $sEditorName = 'quill_' . str_replace(['-', ' '], '_', $aAttrs['form_id'] . '_' . $aAttrs['element_name'] . '_' . $aAttrs['uniq']);
  98. $sEditorCallInit = $sEditorName . '_init';
  99. $sEditorCallDestroy = $sEditorName . '_destroy';
  100. // initialize editor
  101. $sInitEditor = $this->_replaceMarkers(self::$CONF_COMMON, [
  102. 'bx_var_custom_init' => $sCustomInit,
  103. 'bx_var_selector' => bx_js_string($sSelector. '.' . $aAttrs['uniq'], BX_ESCAPE_STR_APOS),
  104. 'bx_var_query_params' => isset($aAttrs['query_params']) ? json_encode($aAttrs['query_params']) : "''",
  105. 'bx_var_form_id' => $aAttrs['form_id'],
  106. 'toolbar' => $sToolbarItems ? '[' . $sToolbarItems . ']' : 'false',
  107. 'insert_as_plain_text' => getParam('sys_quill_insert_as_plain_text') == 'on' ? 'true' : 'false',
  108. 'empty_tags' => getParam('sys_quill_allow_empty_tags') == 'on' ? 'true' : 'false',
  109. 'allowed_tags' => $sAllowedTags == '' ? 'false' : $sAllowedTags,
  110. 'bx_var_css_additional_class' => $sToolbarItems ? '' : 'bx-form-input-html-quill-empty',
  111. 'bx_var_element_name' => str_replace(['-', ' '], '_', $aAttrs['element_name']),
  112. 'bx_var_editor_name' => $sEditorName,
  113. 'bx_var_editor_call_init' => $sEditorCallInit,
  114. 'bx_var_editor_call_destroy' => $sEditorCallDestroy,
  115. 'bx_var_skin' => bx_js_string($this->_aObject['skin'], BX_ESCAPE_STR_APOS),
  116. 'bx_url_root' => bx_js_string(BX_DOL_URL_ROOT, BX_ESCAPE_STR_APOS)
  117. ]);
  118. $sScript = "var " . $sEditorName . " = undefined; ";
  119. if($bDynamicMode) {
  120. list($aJs, $aJsTranslations, $aCss) = $this->_getJsCss(true);
  121. $sInitAndCall = $sInitEditor . $sEditorCallInit . '();';
  122. $sScript .= $this->_oTemplate->addJsPreloaded($aJs, $sInitAndCall, "typeof(Quill) === 'undefined'", $sInitAndCall);
  123. $sScript = $this->_oTemplate->_wrapInTagJsCode($sScript);
  124. $sScript = $this->_oTemplate->addJsTranslation($aJsTranslations, true) . $sScript;
  125. $sScript = $this->_oTemplate->addCss($aCss, true) . $sScript;
  126. }
  127. else {
  128. $sScript .= $sInitEditor . $this->_oTemplate->addJsCodeOnLoad($sEditorCallInit . '()');
  129. $sScript = $this->_oTemplate->_wrapInTagJsCode($sScript);
  130. }
  131. return $this->_addJsCss($bDynamicMode) . $sScript;
  132. }
  133. public function getEditorInfo ($sSelector, $iViewMode = BX_EDITOR_STANDARD, $bDynamicMode = false, $aAttrs = [])
  134. {
  135. $sEditorName = 'quill_' . str_replace(['-', ' '], '_', $aAttrs['form_id'] . '_' . $aAttrs['element_name'] . '_' . $aAttrs['uniq']);
  136. return [
  137. 'name' => $sEditorName,
  138. 'selector' => $sSelector. '.' . $aAttrs['uniq'],
  139. 'js_call_init' => $sEditorName . '_init()',
  140. 'js_call_destroy' => $sEditorName . '_destroy()'
  141. ];
  142. }
  143. /**
  144. * Add css/js files which are needed for editor display and functionality.
  145. */
  146. protected function _addJsCss($bDynamicMode = false, $sInitEditor = '')
  147. {
  148. if($bDynamicMode || $this->_bJsCssAdded)
  149. return '';
  150. list($aJs, $aJsTranslations, $aCss) = $this->_getJsCss();
  151. $this->_oTemplate->addJs($aJs);
  152. $this->_oTemplate->addJsTranslation($aJsTranslations);
  153. $this->_oTemplate->addCss($aCss);
  154. $this->_bJsCssAdded = true;
  155. return '';
  156. }
  157. protected function _getJsCss($bUseUrlsForJs = false)
  158. {
  159. $sJsPrefix = $bUseUrlsForJs ? BX_DOL_URL_PLUGINS_PUBLIC : BX_DIRECTORY_PATH_PLUGINS_PUBLIC;
  160. $sJsPrefixRoot = $bUseUrlsForJs ? BX_DOL_URL_ROOT .'inc/js/' : BX_DIRECTORY_PATH_INC . 'js/';
  161. $sJsSuffix = $bUseUrlsForJs ? '' : '|';
  162. $aJs = [
  163. $sJsPrefix . 'highlight/' . $sJsSuffix . 'highlight.min.js',
  164. $sJsPrefix . 'quill/' . $sJsSuffix . 'quill.min.js',
  165. $sJsPrefix . 'quill/' . $sJsSuffix . 'quill.mention.min.js',
  166. $sJsPrefix . 'quill/' . $sJsSuffix . 'quill.imageUploader.min.js',
  167. $sJsPrefix . 'quill/' . $sJsSuffix . 'image-resize.min.js',
  168. $sJsPrefix . 'quill/' . $sJsSuffix . 'quill-emoji.js',
  169. $sJsPrefixRoot . $sJsSuffix . 'editor.quill.js'
  170. ];
  171. $aJsTranslations = [
  172. '_sys_txt_quill_tooltip_bold',
  173. '_sys_txt_quill_tooltip_italic',
  174. '_sys_txt_quill_tooltip_underline',
  175. '_sys_txt_quill_tooltip_clean',
  176. '_sys_txt_quill_tooltip_list_ordered',
  177. '_sys_txt_quill_tooltip_list_bullet',
  178. '_sys_txt_quill_tooltip_indent_1',
  179. '_sys_txt_quill_tooltip_indent_2',
  180. '_sys_txt_quill_tooltip_blockquote',
  181. '_sys_txt_quill_tooltip_direction',
  182. '_sys_txt_quill_tooltip_script_sub',
  183. '_sys_txt_quill_tooltip_script_super',
  184. '_sys_txt_quill_tooltip_link',
  185. '_sys_txt_quill_tooltip_image',
  186. '_sys_txt_quill_tooltip_code_block',
  187. '_sys_txt_quill_tooltip_color',
  188. '_sys_txt_quill_tooltip_background',
  189. '_sys_txt_quill_tooltip_align',
  190. '_sys_txt_quill_tooltip_header',
  191. '_sys_txt_quill_tooltip_embed',
  192. '_sys_txt_quill_tooltip_embed_popup_header',
  193. '_sys_txt_quill_tooltip_link_popup_header',
  194. ];
  195. $sCss = 'editor.less';
  196. $aCss = BxDolTemplate::getInstance()->_lessCss([
  197. 'path' => $this->_oTemplate->getCssPath($sCss),
  198. 'url' => $this->_oTemplate->getCssUrl($sCss)
  199. ]);
  200. $aCss = array_merge($aCss, [
  201. BX_DIRECTORY_PATH_BASE . 'css/|editor_snow.quill.css',
  202. BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'quill/|quill.mention.css',
  203. BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'quill/|quill-emoji.css',
  204. BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'highlight/|default.min.css',
  205. BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'quill/quill.imageUploader.min.css',
  206. BX_DIRECTORY_PATH_BASE . 'css/|editor.quill.css',
  207. ]);
  208. return [$aJs, $aJsTranslations, $aCss];
  209. }
  210. }
  211. /** @} */