From 4edf006e64d279f8a3f949a2a9c49ad2743ab1c0 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Thu, 5 Feb 2009 20:11:10 +0100 Subject: [PATCH] [svn r18257] FS#2867: FCKEditor: Adding a settings calculation mechanism for editor's instancies that are not covered by formvalidator module. --- main/inc/lib/fckeditor/fckeditor_php4.php | 6 +- .../lib/fckeditor/fckeditor_php4_original.php | 262 +++++++++++++++++ main/inc/lib/fckeditor/fckeditor_php5.php | 270 +++++++++++++++++- .../lib/fckeditor/fckeditor_php5_original.php | 257 +++++++++++++++++ .../lib/formvalidator/Element/html_editor.php | 4 +- 5 files changed, 791 insertions(+), 8 deletions(-) create mode 100644 main/inc/lib/fckeditor/fckeditor_php4_original.php create mode 100644 main/inc/lib/fckeditor/fckeditor_php5_original.php diff --git a/main/inc/lib/fckeditor/fckeditor_php4.php b/main/inc/lib/fckeditor/fckeditor_php4.php index dae4cf320d..feab27d8fa 100644 --- a/main/inc/lib/fckeditor/fckeditor_php4.php +++ b/main/inc/lib/fckeditor/fckeditor_php4.php @@ -143,9 +143,9 @@ class FCKeditor * Display FCKeditor. * */ - function Create() + function Create($called_by_formvalidator = false) { - echo $this->CreateHtml() ; + echo $this->CreateHtml($called_by_formvalidator) ; } /** @@ -153,7 +153,7 @@ class FCKeditor * * @return string */ - function CreateHtml() + function CreateHtml($called_by_formvalidator = false) { $HtmlValue = htmlspecialchars( $this->Value ) ; diff --git a/main/inc/lib/fckeditor/fckeditor_php4_original.php b/main/inc/lib/fckeditor/fckeditor_php4_original.php new file mode 100644 index 0000000000..dae4cf320d --- /dev/null +++ b/main/inc/lib/fckeditor/fckeditor_php4_original.php @@ -0,0 +1,262 @@ += 5.5) ; + } + else if ( strpos($sAgent, 'Gecko/') !== false ) + { + $iVersion = (int)substr($sAgent, strpos($sAgent, 'Gecko/') + 6, 8) ; + return ($iVersion >= 20030210) ; + } + else if ( strpos($sAgent, 'Opera/') !== false ) + { + $fVersion = (float)substr($sAgent, strpos($sAgent, 'Opera/') + 6, 4) ; + return ($fVersion >= 9.5) ; + } + else if ( preg_match( "|AppleWebKit/(\d+)|i", $sAgent, $matches ) ) + { + $iVersion = $matches[1] ; + return ( $matches[1] >= 522 ) ; + } + else + return false ; +} + +class FCKeditor +{ + /** + * Name of the FCKeditor instance. + * + * @access protected + * @var string + */ + var $InstanceName ; + /** + * Path to FCKeditor relative to the document root. + * + * @var string + */ + var $BasePath ; + /** + * Width of the FCKeditor. + * Examples: 100%, 600 + * + * @var mixed + */ + var $Width ; + /** + * Height of the FCKeditor. + * Examples: 400, 50% + * + * @var mixed + */ + var $Height ; + /** + * Name of the toolbar to load. + * + * @var string + */ + var $ToolbarSet ; + /** + * Initial value. + * + * @var string + */ + var $Value ; + /** + * This is where additional configuration can be passed. + * Example: + * $oFCKeditor->Config['EnterMode'] = 'br'; + * + * @var array + */ + var $Config ; + + /** + * Main Constructor. + * Refer to the _samples/php directory for examples. + * + * @param string $instanceName + */ + function FCKeditor( $instanceName ) + { + $this->InstanceName = $instanceName ; + $this->BasePath = '/fckeditor/' ; + $this->Width = '100%' ; + $this->Height = '200' ; + $this->ToolbarSet = 'Default' ; + $this->Value = '' ; + + $this->Config = array() ; + } + + /** + * Display FCKeditor. + * + */ + function Create() + { + echo $this->CreateHtml() ; + } + + /** + * Return the HTML code required to run FCKeditor. + * + * @return string + */ + function CreateHtml() + { + $HtmlValue = htmlspecialchars( $this->Value ) ; + + $Html = '' ; + + if ( !isset( $_GET ) ) { + global $HTTP_GET_VARS ; + $_GET = $HTTP_GET_VARS ; + } + + if ( $this->IsCompatible() ) + { + if ( isset( $_GET['fcksource'] ) && $_GET['fcksource'] == "true" ) + $File = 'fckeditor.original.html' ; + else + $File = 'fckeditor.html' ; + + $Link = "{$this->BasePath}editor/{$File}?InstanceName={$this->InstanceName}" ; + + if ( $this->ToolbarSet != '' ) + $Link .= "&Toolbar={$this->ToolbarSet}" ; + + // Render the linked hidden field. + $Html .= "InstanceName}\" name=\"{$this->InstanceName}\" value=\"{$HtmlValue}\" style=\"display:none\" />" ; + + // Render the configurations hidden field. + $Html .= "InstanceName}___Config\" value=\"" . $this->GetConfigFieldString() . "\" style=\"display:none\" />" ; + + // Render the editor IFRAME. + $Html .= "" ; + } + else + { + if ( strpos( $this->Width, '%' ) === false ) + $WidthCSS = $this->Width . 'px' ; + else + $WidthCSS = $this->Width ; + + if ( strpos( $this->Height, '%' ) === false ) + $HeightCSS = $this->Height . 'px' ; + else + $HeightCSS = $this->Height ; + + $Html .= "" ; + } + + return $Html ; + } + + /** + * Returns true if browser is compatible with FCKeditor. + * + * @return boolean + */ + function IsCompatible() + { + return FCKeditor_IsCompatibleBrowser() ; + } + + /** + * Get settings from Config array as a single string. + * + * @access protected + * @return string + */ + function GetConfigFieldString() + { + $sParams = '' ; + $bFirst = true ; + + foreach ( $this->Config as $sKey => $sValue ) + { + if ( $bFirst == false ) + $sParams .= '&' ; + else + $bFirst = false ; + + if ( $sValue === true ) + $sParams .= $this->EncodeConfig( $sKey ) . '=true' ; + else if ( $sValue === false ) + $sParams .= $this->EncodeConfig( $sKey ) . '=false' ; + else + $sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $sValue ) ; + } + + return $sParams ; + } + + /** + * Encode characters that may break the configuration string + * generated by GetConfigFieldString(). + * + * @access protected + * @param string $valueToEncode + * @return string + */ + function EncodeConfig( $valueToEncode ) + { + $chars = array( + '&' => '%26', + '=' => '%3D', + '"' => '%22' ) ; + + return strtr( $valueToEncode, $chars ) ; + } +} diff --git a/main/inc/lib/fckeditor/fckeditor_php5.php b/main/inc/lib/fckeditor/fckeditor_php5.php index 939bfc9956..2318029c4d 100644 --- a/main/inc/lib/fckeditor/fckeditor_php5.php +++ b/main/inc/lib/fckeditor/fckeditor_php5.php @@ -25,6 +25,8 @@ * instances in PHP pages on server side. */ +// Code to adapt the editor to the Dokeos LMS has been added by Ivan Tcholakov, FEB-2009. + /** * Check if browser is compatible with FCKeditor. * Return true if is compatible. @@ -143,9 +145,9 @@ class FCKeditor * Display FCKeditor. * */ - public function Create() + public function Create($called_by_formvalidator = false) { - echo $this->CreateHtml() ; + echo $this->CreateHtml($called_by_formvalidator) ; } /** @@ -153,8 +155,270 @@ class FCKeditor * * @return string */ - public function CreateHtml() + public function CreateHtml($called_by_formvalidator = false) { + // Adaptation for the Dokeos LMS. + + // Default configuration settings will be calculated when the editor + // is (still) created directly, without using the formvalidator module. + // These default settings might not cover all possible cases. + + if (!$called_by_formvalidator) + { + global $language_interface; + + $this->BasePath = api_get_path(REL_PATH).'main/inc/lib/fckeditor/'; + + @ $editor_lang = Database :: get_language_isocode($language_interface); + $language_file = api_get_path(SYS_PATH).'main/inc/lib/fckeditor/editor/lang/'.$editor_lang.'.js'; + if (empty ($editor_lang) || !file_exists($language_file)) + { + //if there was no valid iso-code, use the english one + $editor_lang = 'en'; + } + + $TBL_LANGUAGES = Database::get_main_table(TABLE_MAIN_LANGUAGE); + + // We are in a course + if (isset($_SESSION["_course"]["language"])) { + $sql = "SELECT isocode FROM ".$TBL_LANGUAGES." WHERE english_name='".$_SESSION["_course"]["language"]."'"; + } elseif (isset($_SESSION["_user"]["language"])) { + //Else, we get the current session language + $sql = "SELECT isocode FROM ".$TBL_LANGUAGES." WHERE english_name='".$_SESSION["_user"]["language"]."'"; + } else { + //Else we get the default platform language + $platform_language = api_get_setting("platformLanguage"); + $sql = "SELECT isocode FROM ".$TBL_LANGUAGES." WHERE english_name='$platform_language'"; + } + + $result_sql = api_sql_query($sql, __FILE__, __LINE__); + $isocode_language = Database::result($result_sql, 0, 0); + $this->Config['DefaultLanguage'] = $isocode_language; + + // css should be dokeos ones + $this->Config['EditorAreaCSS'] = $this->Config['ToolbarComboPreviewCSS'] = api_get_path(REL_PATH).'main/css/'.api_get_setting('stylesheets').'/default.css'; + + // Default configuration settings for document repositories. + + // Preliminary calculations for assembling required paths. + $script_name = substr($_SERVER['PHP_SELF'], strlen(api_get_path(REL_PATH))); + $script_path = explode('/', $script_name); + $script_path[count($script_path) - 1] = ''; + if (api_is_in_course()) + { + $relative_path_prefix = str_repeat('../', count($script_path) - 1); + } + else + { + $relative_path_prefix = str_repeat('../', count($script_path) - 2); + } + $script_path = implode('/', $script_path); + $script_path = api_get_path(WEB_PATH).$script_path; + + $use_advanced_filemanager = api_get_setting('advanced_filemanager') == 'true'; + + if (api_is_in_course()) + { + if (!api_is_in_group()) + { + // 1. We are inside a course and not in a group. + + if (api_is_allowed_to_edit()) + { + // 1.1. Teacher (tutor and coach are not authorized to change anything in the "content creation" tools) + + if (empty($this->Config['CreateDocumentWebDir'])) + { + $this->Config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document/'; + } + + if (is_null($this->Config['CreateDocumentDir'])) + { + $this->Config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/'; + } + + if (empty($this->Config['BaseHref'])) + { + $this->Config['BaseHref'] = $script_path; + } + + $upload_path = api_get_path(REL_COURSE_PATH).api_get_course_path().'/document/'; + } + else + { + // 1.2. Student + + if (empty($this->Config['CreateDocumentWebDir'])) + { + $this->Config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document/shared_folder/'.api_get_user_id().'/'; + } + + if (is_null($this->Config['CreateDocumentDir'])) + { + $this->Config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/shared_folder/'.api_get_user_id().'/'; + } + + if (empty($this->Config['BaseHref'])) + { + $this->Config['BaseHref'] = $script_path; + } + + $upload_path = api_get_path(REL_COURSE_PATH).api_get_course_path().'/document/shared_folder/'.api_get_user_id().'/'; + } + } + else + { + // 2. Inside a course and inside a group. + + global $group_properties; + + if (empty($this->Config['CreateDocumentWebDir'])) + { + $this->Config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document'.$group_properties['directory'].'/'; + } + + if (is_null($this->Config['CreateDocumentDir'])) + { + $this->Config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document'.$group_properties['directory'].'/'; + } + + if (empty($this->Config['BaseHref'])) + { + $this->Config['BaseHref'] = $script_path; + } + + $upload_path = api_get_path(REL_COURSE_PATH).api_get_course_path().'/document'.$group_properties['directory'].'/'; + } + } + else + { + if (api_is_platform_admin() && $_SESSION['this_section'] == 'platform_admin') + { + // 3. Platform administration activities. + + if (empty($this->Config['CreateDocumentWebDir'])) + { + $this->Config['CreateDocumentWebDir'] = api_get_path(WEB_PATH).'home/default_platform_document/'; + } + + if (is_null($this->Config['CreateDocumentDir'])) + { + $this->Config['CreateDocumentDir'] = api_get_path(WEB_PATH).'home/default_platform_document/'; // A side-effect is in use here. + } + + if (empty($this->Config['BaseHref'])) + { + $this->Config['BaseHref'] = api_get_path(WEB_PATH).'home/default_platform_document/'; + } + + $upload_path = api_get_path(REL_PATH).'home/default_platform_document/'; + } + else + { + // 4. The user is outside courses. + + if (empty($this->Config['CreateDocumentWebDir'])) + { + $this->Config['CreateDocumentWebDir'] = api_get_path('WEB_PATH').'main/upload/users/'.api_get_user_id().'/my_files/'; + } + + if (is_null($this->Config['CreateDocumentDir'])) + { + $this->Config['CreateDocumentDir'] = $relative_path_prefix.'upload/users/'.api_get_user_id().'/my_files/'; + } + + if (empty($this->Config['BaseHref'])) + { + $this->Config['BaseHref'] = $script_path; + } + + $upload_path = api_get_path(REL_PATH).'main/upload/users/'.api_get_user_id().'/my_files/'; + } + } + + // Setting hyperlinks used to call file managers. + + if ($use_advanced_filemanager) + { + // Let javascripts "know" which file manager has been chosen. + $this->Config['AdvancedFileManager'] = true; + + // Configuration path when advanced file manager is used. + $this->Config['CustomConfigurationsPath'] = api_get_path(REL_PATH)."main/inc/lib/fckeditor/myconfig_afm.js"; + + // URLs for opening the file browser for different resource types (file types): + + // for images + $this->Config['ImageBrowserURL'] = $this->BasePath.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php'; + + // for flash + $this->Config['FlashBrowserURL'] = $this->BasePath.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php'; + + // for audio files (mp3) + $this->Config['MP3BrowserURL'] = $this->BasePath.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php'; + + // for videos + $this->Config['VideoBrowserURL'] = $this->BasePath.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php'; + + // for videos (flv) + $this->Config['MediaBrowserURL'] = $this->BasePath.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php'; + + // for links (any resource type) + $this->Config['LinkBrowserURL'] = $this->BasePath.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php'; + } + else + { + // Passing the file manager setting to javascripts too. + $this->Config['AdvancedFileManager'] = false; + + // Configuration path when simple file manager is used. + $this->Config['CustomConfigurationsPath'] = api_get_path(REL_PATH)."main/inc/lib/fckeditor/myconfig.js"; + + // URLs for opening the file browser for different resource types (file types): + + // for images + $this->Config['ImageBrowserURL'] = $this->BasePath . "editor/filemanager/browser/default/browser.html?Type=Images&Connector=connectors/php/connector.php&ServerPath=$upload_path"; + + // for flash + $this->Config['FlashBrowserURL'] = $this->BasePath . "editor/filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/php/connector.php&ServerPath=$upload_path"; + + // for audio files (mp3) + $this->Config['MP3BrowserURL'] = $this->BasePath . "editor/filemanager/browser/default/browser.html?Type=MP3&Connector=connectors/php/connector.php&ServerPath=$upload_path"; + + // for videos + $this->Config['VideoBrowserURL'] = $this->BasePath . "editor/filemanager/browser/default/browser.html?Type=Video&Connector=connectors/php/connector.php&ServerPath=$upload_path"; + + // for videos (flv) + $this->Config['MediaBrowserURL'] = $this->BasePath . "editor/filemanager/browser/default/browser.html?Type=Video/flv&Connector=connectors/php/connector.php&ServerPath=$upload_path"; + + // for links (any resource type) + $this->Config['LinkBrowserURL'] = $this->BasePath . "editor/filemanager/browser/default/browser.html?Type=File&Connector=connectors/php/connector.php&ServerPath=$upload_path"; + } + + // URLs for making quick uplods for different resource types (file types). + // These URLs are used by the dialogs' quick upload tabs: + + // for images + $this->Config['ImageUploadURL'] = $this->BasePath . "editor/filemanager/upload/php/upload.php?Type=Images&ServerPath=$upload_path" ; + + // for flash + $this->Config['FlashUploadURL'] = $this->BasePath . "editor/filemanager/upload/php/upload.php?Type=Flash&ServerPath=$upload_path" ; + + // for audio files (mp3) + $this->Config['MP3UploadURL'] = $this->BasePath . "editor/filemanager/upload/php/upload.php?Type=MP3&ServerPath=$upload_path" ; + + // for videos + $this->Config['VideoUploadURL'] = $this->BasePath . "editor/filemanager/upload/php/upload.php?Type=Video&ServerPath=$upload_path" ; + + // for videos (flv) + $this->Config['MediaUploadURL'] = $this->BasePath . "editor/filemanager/upload/php/upload.php?Type=Video/flv&ServerPath=$upload_path" ; + + // for links (any resource type) + $this->Config['LinkUploadURL'] = $this->BasePath . "editor/filemanager/upload/php/upload.php?Type=File&ServerPath=$upload_path" ; + } + + // The original code starts from here. + $HtmlValue = htmlspecialchars( $this->Value ) ; $Html = '' ; diff --git a/main/inc/lib/fckeditor/fckeditor_php5_original.php b/main/inc/lib/fckeditor/fckeditor_php5_original.php new file mode 100644 index 0000000000..939bfc9956 --- /dev/null +++ b/main/inc/lib/fckeditor/fckeditor_php5_original.php @@ -0,0 +1,257 @@ += 5.5) ; + } + else if ( strpos($sAgent, 'Gecko/') !== false ) + { + $iVersion = (int)substr($sAgent, strpos($sAgent, 'Gecko/') + 6, 8) ; + return ($iVersion >= 20030210) ; + } + else if ( strpos($sAgent, 'Opera/') !== false ) + { + $fVersion = (float)substr($sAgent, strpos($sAgent, 'Opera/') + 6, 4) ; + return ($fVersion >= 9.5) ; + } + else if ( preg_match( "|AppleWebKit/(\d+)|i", $sAgent, $matches ) ) + { + $iVersion = $matches[1] ; + return ( $matches[1] >= 522 ) ; + } + else + return false ; +} + +class FCKeditor +{ + /** + * Name of the FCKeditor instance. + * + * @access protected + * @var string + */ + public $InstanceName ; + /** + * Path to FCKeditor relative to the document root. + * + * @var string + */ + public $BasePath ; + /** + * Width of the FCKeditor. + * Examples: 100%, 600 + * + * @var mixed + */ + public $Width ; + /** + * Height of the FCKeditor. + * Examples: 400, 50% + * + * @var mixed + */ + public $Height ; + /** + * Name of the toolbar to load. + * + * @var string + */ + public $ToolbarSet ; + /** + * Initial value. + * + * @var string + */ + public $Value ; + /** + * This is where additional configuration can be passed. + * Example: + * $oFCKeditor->Config['EnterMode'] = 'br'; + * + * @var array + */ + public $Config ; + + /** + * Main Constructor. + * Refer to the _samples/php directory for examples. + * + * @param string $instanceName + */ + public function __construct( $instanceName ) + { + $this->InstanceName = $instanceName ; + $this->BasePath = '/fckeditor/' ; + $this->Width = '100%' ; + $this->Height = '200' ; + $this->ToolbarSet = 'Default' ; + $this->Value = '' ; + + $this->Config = array() ; + } + + /** + * Display FCKeditor. + * + */ + public function Create() + { + echo $this->CreateHtml() ; + } + + /** + * Return the HTML code required to run FCKeditor. + * + * @return string + */ + public function CreateHtml() + { + $HtmlValue = htmlspecialchars( $this->Value ) ; + + $Html = '' ; + + if ( $this->IsCompatible() ) + { + if ( isset( $_GET['fcksource'] ) && $_GET['fcksource'] == "true" ) + $File = 'fckeditor.original.html' ; + else + $File = 'fckeditor.html' ; + + $Link = "{$this->BasePath}editor/{$File}?InstanceName={$this->InstanceName}" ; + + if ( $this->ToolbarSet != '' ) + $Link .= "&Toolbar={$this->ToolbarSet}" ; + + // Render the linked hidden field. + $Html .= "InstanceName}\" name=\"{$this->InstanceName}\" value=\"{$HtmlValue}\" style=\"display:none\" />" ; + + // Render the configurations hidden field. + $Html .= "InstanceName}___Config\" value=\"" . $this->GetConfigFieldString() . "\" style=\"display:none\" />" ; + + // Render the editor IFRAME. + $Html .= "" ; + } + else + { + if ( strpos( $this->Width, '%' ) === false ) + $WidthCSS = $this->Width . 'px' ; + else + $WidthCSS = $this->Width ; + + if ( strpos( $this->Height, '%' ) === false ) + $HeightCSS = $this->Height . 'px' ; + else + $HeightCSS = $this->Height ; + + $Html .= "" ; + } + + return $Html ; + } + + /** + * Returns true if browser is compatible with FCKeditor. + * + * @return boolean + */ + public function IsCompatible() + { + return FCKeditor_IsCompatibleBrowser() ; + } + + /** + * Get settings from Config array as a single string. + * + * @access protected + * @return string + */ + public function GetConfigFieldString() + { + $sParams = '' ; + $bFirst = true ; + + foreach ( $this->Config as $sKey => $sValue ) + { + if ( $bFirst == false ) + $sParams .= '&' ; + else + $bFirst = false ; + + if ( $sValue === true ) + $sParams .= $this->EncodeConfig( $sKey ) . '=true' ; + else if ( $sValue === false ) + $sParams .= $this->EncodeConfig( $sKey ) . '=false' ; + else + $sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $sValue ) ; + } + + return $sParams ; + } + + /** + * Encode characters that may break the configuration string + * generated by GetConfigFieldString(). + * + * @access protected + * @param string $valueToEncode + * @return string + */ + public function EncodeConfig( $valueToEncode ) + { + $chars = array( + '&' => '%26', + '=' => '%3D', + '"' => '%22' ) ; + + return strtr( $valueToEncode, $chars ) ; + } +} diff --git a/main/inc/lib/formvalidator/Element/html_editor.php b/main/inc/lib/formvalidator/Element/html_editor.php index 2ca3b267c3..4a45a07c38 100644 --- a/main/inc/lib/formvalidator/Element/html_editor.php +++ b/main/inc/lib/formvalidator/Element/html_editor.php @@ -1,5 +1,5 @@ fck_editor->Value = $this->getValue(); - $result .=$this -> fck_editor->CreateHtml(); + $result .= $this -> fck_editor->CreateHtml(true); //Add a link to open the allowed html tags window //$result .= ''.get_lang('AllowedHTMLTags').'';