mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
1e0c4ae8d1
Conflicts: cache/Cache.php cli/CliController.php core/Convert.php core/Core.php core/ManifestBuilder.php core/Object.php core/SSViewer.php core/control/ContentController.php core/control/ContentNegotiator.php core/control/FormResponse.php core/control/RequestHandler.php core/control/SilverStripeNavigatorItem.php core/i18n.php core/i18nTextCollector.php core/model/DataObjectSet.php core/model/Hierarchy.php core/model/Image.php core/model/MySQLDatabase.php core/model/SiteConfig.php core/model/SiteTree.php core/model/Translatable.php core/model/VirtualPage.php dev/Debug.php dev/SapphireTest.php dev/TestRunner.php dev/YamlFixture.php dev/install/MySQLDatabaseConfigurationHelper.php docs/en/installation/from-source.md docs/en/topics/themes.md docs/en/tutorials/4-site-search.md email/Mailer.php filesystem/File.php filesystem/Folder.php forms/ComplexTableField.php forms/CurrencyField.php forms/DateField.php forms/FieldSet.php forms/FileField.php forms/FileIFrameField.php forms/HtmlEditorConfig.php forms/HtmlEditorField.php forms/SelectionGroup.php forms/SimpleImageField.php forms/TabSet.php forms/TableField.php forms/TableListField.php forms/TreeDropdownField.php forms/TreeMultiselectField.php integration/Geoip.php javascript/SelectionGroup.js javascript/TreeSelectorField.js javascript/UpdateURL.js javascript/core/jquery.ondemand.js javascript/tiny_mce_improvements.js javascript/tree/tree.js lang/en_US.php search/ContentControllerSearchExtension.php security/Group.php security/Member.php security/PermissionCheckboxSetField.php security/PermissionRole.php security/Security.php static-main.php templates/RelationComplexTableField.ss templates/TableListField.ss tests/ConvertTest.php tests/DataObjectSetTest.php tests/DataObjectTest.php tests/DataObjectTest.yml tests/RequestHandlingTest.php tests/SSViewerTest.php tests/SiteTreePermissionsTest.php tests/SiteTreeTest.php tests/TransactionTest.php tests/api/RestfulServiceTest.php tests/control/DirectorTest.php tests/control/ModelAsControllerTest.php tests/fieldtypes/WidgetAreaEditorTest.php tests/forms/CurrencyFieldTest.php tests/forms/FormTest.php tests/model/DatabaseTest.php tests/model/ImageTest.php tests/search/ContentControllerSearchExtensionTest.php tests/security/MemberAuthenticatorTest.php thirdparty/.gitignore thirdparty/behaviour/behaviour.js thirdparty/firebug-lite/firebug.js thirdparty/firebug-lite/firebugx.js thirdparty/jquery-form/jquery.form.js thirdparty/jquery-livequery/jquery.livequery.js thirdparty/jquery-livequery/test/jquery.js thirdparty/jquery-livequery/test/test.html thirdparty/jquery-livequery/test/test2.html thirdparty/jquery-metadata/META.json thirdparty/jquery-metadata/README thirdparty/jquery-metadata/jquery.metadata.js thirdparty/jquery-metadata/test/index.html thirdparty/jquery-metadata/test/jquery.js thirdparty/jquery-metadata/test/test.js thirdparty/jquery-metadata/test/testrunner.js thirdparty/jquery-metadata/test/testsuite.css thirdparty/jquery-ui-themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_222222_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_2e83ff_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_454545_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_888888_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_cd0a0a_256x240.png thirdparty/jquery-ui/i18n/jquery-ui-i18n.js thirdparty/jquery-ui/i18n/ui.datepicker-ar.js thirdparty/jquery-ui/i18n/ui.datepicker-bg.js thirdparty/jquery-ui/i18n/ui.datepicker-ca.js thirdparty/jquery-ui/i18n/ui.datepicker-cs.js thirdparty/jquery-ui/i18n/ui.datepicker-da.js thirdparty/jquery-ui/i18n/ui.datepicker-de.js thirdparty/jquery-ui/i18n/ui.datepicker-el.js thirdparty/jquery-ui/i18n/ui.datepicker-eo.js thirdparty/jquery-ui/i18n/ui.datepicker-es.js thirdparty/jquery-ui/i18n/ui.datepicker-fa.js thirdparty/jquery-ui/i18n/ui.datepicker-fi.js thirdparty/jquery-ui/i18n/ui.datepicker-fr.js thirdparty/jquery-ui/i18n/ui.datepicker-he.js thirdparty/jquery-ui/i18n/ui.datepicker-hr.js thirdparty/jquery-ui/i18n/ui.datepicker-hu.js thirdparty/jquery-ui/i18n/ui.datepicker-hy.js thirdparty/jquery-ui/i18n/ui.datepicker-id.js thirdparty/jquery-ui/i18n/ui.datepicker-is.js thirdparty/jquery-ui/i18n/ui.datepicker-it.js thirdparty/jquery-ui/i18n/ui.datepicker-ja.js thirdparty/jquery-ui/i18n/ui.datepicker-ko.js thirdparty/jquery-ui/i18n/ui.datepicker-lt.js thirdparty/jquery-ui/i18n/ui.datepicker-lv.js thirdparty/jquery-ui/i18n/ui.datepicker-ms.js thirdparty/jquery-ui/i18n/ui.datepicker-nl.js thirdparty/jquery-ui/i18n/ui.datepicker-no.js thirdparty/jquery-ui/i18n/ui.datepicker-pl.js thirdparty/jquery-ui/i18n/ui.datepicker-pt-BR.js thirdparty/jquery-ui/i18n/ui.datepicker-ro.js thirdparty/jquery-ui/i18n/ui.datepicker-ru.js thirdparty/jquery-ui/i18n/ui.datepicker-sk.js thirdparty/jquery-ui/i18n/ui.datepicker-sl.js thirdparty/jquery-ui/i18n/ui.datepicker-sq.js thirdparty/jquery-ui/i18n/ui.datepicker-sr-SR.js thirdparty/jquery-ui/i18n/ui.datepicker-sr.js thirdparty/jquery-ui/i18n/ui.datepicker-sv.js thirdparty/jquery-ui/i18n/ui.datepicker-th.js thirdparty/jquery-ui/i18n/ui.datepicker-tr.js thirdparty/jquery-ui/i18n/ui.datepicker-uk.js thirdparty/jquery-ui/i18n/ui.datepicker-zh-CN.js thirdparty/jquery-ui/i18n/ui.datepicker-zh-TW.js thirdparty/jquery/jquery.js thirdparty/jsmin/.piston.yml thirdparty/jsmin/jsmin.php thirdparty/prototype/prototype.js thirdparty/scriptaculous/dragdrop.js thirdparty/simplepie/.piston.yml thirdparty/spyc/.piston.yml thirdparty/spyc/README thirdparty/spyc/php4/spyc.php4 thirdparty/spyc/php4/test.php4 thirdparty/spyc/spyc.php thirdparty/spyc/spyc.yaml thirdparty/tinymce-advcode/dialog.html thirdparty/tinymce-advcode/editor_plugin_src.js thirdparty/tinymce-advcode/js/dialog.js thirdparty/tinymce/langs/en.js thirdparty/tinymce/plugins/advhr/langs/en_dlg.js thirdparty/tinymce/plugins/advhr/rule.htm thirdparty/tinymce/plugins/advimage/image.htm thirdparty/tinymce/plugins/advimage/langs/en_dlg.js thirdparty/tinymce/plugins/advlink/langs/en_dlg.js thirdparty/tinymce/plugins/advlink/link.htm thirdparty/tinymce/plugins/emotions/emotions.htm thirdparty/tinymce/plugins/emotions/langs/en_dlg.js thirdparty/tinymce/plugins/example/dialog.htm thirdparty/tinymce/plugins/fullpage/fullpage.htm thirdparty/tinymce/plugins/fullpage/langs/en_dlg.js thirdparty/tinymce/plugins/fullscreen/fullscreen.htm thirdparty/tinymce/plugins/inlinepopups/template.htm thirdparty/tinymce/plugins/media/langs/en_dlg.js thirdparty/tinymce/plugins/media/media.htm thirdparty/tinymce/plugins/paste/js/pasteword.js thirdparty/tinymce/plugins/paste/langs/en_dlg.js thirdparty/tinymce/plugins/paste/pastetext.htm thirdparty/tinymce/plugins/paste/pasteword.htm thirdparty/tinymce/plugins/searchreplace/langs/en_dlg.js thirdparty/tinymce/plugins/searchreplace/searchreplace.htm thirdparty/tinymce/plugins/spellchecker/editor_plugin.js thirdparty/tinymce/plugins/spellchecker/editor_plugin_src.js thirdparty/tinymce/plugins/style/langs/en_dlg.js thirdparty/tinymce/plugins/style/props.htm thirdparty/tinymce/plugins/table/cell.htm thirdparty/tinymce/plugins/table/langs/en_dlg.js thirdparty/tinymce/plugins/table/merge_cells.htm thirdparty/tinymce/plugins/table/row.htm thirdparty/tinymce/plugins/table/table.htm thirdparty/tinymce/plugins/template/langs/en_dlg.js thirdparty/tinymce/plugins/template/template.htm thirdparty/tinymce/plugins/xhtmlxtras/abbr.htm thirdparty/tinymce/plugins/xhtmlxtras/acronym.htm thirdparty/tinymce/plugins/xhtmlxtras/attributes.htm thirdparty/tinymce/plugins/xhtmlxtras/cite.htm thirdparty/tinymce/plugins/xhtmlxtras/del.htm thirdparty/tinymce/plugins/xhtmlxtras/ins.htm thirdparty/tinymce/plugins/xhtmlxtras/langs/en_dlg.js thirdparty/tinymce/themes/advanced/about.htm thirdparty/tinymce/themes/advanced/anchor.htm thirdparty/tinymce/themes/advanced/charmap.htm thirdparty/tinymce/themes/advanced/color_picker.htm thirdparty/tinymce/themes/advanced/image.htm thirdparty/tinymce/themes/advanced/langs/en.js thirdparty/tinymce/themes/advanced/langs/en_dlg.js thirdparty/tinymce/themes/advanced/link.htm thirdparty/tinymce/themes/advanced/source_editor.htm thirdparty/tinymce/themes/simple/langs/en.js thirdparty/tinymce/tiny_mce.js thirdparty/tinymce/tiny_mce_src.js widgets/Widget.php
379 lines
13 KiB
PHP
Executable File
379 lines
13 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* A TinyMCE-powered WYSIWYG HTML editor field with image and link insertion and tracking capabilities. Editor fields
|
|
* are created from <textarea> tags, which are then converted with JavaScript.
|
|
*
|
|
* @package forms
|
|
* @subpackage fields-formattedinput
|
|
*/
|
|
class HtmlEditorField extends TextareaField {
|
|
|
|
/**
|
|
* Includes the JavaScript neccesary for this field to work using the {@link Requirements} system.
|
|
*/
|
|
public static function include_js() {
|
|
Requirements::javascript(MCE_ROOT . 'tiny_mce_src.js');
|
|
Requirements::customScript(HtmlEditorConfig::get_active()->generateJS(), 'htmlEditorConfig');
|
|
}
|
|
|
|
/**
|
|
* @see TextareaField::__construct()
|
|
*/
|
|
public function __construct($name, $title = null, $rows = 30, $cols = 20, $value = '', $form = null) {
|
|
parent::__construct($name, $title, $rows, $cols, $value, $form);
|
|
|
|
$this->addExtraClass('htmleditor');
|
|
|
|
self::include_js();
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
function Field() {
|
|
// mark up broken links
|
|
$value = new SS_HTMLValue($this->value);
|
|
|
|
if($links = $value->getElementsByTagName('a')) foreach($links as $link) {
|
|
$matches = array();
|
|
|
|
if(preg_match('/\[sitetree_link id=([0-9]+)\]/i', $link->getAttribute('href'), $matches)) {
|
|
if(!DataObject::get_by_id('SiteTree', $matches[1])) {
|
|
$class = $link->getAttribute('class');
|
|
$link->setAttribute('class', ($class ? "$class ss-broken" : 'ss-broken'));
|
|
}
|
|
}
|
|
}
|
|
|
|
return $this->createTag (
|
|
'textarea',
|
|
array (
|
|
'class' => $this->extraClass(),
|
|
'rows' => $this->rows,
|
|
'cols' => $this->cols,
|
|
'style' => 'width: 97%; height: ' . ($this->rows * 16) . 'px', // prevents horizontal scrollbars
|
|
'tinymce' => 'true',
|
|
'id' => $this->id(),
|
|
'name' => $this->name
|
|
),
|
|
htmlentities($value->getContent(), ENT_COMPAT, 'UTF-8')
|
|
);
|
|
}
|
|
|
|
public function saveInto($record) {
|
|
if($record->escapeTypeForField($this->name) != 'xml') {
|
|
throw new Exception (
|
|
'HtmlEditorField->saveInto(): This field should save into a HTMLText or HTMLVarchar field.'
|
|
);
|
|
}
|
|
|
|
$linkedPages = array();
|
|
$linkedFiles = array();
|
|
|
|
$htmlValue = new SS_HTMLValue($this->value);
|
|
|
|
// Populate link tracking for internal links & links to asset files.
|
|
if($links = $htmlValue->getElementsByTagName('a')) foreach($links as $link) {
|
|
$href = Director::makeRelative($link->getAttribute('href'));
|
|
|
|
if($href) {
|
|
if(preg_match('/\[sitetree_link id=([0-9]+)\]/i', $href, $matches)) {
|
|
$ID = $matches[1];
|
|
|
|
// clear out any broken link classes
|
|
if($class = $link->getAttribute('class')) {
|
|
$link->setAttribute('class', preg_replace('/(^ss-broken|ss-broken$| ss-broken )/', null, $class));
|
|
}
|
|
|
|
$linkedPages[] = $ID;
|
|
if(!DataObject::get_by_id('SiteTree', $ID)) $record->HasBrokenLink = true;
|
|
|
|
} else if(substr($href, 0, strlen(ASSETS_DIR) + 1) == ASSETS_DIR.'/') {
|
|
$candidateFile = File::find(Convert::raw2sql(urldecode($href)));
|
|
if($candidateFile) {
|
|
$linkedFiles[] = $candidateFile->ID;
|
|
} else {
|
|
$record->HasBrokenFile = true;
|
|
}
|
|
} else if($href == '' || $href[0] == '/') {
|
|
$record->HasBrokenLink = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Resample images, add default attributes and add to assets tracking.
|
|
if($images = $htmlValue->getElementsByTagName('img')) foreach($images as $img) {
|
|
// strip any ?r=n data from the src attribute
|
|
$img->setAttribute('src', preg_replace('/([^\?]*)\?r=[0-9]+$/i', '$1', $img->getAttribute('src')));
|
|
if(!$image = File::find($path = urldecode(Director::makeRelative($img->getAttribute('src'))))) {
|
|
if(substr($path, 0, strlen(ASSETS_DIR) + 1) == ASSETS_DIR . '/') {
|
|
$record->HasBrokenFile = true;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
// Resample the images if the width & height have changed.
|
|
$width = $img->getAttribute('width');
|
|
$height = $img->getAttribute('height');
|
|
|
|
if($image){
|
|
if($width && $height && ($width != $image->getWidth() || $height != $image->getHeight())) {
|
|
//Make sure that the resized image actually returns an image:
|
|
$resized=$image->ResizedImage($width, $height);
|
|
if($resized)
|
|
$img->setAttribute('src', $resized->getRelativePath());
|
|
}
|
|
}
|
|
|
|
// Add default empty title & alt attributes.
|
|
if(!$img->getAttribute('alt')) $img->setAttribute('alt', '');
|
|
if(!$img->getAttribute('title')) $img->setAttribute('title', '');
|
|
|
|
//If the src attribute is not set, then we won't add this to the list:
|
|
if($img->getAttribute('src')){
|
|
// Add to the tracked files.
|
|
$linkedFiles[] = $image->ID;
|
|
}
|
|
}
|
|
|
|
// Save file & link tracking data.
|
|
if($record->ID && $record->many_many('LinkTracking') && $tracker = $record->LinkTracking()) {
|
|
$filter = sprintf('"FieldName" = \'%s\' AND "SiteTreeID" = %d', $this->name, $record->ID);
|
|
DB::query("DELETE FROM \"$tracker->tableName\" WHERE $filter");
|
|
|
|
if($linkedPages) foreach($linkedPages as $item) {
|
|
$SQL_fieldName = Convert::raw2sql($this->name);
|
|
DB::query("INSERT INTO \"SiteTree_LinkTracking\" (\"SiteTreeID\",\"ChildID\", \"FieldName\")
|
|
VALUES ($record->ID, $item, '$SQL_fieldName')");
|
|
}
|
|
}
|
|
|
|
if($record->ID && $record->many_many('ImageTracking') && $tracker = $record->ImageTracking()) {
|
|
$filter = sprintf('"FieldName" = \'%s\' AND "SiteTreeID" = %d', $this->name, $record->ID);
|
|
DB::query("DELETE FROM \"$tracker->tableName\" WHERE $filter");
|
|
|
|
$fieldName = $this->name;
|
|
if($linkedFiles) foreach($linkedFiles as $item) {
|
|
$tracker->add($item, array('FieldName' => $this->name));
|
|
}
|
|
}
|
|
|
|
$record->{$this->name} = $htmlValue->getContent();
|
|
}
|
|
|
|
/**
|
|
* @return HtmlEditorField_Readonly
|
|
*/
|
|
public function performReadonlyTransformation() {
|
|
$field = new HtmlEditorField_Readonly($this->name, $this->title, $this->value);
|
|
$field->setForm($this->form);
|
|
$field->dontEscape = true;
|
|
return $field;
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Readonly version of an {@link HTMLEditorField}.
|
|
* @package forms
|
|
* @subpackage fields-formattedinput
|
|
*/
|
|
class HtmlEditorField_Readonly extends ReadonlyField {
|
|
function Field() {
|
|
$valforInput = $this->value ? Convert::raw2att($this->value) : "";
|
|
return "<span class=\"readonly typography\" id=\"" . $this->id() . "\">" . ( $this->value && $this->value != '<p></p>' ? $this->value : '<i>(not set)</i>' ) . "</span><input type=\"hidden\" name=\"".$this->name."\" value=\"".$valforInput."\" />";
|
|
}
|
|
function Type() {
|
|
return 'htmleditorfield readonly';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* External toolbar for the HtmlEditorField.
|
|
* This is used by the CMS
|
|
* @package forms
|
|
* @subpackage fields-formattedinput
|
|
*/
|
|
class HtmlEditorField_Toolbar extends RequestHandler {
|
|
protected $controller, $name;
|
|
|
|
function __construct($controller, $name) {
|
|
parent::__construct();
|
|
Requirements::javascript(SAPPHIRE_DIR . "/thirdparty/behaviour/behaviour.js");
|
|
Requirements::javascript(SAPPHIRE_DIR . "/javascript/tiny_mce_improvements.js");
|
|
|
|
Requirements::javascript(SAPPHIRE_DIR ."/thirdparty/jquery-form/jquery.form.js");
|
|
Requirements::javascript(SAPPHIRE_DIR ."/javascript/HtmlEditorField.js");
|
|
|
|
$this->controller = $controller;
|
|
$this->name = $name;
|
|
}
|
|
|
|
/**
|
|
* Searches the SiteTree for display in the dropdown
|
|
*
|
|
* @return callback
|
|
*/
|
|
function siteTreeSearchCallback($sourceObject, $labelField, $search) {
|
|
return DataObject::get($sourceObject, "\"MenuTitle\" LIKE '%$search%' OR \"Title\" LIKE '%$search%'");
|
|
}
|
|
|
|
/**
|
|
* Return a {@link Form} instance allowing a user to
|
|
* add links in the TinyMCE content editor.
|
|
*
|
|
* @return Form
|
|
*/
|
|
function LinkForm() {
|
|
$siteTree = new TreeDropdownField('internal', _t('HtmlEditorField.PAGE', "Page"), 'SiteTree', 'ID', 'MenuTitle', true);
|
|
// mimic the SiteTree::getMenuTitle(), which is bypassed when the search is performed
|
|
$siteTree->setSearchFunction(array($this, 'siteTreeSearchCallback'));
|
|
|
|
$form = new Form(
|
|
$this->controller,
|
|
"{$this->name}/LinkForm",
|
|
new FieldSet(
|
|
new LiteralField(
|
|
'Heading',
|
|
sprintf('<h3>%s</h3>', _t('HtmlEditorField.LINK', 'Link'))
|
|
),
|
|
$contentComposite = new CompositeField(
|
|
new OptionsetField(
|
|
'LinkType',
|
|
_t('HtmlEditorField.LINKTO', 'Link to'),
|
|
array(
|
|
'internal' => _t('HtmlEditorField.LINKINTERNAL', 'Page on the site'),
|
|
'external' => _t('HtmlEditorField.LINKEXTERNAL', 'Another website'),
|
|
'anchor' => _t('HtmlEditorField.LINKANCHOR', 'Anchor on this page'),
|
|
'email' => _t('HtmlEditorField.LINKEMAIL', 'Email address'),
|
|
'file' => _t('HtmlEditorField.LINKFILE', 'Download a file'),
|
|
)
|
|
),
|
|
$siteTree,
|
|
new TextField('external', _t('HtmlEditorField.URL', 'URL'), 'http://'),
|
|
new EmailField('email', _t('HtmlEditorField.EMAIL', 'Email address')),
|
|
new TreeDropdownField('file', _t('HtmlEditorField.FILE', 'File'), 'File', 'Filename', 'Title', true),
|
|
new TextField('Anchor', _t('HtmlEditorField.ANCHORVALUE', 'Anchor')),
|
|
new TextField('LinkText', _t('HtmlEditorField.LINKTEXT', 'Link text')),
|
|
new TextField('Description', _t('HtmlEditorField.LINKDESCR', 'Link description')),
|
|
new CheckboxField('TargetBlank', _t('HtmlEditorField.LINKOPENNEWWIN', 'Open link in a new window?')),
|
|
new HiddenField('Locale', null, $this->controller->Locale)
|
|
)
|
|
),
|
|
new FieldSet(
|
|
new FormAction('insert', _t('HtmlEditorField.BUTTONINSERTLINK', 'Insert link')),
|
|
new FormAction('remove', _t('HtmlEditorField.BUTTONREMOVELINK', 'Remove link'))
|
|
)
|
|
);
|
|
|
|
$contentComposite->addExtraClass('content');
|
|
|
|
$form->unsetValidator();
|
|
$form->loadDataFrom($this);
|
|
|
|
$this->extend('updateLinkForm', $form);
|
|
|
|
return $form;
|
|
}
|
|
|
|
/**
|
|
* Return a {@link Form} instance allowing a user to
|
|
* add images to the TinyMCE content editor.
|
|
*
|
|
* @return Form
|
|
*/
|
|
function ImageForm() {
|
|
$fields = new FieldSet(
|
|
new LiteralField(
|
|
'Heading',
|
|
sprintf('<h3>%s</h3>', _t('HtmlEditorField.IMAGE', 'Image'))
|
|
),
|
|
|
|
$contentComposite = new CompositeField(
|
|
new TreeDropdownField('FolderID', _t('HtmlEditorField.FOLDER', 'Folder'), 'Folder'),
|
|
new CompositeField(new FieldSet(
|
|
new LiteralField('ShowUpload', '<p class="showUploadField"><a href="#">'. _t('HtmlEditorField.SHOWUPLOADFORM', 'Upload File') .'</a></p>'),
|
|
new FileField("Files[0]" , _t('AssetAdmin.CHOOSEFILE','Choose file: ')),
|
|
new LiteralField('Response', '<div id="UploadFormResponse"></div>'),
|
|
new HiddenField('UploadMode', 'Upload Mode', 'CMSEditor') // used as a hook for doUpload switching
|
|
)),
|
|
new TextField('getimagesSearch', _t('HtmlEditorField.SEARCHFILENAME', 'Search by file name')),
|
|
new ThumbnailStripField('FolderImages', 'FolderID', 'getimages'),
|
|
new TextField('AltText', _t('HtmlEditorField.IMAGEALTTEXT', 'Alternative text (alt) - shown if image cannot be displayed'), '', 80),
|
|
new TextField('ImageTitle', _t('HtmlEditorField.IMAGETITLE', 'Title text (tooltip) - for additional information about the image')),
|
|
new TextField('CaptionText', _t('HtmlEditorField.CAPTIONTEXT', 'Caption text')),
|
|
new DropdownField(
|
|
'CSSClass',
|
|
_t('HtmlEditorField.CSSCLASS', 'Alignment / style'),
|
|
array(
|
|
'left' => _t('HtmlEditorField.CSSCLASSLEFT', 'On the left, with text wrapping around.'),
|
|
'leftAlone' => _t('HtmlEditorField.CSSCLASSLEFTALONE', 'On the left, on its own.'),
|
|
'right' => _t('HtmlEditorField.CSSCLASSRIGHT', 'On the right, with text wrapping around.'),
|
|
'center' => _t('HtmlEditorField.CSSCLASSCENTER', 'Centered, on its own.'),
|
|
)
|
|
),
|
|
new FieldGroup(_t('HtmlEditorField.IMAGEDIMENSIONS', 'Dimensions'),
|
|
new TextField('Width', _t('HtmlEditorField.IMAGEWIDTHPX', 'Width'), 100),
|
|
new TextField('Height', " x " . _t('HtmlEditorField.IMAGEHEIGHTPX', 'Height'), 100)
|
|
)
|
|
)
|
|
);
|
|
|
|
$actions = new FieldSet(
|
|
new FormAction('insertimage', _t('HtmlEditorField.BUTTONINSERTIMAGE', 'Insert image'))
|
|
);
|
|
|
|
$form = new Form(
|
|
$this->controller,
|
|
"{$this->name}/ImageForm",
|
|
$fields,
|
|
$actions
|
|
);
|
|
|
|
$contentComposite->addExtraClass('content');
|
|
|
|
// Allow other people to extend the fields being added to the imageform
|
|
$this->extend('updateImageForm', $form);
|
|
|
|
$form->unsetValidator();
|
|
$form->disableSecurityToken();
|
|
$form->loadDataFrom($this);
|
|
|
|
return $form;
|
|
}
|
|
|
|
function FlashForm() {
|
|
$form = new Form(
|
|
$this->controller,
|
|
"{$this->name}/FlashForm",
|
|
new FieldSet(
|
|
new LiteralField(
|
|
'Heading',
|
|
sprintf('<h3>%s</h3>', _t('HtmlEditorField.FLASH', 'Flash'))
|
|
),
|
|
$contentComposite = new CompositeField(
|
|
new TreeDropdownField("FolderID", _t('HtmlEditorField.FOLDER'), "Folder"),
|
|
new TextField('getflashSearch', _t('HtmlEditorField.SEARCHFILENAME', 'Search by file name')),
|
|
new ThumbnailStripField("Flash", "FolderID", "getflash"),
|
|
new FieldGroup(_t('HtmlEditorField.IMAGEDIMENSIONS', "Dimensions"),
|
|
new TextField("Width", _t('HtmlEditorField.IMAGEWIDTHPX', "Width"), 100),
|
|
new TextField("Height", "x " . _t('HtmlEditorField.IMAGEHEIGHTPX', "Height"), 100)
|
|
)
|
|
)
|
|
),
|
|
new FieldSet(
|
|
new FormAction("insertflash", _t('HtmlEditorField.BUTTONINSERTFLASH', 'Insert Flash'))
|
|
)
|
|
);
|
|
$contentComposite->addExtraClass('content');
|
|
|
|
$this->extend('updateFlashForm', $form);
|
|
|
|
$form->unsetValidator();
|
|
$form->loadDataFrom($this);
|
|
$form->disableSecurityToken();
|
|
|
|
return $form;
|
|
}
|
|
} |