BxBaseEditorTinyMCE.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
  4. * CC-BY License - http://creativecommons.org/licenses/by/3.0/
  5. *
  6. * @defgroup TridentCore Trident Core
  7. * @{
  8. */
  9. /**
  10. * TinyMCE editor representation.
  11. * @see BxDolEditor
  12. */
  13. class BxBaseEditorTinyMCE extends BxDolEditor
  14. {
  15. /**
  16. * Common initialization params
  17. */
  18. protected static $CONF_COMMON = "
  19. jQuery('{bx_var_selector}').tinymce({
  20. {bx_var_custom_init}
  21. {bx_var_custom_conf}
  22. document_base_url: '{bx_url_root}',
  23. skin_url: '{bx_url_tinymce}skins/{bx_var_skin}/',
  24. language_url: '{bx_url_tinymce}langs/{bx_var_lang}.js',
  25. content_css: '{bx_var_css_path}',
  26. entity_encoding: 'raw',
  27. browser_spellcheck: true
  28. });
  29. ";
  30. /**
  31. * Standard view initialization params
  32. */
  33. protected static $CONF_STANDARD = "
  34. external_plugins: {
  35. advlist: '{bx_url_tinymce}plugins/advlist/plugin.min.js',
  36. autolink: '{bx_url_tinymce}plugins/autolink/plugin.min.js',
  37. autosave: '{bx_url_tinymce}plugins/autosave/plugin.min.js',
  38. code: '{bx_url_tinymce}plugins/code/plugin.min.js',
  39. hr: '{bx_url_tinymce}plugins/hr/plugin.min.js',
  40. image: '{bx_url_tinymce}plugins/image/plugin.min.js',
  41. link: '{bx_url_tinymce}plugins/link/plugin.min.js',
  42. lists: '{bx_url_tinymce}plugins/lists/plugin.min.js',
  43. media: '{bx_url_tinymce}plugins/media/plugin.min.js',
  44. paste: '{bx_url_tinymce}plugins/paste/plugin.min.js',
  45. fullscreen: '{bx_url_tinymce}plugins/fullscreen/plugin.min.js',
  46. },
  47. width: '100%',
  48. height: '270',
  49. theme_url: '{bx_url_tinymce}themes/modern/theme.min.js',
  50. toolbar: 'undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
  51. statusbar: true,
  52. resize: true,
  53. ";
  54. /**
  55. * Minimal view initialization params
  56. */
  57. protected static $CONF_MINI = "
  58. menubar: false,
  59. external_plugins: {
  60. autolink: '{bx_url_tinymce}plugins/autolink/plugin.min.js',
  61. image: '{bx_url_tinymce}plugins/image/plugin.min.js',
  62. link: '{bx_url_tinymce}plugins/link/plugin.min.js',
  63. lists: '{bx_url_tinymce}plugins/lists/plugin.min.js',
  64. paste: '{bx_url_tinymce}plugins/paste/plugin.min.js',
  65. fullscreen: '{bx_url_tinymce}plugins/fullscreen/plugin.min.js',
  66. },
  67. width: '100%',
  68. height: '150',
  69. theme_url: '{bx_url_tinymce}themes/modern/theme.min.js',
  70. toolbar: 'bold italic underline removeformat | bullist numlist | alignleft aligncenter alignright | blockquote | link unlink image',
  71. statusbar: false,
  72. ";
  73. /**
  74. * Full view initialization params
  75. */
  76. protected static $CONF_FULL = "
  77. external_plugins: {
  78. advlist: '{bx_url_tinymce}plugins/advlist/plugin.min.js',
  79. anchor: '{bx_url_tinymce}plugins/anchor/plugin.min.js',
  80. autolink: '{bx_url_tinymce}plugins/autolink/plugin.min.js',
  81. autoresize: '{bx_url_tinymce}plugins/autoresize/plugin.min.js',
  82. autosave: '{bx_url_tinymce}plugins/autosave/plugin.min.js',
  83. charmap: '{bx_url_tinymce}plugins/charmap/plugin.min.js',
  84. code: '{bx_url_tinymce}plugins/code/plugin.min.js',
  85. emoticons: '{bx_url_tinymce}plugins/emoticons/plugin.min.js',
  86. hr: '{bx_url_tinymce}plugins/hr/plugin.min.js',
  87. image: '{bx_url_tinymce}plugins/image/plugin.min.js',
  88. link: '{bx_url_tinymce}plugins/link/plugin.min.js',
  89. lists: '{bx_url_tinymce}plugins/lists/plugin.min.js',
  90. media: '{bx_url_tinymce}plugins/media/plugin.min.js',
  91. nonbreaking: '{bx_url_tinymce}plugins/nonbreaking/plugin.min.js',
  92. pagebreak: '{bx_url_tinymce}plugins/pagebreak/plugin.min.js',
  93. preview: '{bx_url_tinymce}plugins/preview/plugin.min.js',
  94. print: '{bx_url_tinymce}plugins/print/plugin.min.js',
  95. paste: '{bx_url_tinymce}plugins/paste/plugin.min.js',
  96. save: '{bx_url_tinymce}plugins/save/plugin.min.js',
  97. searchreplace: '{bx_url_tinymce}plugins/searchreplace/plugin.min.js',
  98. table: '{bx_url_tinymce}plugins/table/plugin.min.js',
  99. textcolor: '{bx_url_tinymce}plugins/textcolor/plugin.min.js',
  100. visualblocks: '{bx_url_tinymce}plugins/visualblocks/plugin.min.js',
  101. fullscreen: '{bx_url_tinymce}plugins/fullscreen/plugin.min.js',
  102. },
  103. width: '100%',
  104. height: '320',
  105. theme_url: '{bx_url_tinymce}themes/modern/theme.min.js',
  106. toolbar: [
  107. 'undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
  108. 'print preview media | forecolor emoticons | fullscreen'
  109. ],
  110. statusbar: true,
  111. resize: true,
  112. image_advtab: true,
  113. ";
  114. protected $_sConfCustom = '';
  115. /**
  116. * Available editor languages
  117. */
  118. protected static $CONF_LANGS = array('ar' => 1, 'ar_SA' => 1, 'az' => 1, 'be' => 1, 'bg_BG' => 1, 'bn_BD' => 1, 'bs' => 1, 'ca' => 1, 'cs' => 1, 'cs_CZ' => 1, 'cy' => 1, 'da' => 1, 'de' => 1, 'de_AT' => 1, 'dv' => 1, 'el' => 1, 'en' => 1, 'en_CA' => 1, 'en_GB' => 1, 'eo' => 1, 'es' => 1, 'es_MX' => 1, 'et' => 1, 'eu' => 1, 'fa' => 1, 'fa_IR' => 1, 'fi' => 1, 'fo' => 1, 'fr_CH' => 1, 'fr_FR' => 1, 'ga' => 1, 'gd' => 1, 'gl' => 1, 'he_IL' => 1, 'hi_IN' => 1, 'hr' => 1, 'hu_HU' => 1, 'hy' => 1, 'id' => 1, 'is_IS' => 1, 'it' => 1, 'ja' => 1, 'ka_GE' => 1, 'kab' => 1, 'kk' => 1, 'km_KH' => 1, 'ko' => 1, 'ko_KR' => 1, 'ku' => 1, 'ku_IQ' => 1, 'lb' => 1, 'lt' => 1, 'lv' => 1, 'mk_MK' => 1, 'ml' => 1, 'ml_IN' => 1, 'mn_MN' => 1, 'nb_NO' => 1, 'nl' => 1, 'pl' => 1, 'pt_BR' => 1, 'pt_PT' => 1, 'ro' => 1, 'ru' => 1, 'ru_RU' => 1, 'si_LK' => 1, 'sk' => 1, 'sl_SI' => 1, 'sr' => 1, 'sv_SE' => 1, 'ta' => 1, 'ta_IN' => 1, 'tg' => 1, 'th_TH' => 1, 'tr' => 1, 'tr_TR' => 1, 'tt' => 1, 'ug' => 1, 'uk' => 1, 'uk_UA' => 1, 'vi' => 1, 'vi_VN' => 1, 'zh_CN' => 1, 'zh_TW' => 1);
  119. protected $_oTemplate;
  120. protected $_bJsCssAdded = false;
  121. public function __construct ($aObject, $oTemplate)
  122. {
  123. parent::__construct ($aObject);
  124. if ($oTemplate)
  125. $this->_oTemplate = $oTemplate;
  126. else
  127. $this->_oTemplate = BxDolTemplate::getInstance();
  128. }
  129. /**
  130. * Set custom TinyMCE configuration option
  131. */
  132. public function setCustomConf ($s)
  133. {
  134. $this->_sConfCustom = $s;
  135. }
  136. /**
  137. * Attach editor to HTML element, in most cases - textarea.
  138. * @param $sSelector - jQuery selector to attach editor to.
  139. * @param $iViewMode - editor view mode: BX_EDITOR_STANDARD, BX_EDITOR_MINI, BX_EDITOR_FULL
  140. * @param $bDynamicMode - is AJAX mode or not, the HTML with editor area is loaded dynamically.
  141. */
  142. public function attachEditor ($sSelector, $iViewMode = BX_EDITOR_STANDARD, $bDynamicMode = false)
  143. {
  144. // set visual mode
  145. switch ($iViewMode) {
  146. case BX_EDITOR_MINI:
  147. $sToolsItems = self::$CONF_MINI;
  148. break;
  149. case BX_EDITOR_FULL:
  150. $sToolsItems = self::$CONF_FULL;
  151. break;
  152. case BX_EDITOR_STANDARD:
  153. default:
  154. $sToolsItems = self::$CONF_STANDARD;
  155. }
  156. // detect language
  157. $sLang = BxDolLanguages::getInstance()->detectLanguageFromArray (self::$CONF_LANGS);
  158. // initialize editor
  159. $sInitEditor = $this->_replaceMarkers(self::$CONF_COMMON, array(
  160. 'bx_var_custom_init' => $sToolsItems,
  161. 'bx_var_custom_conf' => $this->_sConfCustom,
  162. 'bx_var_plugins_path' => bx_js_string(BX_DOL_URL_PLUGINS, BX_ESCAPE_STR_APOS),
  163. 'bx_var_css_path' => bx_js_string($this->_oTemplate->getCssUrl('editor.css'), BX_ESCAPE_STR_APOS),
  164. 'bx_var_skin' => bx_js_string($this->_aObject['skin'], BX_ESCAPE_STR_APOS),
  165. 'bx_var_lang' => bx_js_string($sLang, BX_ESCAPE_STR_APOS),
  166. 'bx_var_selector' => bx_js_string($sSelector, BX_ESCAPE_STR_APOS),
  167. 'bx_url_root' => bx_js_string(BX_DOL_URL_ROOT, BX_ESCAPE_STR_APOS),
  168. 'bx_url_tinymce' => bx_js_string(BX_DOL_URL_PLUGINS_PUBLIC . 'tinymce/', BX_ESCAPE_STR_APOS),
  169. ));
  170. if ($bDynamicMode) {
  171. $sScript = "<script>
  172. if ('undefined' == typeof(jQuery(document).tinymce)) {
  173. window.tinyMCEPreInit = {base : '" . bx_js_string(BX_DOL_URL_PLUGINS_PUBLIC . 'tinymce', BX_ESCAPE_STR_APOS) . "', suffix : '.min', query : ''};
  174. $.getScript('" . bx_js_string(BX_DOL_URL_ROOT . 'inc/js/editor.tinymce.js', BX_ESCAPE_STR_APOS) . "');
  175. $.getScript('" . bx_js_string(BX_DOL_URL_PLUGINS_PUBLIC . 'tinymce/tinymce.min.js', BX_ESCAPE_STR_APOS) . "', function(data, textStatus, jqxhr) {
  176. $.getScript('" . bx_js_string(BX_DOL_URL_PLUGINS_PUBLIC . 'tinymce/jquery.tinymce.min.js', BX_ESCAPE_STR_APOS) . "', function(data, textStatus, jqxhr) {
  177. $sInitEditor
  178. });
  179. });
  180. } else {
  181. $sInitEditor
  182. }
  183. </script>";
  184. } else {
  185. $sScript = "
  186. <script>
  187. $(document).ready(function () {
  188. $sInitEditor
  189. });
  190. </script>";
  191. }
  192. return $this->_addJsCss($bDynamicMode) . $sScript;
  193. }
  194. /**
  195. * Add css/js files which are needed for editor display and functionality.
  196. */
  197. protected function _addJsCss($bDynamicMode = false, $sInitEditor = '')
  198. {
  199. if ($bDynamicMode)
  200. return '';
  201. if ($this->_bJsCssAdded)
  202. return '';
  203. $this->_oTemplate->addJs(array('tinymce/tinymce.min.js', 'tinymce/jquery.tinymce.min.js', 'editor.tinymce.js'));
  204. $this->_bJsCssAdded = true;
  205. return '';
  206. }
  207. }
  208. /** @} */