ExJS所提示的HtmlEditor非常簡單,一般來說算夠用了,不過還是有很多狀況無法適用,所幸ExtJS可利用擴充的方式來使用其它的WYSIWYG編輯器,TinyMCE是個很好的選擇,FCKEditor也不錯,現在重新被制作改名成CKEditor,以下的範例是使用CKEditor來砍進ExJS當成它的HtmlEditor。
範例是由這個網址取得的
http://www.sencha.com/forum/showthread.php?79031-CKEditor-Extension
/**************************************************** * CKEditor Extension *****************************************************/ Ext.form.CKEditor = function(config){ this.config = config; Ext.form.CKEditor.superclass.constructor.call(this, config); }; Ext.extend(Ext.form.CKEditor, Ext.form.TextArea, { onRender : function(ct, position){ if(!this.el){ this.defaultAutoCreate = { tag: "textarea", autocomplete: "off" }; } Ext.form.TextArea.superclass.onRender.call(this, ct, position); CKEDITOR.replace(this.id, this.config.CKConfig); }, setValue : function(value){ Ext.form.TextArea.superclass.setValue.apply(this,[value]); CKEDITOR.instances[this.id].setData( value ); }, getValue : function(){ CKEDITOR.instances[this.id].updateElement(); return Ext.form.TextArea.superclass.getValue(this); }, getRawValue : function(){ CKEDITOR.instances[this.id].updateElement(); return Ext.form.TextArea.superclass.getRawValue(this); } }); Ext.reg('ckeditor', Ext.form.CKEditor);
example實作的方式
/*! * Ext JS Library 3.0.0 * Copyright(c) 2006-2009 Ext JS, LLC * [email protected] * http://www.extjs.com/license */ Ext.onReady(function(){ //Ext.QuickTips.init(); // turn on validation errors beside the field globally //Ext.form.Field.prototype.msgTarget = 'side'; var bd = Ext.getBody(); var Form = new Ext.FormPanel({ id: 'Myorm', frame: true, labelAlign: 'top', title: 'CKEditor in ExtJS', bodyStyle:'padding:5px', url:"getHtml.jsp", width: 750, layout: 'form', // Specifies that the items will now be arranged in columns items: [{ //columnWidth: 1, xtype: 'fieldset', labelWidth: 90, title:'CKEditor', defaults: {width: 700, border:false}, // Default config options for child items defaultType: 'textfield', autoHeight: true, bodyStyle: Ext.isIE ? 'padding:0 0 5px 15px;' : 'padding:10px 15px;', border: false, style: { "margin-left": "10px", // when you add custom margin in IE 6... "margin-right": Ext.isIE6 ? (Ext.isStrict ? "-10px" : "-13px") : "0" // you have to adjust for it somewhere else }, items: [{ xtype: 'ckeditor', fieldLabel: 'Editor', name: 'htmlcode', id:'htmlcode', CKConfig: { /* Enter your CKEditor config paramaters here or define a custom CKEditor config file. */ customConfig : 'config.js', // This allows you to define the path to a custom CKEditor config file. //toolbar: 'Full', toolbar:[['Source'/*,'-','Save','NewPage','Preview','-','Templates'*/], ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'], ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'], /*['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],*/ ['BidiLtr', 'BidiRtl'],['Link','Unlink','Anchor'], '/', ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'], ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote','CreateDiv'], ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'], '/', ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'], ['Maximize', 'ShowBlocks','-'/*,'About'*/] ], skin : 'office2003', height : 200//, //width: 700 } }] }],buttons:[{ text:'Save', name:'Save', handler:function() { //alert(123); Form.getForm().submit(); }//.createDelegate(Form.getForm()) }], renderTo: bd }); });
其中要開啟CKEditor的功能可以從toolbar這個參數裡設定toolbar:’Full’是全部啟用,toolbar:’Basic’是只有簡單功能,跟內建的ExtJS HtmlEditor有點像,以下是全部的項目,可以選擇要放置的位置及啟用的功能
toolbar:[['Source'/*,'-','Save','NewPage','Preview','-','Templates'*/], ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'], ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'], /*['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],*/ ['BidiLtr', 'BidiRtl'],['Link','Unlink','Anchor'], '/', ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'], ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote','CreateDiv'], ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'], '/', ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'], ['Maximize', 'ShowBlocks','-'/*,'About'*/] ],
html的部份
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>CKEditor</title> <link rel="stylesheet" type="text/css" href="css/ext-all.css"/> <script type="text/javascript" src="js/ext-base.js"></script> <!-- ENDLIBS --> <script type="text/javascript" src="js/ext-all.js"></script> <!-- Load CKEditor Library --> <script type="text/javascript" src="js/ckeditor.js"></script> <!-- Load EXTJS CKEditor Extension --> <script type="text/javascript" src="js/ckeditor1.js"></script> <!-- Load Example Code --> <script type="text/javascript" src="js/example.js"></script> <style type="text/css"> body { padding: 20px; } p { width: 750px; padding: 10px; } .ext-ie .x-form-check-wrap, .ext-gecko .x-form-check-wrap { padding-top: 3px; } fieldset legend { white-space: nowrap; } </style> </head> <body> </body> </html>
下一篇會再加Servlet上傳檔案、圖檔及Flash功能的實作
補充內容:Fix form.getForm().getFieldValues(false);取不到值的bug
/******************************************************************************* * CKEditor Extension ******************************************************************************/ Ext.form.CKEditor = function(config) { this.config = config; Ext.form.CKEditor.superclass.constructor.call(this, config); }; Ext.extend(Ext.form.CKEditor, Ext.form.TextArea, { hideLabel : true, constructor : function(config) { config = config || {}; config.listeners = config.listeners || {}; Ext.applyIf(config.listeners, { beforedestroy : this.onBeforeDestroy .createDelegate(this), scope : this }); Ext.form.CKEditor.superclass.constructor.call(this, config); }, onBeforeDestroy : function() { this.ckEditor.destroy(); }, onRender : function(ct, position) { if (!this.el) { this.defaultAutoCreate = { tag : "textarea", autocomplete : "off" }; } Ext.form.TextArea.superclass.onRender.call(this, ct, position); this.ckEditor = CKEDITOR.replace(this.id, this.config.CKConfig); }, setValue : function(value) { Ext.form.TextArea.superclass.setValue.apply(this, [value]); CKEDITOR.instances[this.id].setData(value); }, getValue : function() { CKEDITOR.instances[this.id].updateElement(); this.value = CKEDITOR.instances[this.id].getData(); return Ext.form.TextArea.superclass.getValue.apply(this); }, getRawValue : function() { CKEDITOR.instances[this.id].updateElement(); this.value = CKEDITOR.instances[this.id].getData(); return Ext.form.TextArea.superclass.getRawValue.apply(this); } }); Ext.reg('ckeditor', Ext.form.CKEditor);
取值方法
Ext.getCmp("htmlcode").getValue();
One thought to “[ExtJS]WYSIWYG所視即所得網頁編輯器外掛 with CKEditor”