Файл: wysiwyg/tinymce/wysiwyg.class.php
Строк: 378
<?php
class cmsWysiwygTinymce {
private static $redactor_loaded = false;
private $buttons = [
'|','bold','italic','underline','strikethrough','alignleft','aligncenter','alignright','alignjustify','alignnone','styleselect','formatselect','fontselect','fontsizeselect','cut','copy','paste','outdent','indent','blockquote','undo','redo','removeformat','subscript','superscript','visualaid','insert'
];
private $block_formats = [
'p' => LANG_TINYMCE_P,
'h2' => LANG_TITLE.' 2',
'h3' => LANG_TITLE.' 3',
'h4' => LANG_TITLE.' 4',
'h5' => LANG_TITLE.' 5',
'h6' => LANG_TITLE.' 6'
];
private $quickbars_selection_buttons = [
'bold', 'italic', 'underline', '|', 'quicklink', 'h2', 'h3', 'blockquote'
];
private $quickbars_insert_buttons = [
'quickimage', 'quicktable'
];
private $buttons_mapping = [
'wordcount','toc','nonbreaking','media','insertdatetime','image','hr','fullscreen','code',
'charmap','anchor','smiles',
'icmsspoiler' => [
'spoiler-add'
],
'lists' => [
'bullist', 'numlist'
],
'link' => [
'link', 'unlink', 'openlink'
],
'table' => [
'table', 'tabledelete', 'tablecellprops', 'tablemergecells', 'tablesplitcells', 'tableinsertrowbefore',
'tableinsertrowafter', 'tabledeleterow', 'tablerowprops', 'tablecutrow', 'tablecopyrow', 'tablepasterowbefore',
'tablepasterowafter', 'tableinsertcolbefore', 'tableinsertcolafter', 'tabledeletecol'
]
];
private $options = [
'plugins' => [
'autoresize'
],
'toolbar' => 'formatselect | bold italic strikethrough forecolor backcolor | link image media table | alignleft aligncenter alignright alignjustify | numlist bullist outdent indent | removeformat',
'min_height' => 200,
'max_height' => 700,
'browser_spellcheck' => true,
'menubar' => false,
'statusbar' => false,
'relative_urls' => false,
'convert_urls' => false,
'paste_data_images' => true,
'image_caption' => false,
'toolbar_drawer' => false,
'spoiler_caption' => LANG_TINYMCE_SP,
'toc_header' => 'div',
'resize' => 'both',
'theme' => 'silver',
'mobile' => [
'theme' => 'silver'
],
'smiles_url' => false,
'paste_as_text' => false,
'file_picker_types' => 'file media',
'file_upload' => [],
'allow_mime_types' => [],
'skin' => 'oxide',
'images_preset' => 'big'
];
public function __construct($config = []) {
$this->options = array_replace_recursive($this->options, $config);
if(!$this->options['plugins']){
$this->options['plugins'] = [];
}
$user = cmsUser::getInstance();
$core = cmsCore::getInstance();
$lang = cmsCore::getLanguageName();
if($lang !== 'en'){
$this->options['language'] = $lang;
}
// формируем плагины по кнопкам тулбаров
$toolbar = explode(' ', preg_replace('#s+#', ' ', $this->options['toolbar']));
$quickbars_selection_toolbar = !empty($this->options['quickbars_selection_toolbar']) ? explode(' ', preg_replace('#s+#', ' ', $this->options['quickbars_selection_toolbar'])) : [];
$quickbars_insert_toolbar = !empty($this->options['quickbars_insert_toolbar']) ? explode(' ', preg_replace('#s+#', ' ', $this->options['quickbars_insert_toolbar'])) : [];
foreach ($this->buttons_mapping as $pname => $buttons) {
if(is_numeric($pname)){
$pname = $buttons;
$buttons = [$pname];
}
if(in_array($pname, $this->options['plugins'])){
continue;
}
foreach ($buttons as $button) {
if(in_array($button, $toolbar)){
$this->options['plugins'][] = $pname;
}
if(in_array($button, $quickbars_selection_toolbar)){
$this->options['plugins'][] = $pname;
}
if(in_array($button, $quickbars_insert_toolbar)){
$this->options['plugins'][] = $pname;
}
}
}
$this->options['plugins'] = array_unique($this->options['plugins']);
if ($user->is_logged) {
$context = $core->getUriData();
$upload_params = ['csrf_token' => cmsForm::getCSRFToken()];
if($context['controller']){
$upload_params['target_controller'] = $context['controller'];
}
if($context['action']){
$upload_params['target_subject'] = mb_substr($context['action'], 0, 32);
}
if(strpos($core->uri, '/add/') === false && !empty($context['params'][1]) && is_numeric($context['params'][1])){
$upload_params['target_id'] = $context['params'][1];
}
$upload_params_string = '?'.http_build_query($upload_params);
$this->options['images_upload_url'] = href_to('images', 'upload_with_preset', ['file', $this->options['images_preset']]).$upload_params_string;
$this->options['image_list'] = href_to('files', 'files_list', ['image']).$upload_params_string;
if(!empty($this->options['allow_mime_types'])){
$allowed_mime_types = [];
foreach ($user->groups as $group_id) {
if(!empty($this->options['allow_mime_types'][$group_id])){
foreach ($this->options['allow_mime_types'][$group_id] as $mime_type) {
if(!in_array($mime_type, $allowed_mime_types)){
$allowed_mime_types[] = $mime_type;
}
}
}
}
if($allowed_mime_types){
unset($upload_params['csrf_token']);
cmsUser::sessionSet('ww_allowed_mime_types'.($upload_params ? ':'.implode(':', $upload_params) : ''), $allowed_mime_types);
$this->options['file_upload'] = [
'url' => href_to('files', 'upload_with_wysiwyg', ['inline_upload_file']).$upload_params_string
];
}
}
}
$this->options['smiles_url'] = href_to('typograph', 'get_smiles');
$this->options['plugins'] = implode(' ', $this->options['plugins']);
if(!empty($this->options['block_formats'])){
$block_formats = [];
foreach ($this->options['block_formats'] as $tag) {
$block_formats[] = $this->block_formats[$tag].'='.$tag.';';
}
$this->options['block_formats'] = implode(' ', $block_formats);
} else {
unset($this->options['block_formats']);
}
foreach ($this->options as $key => $value) {
if(!$value){
$this->options[$key] = false;
continue;
}
if($value === 1){
$this->options[$key] = true;
continue;
}
if(is_numeric($value)){
$this->options[$key] = intval($value);
continue;
}
}
}
public function displayEditor($field_id, $content = '', $config = []){
$this->loadRedactor();
$dom_id = str_replace(array('[',']'), array('_', ''), $field_id);
if($dom_id){
if(!empty($this->options['wysiwyg_toolbar'])){
echo '<div data-field_id="'.$dom_id.'" id="wysiwyg_toolbar_'.$dom_id.'" class="wysiwyg_toolbar_wrap">'.$this->options['wysiwyg_toolbar'].'</div>';
unset($this->options['wysiwyg_toolbar']);
}
echo html_textarea($field_id, $content, array('id' => $dom_id, 'class' => 'tinymce_redactor'));
}
ob_start(); ?>
<script type="text/javascript">
<?php if($dom_id){ ?>
tiny_global_options['field_<?php echo $dom_id; ?>'] = <?php echo json_encode($this->options); ?>;
$(function(){
init_tinymce('<?php echo $dom_id; ?>');
});
<?php } else { ?>
tiny_global_options['default'] = <?php echo json_encode($this->options); ?>;
<?php } ?>
</script>
<?php cmsTemplate::getInstance()->addBottom(ob_get_clean());
}
private function loadRedactor() {
if(self::$redactor_loaded){ return false; }
$template = cmsTemplate::getInstance();
$template->addJSFromContext('wysiwyg/tinymce/files/tinymce.min.js');
$template->addTplJSNameFromContext('files');
$template_css = $template->getTemplateStylesFileName('theme');
if($template_css){
$template_css = $template->getHeadFilePath($template_css);
}
ob_start(); ?>
<script type="text/javascript">
var tiny_global_options = {};
function init_tinymce (dom_id){
var tinymce_options = {};
if(tiny_global_options.hasOwnProperty('field_'+dom_id)){
tinymce_options = tiny_global_options['field_'+dom_id];
} else if(tiny_global_options.hasOwnProperty('default')) {
tinymce_options = tiny_global_options.default;
}
icms.files.url_delete = '<?php echo href_to('files', 'delete'); ?>';
tinymce_options.selector = '#'+dom_id;
tinymce_options.init_instance_callback = function (editor) {
editor.on('KeyDown', function (e) {
if ((e.keyCode === 8 || e.keyCode === 46) && editor.selection) {
var selectedNode = editor.selection.getNode();
if (selectedNode && selectedNode.nodeName === 'IMG' && !$(selectedNode).hasClass('smile_image') && confirm('<?php echo LANG_PARSER_IMAGE_DELETE; ?>')) {
icms.files.deleteByPath($(selectedNode).data('mce-src'));
}
}
});
};
<?php if($template_css){ ?>
tinymce_options.content_css = '<?php echo $template_css; ?>';
<?php } ?>
tinymce.init(tinymce_options);
icms.forms.addWysiwygsInsertPool(dom_id, function(field_element, text){
tinymce.activeEditor.setContent(text);
tinymce.activeEditor.focus();
});
icms.forms.addWysiwygsAddPool(dom_id, function(field_element, text){
tinymce.activeEditor.insertContent(text);
});
icms.forms.addWysiwygsInitPool(dom_id, function(field_element){
tinymce.remove('#'+field_element);
init_tinymce(field_element);
});
icms.forms.addWysiwygsSavePool(dom_id, function(field_element){
tinymce.activeEditor.save();
});
<?php //** Prevent bootstrap dialog from blocking focusin **/ ?>
$(document).on('focusin', function(e) {
if ($(e.target).closest(".tox-tinymce-aux, .moxman-window, .tam-assetmanager-root").length) {
e.stopImmediatePropagation();
}
});
}
</script>
<?php $template->addBottom(ob_get_clean());
self::$redactor_loaded = true;
}
public function getParams() {
$plugins = cmsCore::getDirsList('wysiwyg/tinymce/files/plugins', true);
$hidden_plugins = ['code'];
$buttons = $this->buttons;
$buttons_mapping = $this->buttons_mapping;
// убираем плагины, которые подключатся автоматически при назначении кнопок
foreach ($buttons_mapping as $plugin_name => $pbtns) {
if(is_numeric($plugin_name)){
$plugin_name = $pbtns;
$pbtns = [$plugin_name];
}
$key = array_search($plugin_name, $plugins);
if($key !== false){
unset($plugins[$key]);
}
foreach ($pbtns as $pbtn) {
$buttons[] = $pbtn;
}
}
// убираем скрытые плагины, которые включаются в самом классе редактора
foreach ($hidden_plugins as $hidden_plugin) {
$key = array_search($hidden_plugin, $plugins);
if($key !== false){
unset($plugins[$key]);
}
}
return cmsEventsManager::hook('wysiwyg_tinymce_form_options', [$plugins, $buttons, $this->quickbars_insert_buttons, $this->quickbars_selection_buttons, $this->block_formats]);
}
}