Вход Регистрация
Файл: library/XenForo/ViewPublic/Helper/Editor.php
Строк: 119
<?php

abstract class XenForo_ViewPublic_Helper_Editor
{
    
/**
     * Array of editor IDs already used, prevents duplicate IDs.
     *
     * @var array
     */
    
protected static $_editorIds = array();

    
/**
     * Gets the editor template. The WYSIWYG editor will be used if supported by
     * the browser.
     *
     * @param XenForo_View $view
     * @param string $formCtrlName Name of the textarea. If using the WYSIWYG editor, this will have _html appended to it.
     * @param string $message Default message to put in editor. This should contain BB code
     * @param array $editorOptions Array of options for the editor. Defaults are provided for any unspecified
     *     Currently supported:
     *         editorId - (string) override normal {formCtrlName}_html id
     *         templateName - (string) override normal 'editor' name
     *         disable - (boolean) true to prevent WYSIWYG from activating
     *         json - (array) JSON options to be passed to the JS
     *
     * @return XenForo_Template_Abstract
     */
    
public static function getEditorTemplate(XenForo_View $view$formCtrlName$message '', array $editorOptions = array())
    {
        
$messageHtml '';

        if (!empty(
$editorOptions['disable']))
        {
            
$showWysiwyg false;
        }
        else if (!
XenForo_Visitor::getInstance()->enable_rte)
        {
            
$showWysiwyg false;
        }
        else
        {
            
$showWysiwyg self::supportsRichTextEditor();
        }

        
$draftOption XenForo_Application::getOptions()->saveDrafts;
        if (empty(
$draftOption['enabled']))
        {
            unset(
$editorOptions['autoSaveUrl']);
        }
        else if (!empty(
$editorOptions['autoSaveUrl']) && !isset($editorOptions['json']['autoSaveFrequency']))
        {
            
$editorOptions['json']['autoSaveFrequency'] = $draftOption['saveFrequency'];
        }

        if (empty(
$editorOptions['templateName']))
        {
            
$editorOptions['templateName'] = 'editor';
        }
        if (!isset(
$editorOptions['height']))
        {
            
$editorOptions['height'] = '260px';
        }

        if (!isset(
$editorOptions['json']['bbCodes']))
        {
            if (
XenForo_Application::isRegistered('bbCode'))
            {
                
$bbCodeCache XenForo_Application::get('bbCode');
            }
            else
            {
                
$bbCodeCache XenForo_Model::create('XenForo_Model_BbCode')->getBbCodeCache();
                
XenForo_Application::set('bbCode'$bbCodeCache);
            }

            
$bbCodes = array();
            if (!empty(
$bbCodeCache['bbCodes']))
            {
                foreach (
$bbCodeCache['bbCodes'] AS $bbCodeTag => $bbCode)
                {
                    if (!
$bbCode['editor_icon_url'])
                    {
                        continue;
                    }

                    
$bbCodes[$bbCodeTag] = array(
                        
'title' => new XenForo_Phrase('custom_bb_code_' $bbCodeTag '_title'),
                        
'hasOption' => $bbCode['has_option']
                    );
                }
            }

            
$editorOptions['json']['bbCodes'] = $bbCodes;
        }

        
XenForo_CodeEvent::fire('editor_setup', array($view$formCtrlName, &$message, &$editorOptions, &$showWysiwyg));

        if (
$showWysiwyg)
        {
            if (
substr($formCtrlName, -1) == ']')
            {
                
$formCtrlNameHtml substr($formCtrlName0, -1) . '_html]';
            }
            else
            {
                
$formCtrlNameHtml $formCtrlName '_html';
            }

            if (
$message !== '')
            {
                
$bbCodeParser XenForo_BbCode_Parser::create(XenForo_BbCode_Formatter_Base::create('Wysiwyg', array('view' => $view)));
                
$messageHtml $bbCodeParser->render($message, array('lightBox' => false));
            }
        }
        else
        {
            
$formCtrlNameHtml $formCtrlName;
        }

        
// get editor id
        
if (isset($editorOptions['editorId']))
        {
            
$editorId $editorOptions['editorId'];
        }
        else
        {
            
$ctrlInc 0;

            do
            {
                
$editorId 'ctrl_' $formCtrlName . ($ctrlInc "_$ctrlInc'');
                
$ctrlInc++;
            }
            while (isset(
self::$_editorIds[$editorId]) && $ctrlInc 100);

            
self::$_editorIds[$editorId] = true;
        }

        return 
$view->createTemplateObject($editorOptions['templateName'], array(
            
'showWysiwyg' => $showWysiwyg,
            
'height' => $editorOptions['height'],
            
'formCtrlNameHtml' => $formCtrlNameHtml,
            
'formCtrlName' => $formCtrlName,
            
'editorId' => $editorId,

            
'message' => $message,
            
'messageHtml' => $messageHtml,

            
'editorOptions' => $editorOptions,
        ));
    }

    public static function 
supportsRichTextEditor()
    {
        
$showWysiwyg true;
        if (!empty(
$_SERVER['HTTP_USER_AGENT']))
        {
            if (
preg_match('#blackberry#i'$_SERVER['HTTP_USER_AGENT']))
            {
                
// this should match BB 7 and earlier - v10 uses "BB10"
                
$showWysiwyg false;
            }
            else if (
preg_match('#opera mini|opera mobi#i'$_SERVER['HTTP_USER_AGENT']))
            {
                
$showWysiwyg false;
            }
            else if (
preg_match('#iphone|ipod|ipad#i'$_SERVER['HTTP_USER_AGENT']))
            {
                if (
preg_match('#OS (d+)_(d+)#'$_SERVER['HTTP_USER_AGENT'], $match))
                {
                    
// contenteditable support in 5.0
                    
$showWysiwyg intval($match[1]) >= 5;
                }
            }
            else if (
                
preg_match('#android (d+).(d+)#i'$_SERVER['HTTP_USER_AGENT'], $match)
                && !
preg_match('#chrome/#i'$_SERVER['HTTP_USER_AGENT'])
            )
            {
                
// contenteditable support in 3.0
                
$showWysiwyg intval($match[1]) >= 3;
            }
            else if (
                
preg_match('#msie (d+)#i'$_SERVER['HTTP_USER_AGENT'], $match)
            )
            {
                
// disable the wysiwyg for IE6 and 7
                
$showWysiwyg intval($match[1]) >= 8;
            }
        }

        return 
$showWysiwyg;
    }

    public static function 
getQuickReplyEditor(XenForo_View $view$formCtrlName$message '', array $editorOptions = array())
    {
        
$editorOptions['height'] = false;

        return 
self::getEditorTemplate($view$formCtrlName$message$editorOptions);
    }
}
Онлайн: 1
Реклама