ConLite/conlite/external/edit_area/class.edit_area.php

264 Zeilen
9.6 KiB
PHP

<?php
/**
* $RCSfile$: class.edit_area.php
*
* Project:
* Contenido Content Management System Backend
*
* Description: This file defines class edit_area. This class allows to add edit_area to any page.
* This class renders a javascript code, which includes edit_area. It is possible to
* configure editarea whith a lot of params. For details see: http://www.cdolivet.net/editarea/
* editarea/docs/configuration.html Standard properties where set by this class. It is possible
* to set further properties in system or client settings in contenido by using type edit_area
* This properties where also imported by this class.
*
*
* @package Contenido Backend
* @version 1.0.0
* @author Timo Trautmann
* @copyright four for business AG <www.4fb.de>
* @license http://www.contenido.org/license/LIZENZ.txt
* @link http://www.4fb.de
* @since file available since 2008-05-07
*
* {@internal
* created 2008-05-07
* }}
*
* $Id$
*/
/**
*
* Description: Class for handling and displaying edit_area
*
* @version 1.0.0
* @author Timo Trautmann
* @copyright four for business AG <www.4fb.de>
*
* {@internal
* created 2008-05-07
* }}
*
*/
class EditArea {
/**
* Properties which were used to init edit_area
*
* @var array
* @access private
*/
var $aProperties;
/**
* HTML-ID of textarea which is replaced by edit_area
*
* @var string
* @access private
*/
var $sTextareaId;
/**
* defines if textarea is used or not (by system/client/user property)
*
* @var boolean
* @access private
*/
var $bActivated;
/**
* defines if js-script for edit_area is included on rendering process
*
* @var boolean
* @access private
*/
var $bAddScript;
/**
* The contenido configuration array
*
* @var array
* @access private
*/
var $aCfg;
/*################################################################*/
/**
* Constructor of EditArea initializes class variables
*
* @param string $sId - The id of textarea which is replaced by editor
* @param string $sSyntax - Name of syntax highlighting which is used (html, css, js, php, ...)
* @param string $sLang - lang which is used into editor. Notice NOT Contenido language id
* ex: de, en ... To get it from contenido language use:
* substr(strtolower($belang), 0, 2) in backend
* @param boolean $bAddScript - defines if edit_area script is included or not
* interesting when there is more than only one editor on page
* @param array $aCfg - The contenido configuration array
* @param boolean $bEditable - Optional defines if content is editable or not
*
* @access public
*/
function __construct($sId, $sSyntax, $sLang, $bAddScript, $aCfg, $bEditable = true) {
//datatype check
$sId = (string) $sId;
$sSyntax = (string) $sSyntax;
$aCfg = (array) $aCfg;
$sLang = (string) $sLang;
//init class variables
$this->aProperties = array();
$this->aCfg = $aCfg;
$this->bAddScript = $bAddScript;
$this->sTextareaId = $sId;
$this->bActivated = true;
//set standard properties for editor which were static or defined by constructor param
$this->setProperty('start_highlight', 'true', true);
$this->setProperty('allow_resize', 'both', false);
$this->setProperty('allow_toggle', 'false', true);
$this->setProperty('language', $sLang, false);
$this->setProperty('save_callback', 'save_callback', false);
$this->setProperty('syntax', $sSyntax, false);
$this->setProperty('replace_tab_by_spaces', '4', true);
$this->setProperty('plugins', 'charmap', false);
$this->setProperty('toolbar', 'save, search, go_to_line, fullscreen, |, undo, redo, |, select_font,|, change_smooth_selection, highlight, reset_highlight, |, charmap, |, help', false);
//make content not editable if not allowed
if ($bEditable == false) {
$this->setProperty('is_editable', 'false', true);
} else {
$this->setProperty('is_editable', 'true', true);
}
//internal function which appends more properties to $this->setProperty wich where defined
//by user or sysadmin in systemproperties / client settings / user settings ...
$this->getSystemProperties();
}
/**
* Function gets properties from contenido for edit_area and stores it into
* $this->setProperty so user is able to overwride standard settings or append
* other settings. Function also checks if edit_area is activated or deactivated
* by user
*
* @access private
*/
function getSystemProperties() {
//check if editor is disabled or enabled by user/admin
if (getEffectiveSetting("edit_area", "activated", "true") == "false") {
$this->bActivated = false;
}
$aUserSettings = getEffectiveSettingsByType("edit_area");
foreach ($aUserSettings as $sKey => $sValue) {
if ($sKey != 'activated') {
if ($sValue == "true" || $sValue == "false" || is_numeric($sValue)) {
$this->setProperty($sKey, $sValue, true);
} else {
$this->setProperty($sKey, $sValue, false);
}
}
}
}
/**
* Function for setting a property for edit_area to $this->setProperty
* existing properties were overwritten
*
* @param string $sName - Name of edit_area property
* @param string $sValue - Value of edit_area property
* @param boolean $bIsNumeric - Defines if value is numeric or not
* in case of a numeric value, there is no need to use
* quotes
*
* @access public
*/
function setProperty($sName, $sValue, $bIsNumeric) {
//datatype check
$sName = (string) $sName;
$sValue = (string) $sValue;
$bIsNumeric = (boolean) $bIsNumeric;
//generate a new array for new property
$aRecord = array();
$aRecord['name'] = $sName;
$aRecord['value'] = $sValue;
$aRecord['is_numeric'] = $bIsNumeric;
//append it to class variable $this->aProperties
//when key already exists, overwride it
$this->aProperties[$sName] = $aRecord;
}
/**
* Function renders js_script for inclusion into an header of a html file
*
* @return string - js_script for edit_area
* @access public
*/
function renderScript() {
//if editor is disabled, there is no need to render this script
if ($this->bActivated == false) {
return '';
}
//if external js file for editor should be included, do this here
$sJs = '';
if ($this->bAddScript) {
$sPath = $this->aCfg['path']['contenido_fullhtml'];
$sJs .= '<script type="text/javascript" src="'.$sPath.'external/edit_area/edit_area_compressor_cl.php?plugins"></script>'."\n";
$sJs .= '<script type="text/javascript">
function save_callback(id, content) {
var oForm = document.getElementById(id).form;
for (var i = 0; i < oForm.length; ++i) {
var element = oForm.elements[i];
if((element.id && editAreaLoader.getValue(element.id)) || (element.id == id)) {
element.value = editAreaLoader.getValue(element.id);
}
}
oForm.submit();
}
</script>';
}
//define template for edit_area script
$sJs .= '<script type="text/javascript">
function init_editarea_%s() {
var oTextarea = document.getElementById("%s")
if (!oTextarea) {
window.setTimeout("init_editarea_%s()", 50);
} else {
if (navigator.userAgent.indexOf("MSIE") > -1) {
var width = oTextarea.offsetWidth;
oTextarea.style.width = width+"px";
}
editAreaLoader.init({
id: "%s"
%s
})
}
}
window.setTimeout("init_editarea_%s()", 50);
</script>';
//get all stored properties and convert it in order to insert it into edit_area js template
$sProperties = '';
foreach ($this->aProperties as $aProperty) {
if ($aProperty['is_numeric'] == true) {
$sProperties .= ', '.$aProperty['name'].':'.$aProperty['value']."\n";
} else {
$sProperties .= ', '.$aProperty['name'].': "'.$aProperty['value']."\"\n";
}
}
//fill js template, using sprintf
$sTextareaId = $this->sTextareaId;
$sJsResult = sprintf($sJs, $sTextareaId, $sTextareaId, $sTextareaId, $sTextareaId, $sProperties, $sTextareaId);
return $sJsResult;
}
}
?>