自訂CKeditor的表情圖案

By tky, 5 七月, 2012

今天在處理 WRN 網站的編輯器表情圖案時,花了很大的功夫才搞定這個小事。反省的結果,就是過去架構網站的時候沒有想太多,模組升級的時候又太過躁進,搞得同一個問題老是重複發生。把經驗寫下來,避免重蹈覆轍。

WRN 網站是一個架了好幾年的社群網站,專門給西洋羅曼史粉絲們建置書目資料與互相交流閱讀心得。由於社群經營很久了,她們發展出一種寫文章的方式,喜歡在文章中插入不同的表情圖案,表達自己的心情和評價。特別是常用到一個「內有劇透」的圖案,用途用來警告那些還沒看過本書的人,文章後面會提到劇情內容。這差不多像是「內有惡犬」的標示一樣,看到你還往下踩,傷了看書的興致那就是你家的事了。總之,表情圖案對於使用者來說相當必要,絕不可少。

當初架站的時候,選用了 FCKeditor 這個老牌的編輯器,加上兩個 Drupal teaser plugin 也就夠用了。(不幸的是,只有 Drupaler 了解 <!---break---> 標籤的意義和重要性,所以日後不時也是得去抓漏、修補版面)唯一的錯誤就是當時為了方便模組升級時的識別效果,在模組的資料夾名稱中都保留了版本號。這個本以為會方便自己的作法,後來把自己累死。因為當 FCKeditor 模組升級一次,版本號變一次,資料夾名稱就換一次,連帶放在模組資料夾中編輯器表情圖片的路徑也就跟著變了。結果就是,只要是在模組升級之前的文章,表情圖片就會消失(因為路徑找不到圖片嘛!)。這下就得保留一份表情圖片檔案在舊的模組資料夾中,保持圖片顯示。可以想見用這種方式升級愈多次,modules 資料夾裡頭就會產生愈多的遺跡資料夾,像是FCKeditor 2.3, FCKeditor 2.3.1, FCKeditor 2.4.......。

由於用膝蓋想都知道這是一個很爛的作法,找個一勞永逸之計就是重要的工作了。後來選用 Wysiwyg 模組的一個重要理由,就是因為它要求把編輯器放在 sites/all/libaries 裡頭,和模組分離。如此,不管模組怎麼升級,就再也不用管編輯器的圖片路徑問題了,因為完全不會有任何影響。

煩就煩在有時候也得升級一下編輯器,才能解決一些發現到的使用問題。最近就發生了 Wysiwyg + Ckeditor 會無端產生多餘 <br> 換行標籤的情況,讓文章多出了不必要的空行。查了 drupal.org 上頭的文章,沒什麼好解法。就只能把編輯器升級一下,看看有沒有藥醫。剛好最近恰巧知道最新版本的 CKEditor - WYSIWYG HTML editor 模組也可以讀取 sites/all/libaries 裡頭的編輯器,一解之前架床疊屋之苦,就重新選用了 CKEditor - WYSIWYG HTML editor + Ckeditor 這個自然搭配。

剛換好模組和編輯器,測試一下編輯器不會產生多餘的 <br> 換行標籤,想要收工之際,WRN 網站的站長就跑來問說:啊我們常用的表情圖片咧?

angry

該死!又忘了表情圖片這件事!?

雖然緊急把表情圖片的資料夾備份到相同的位置,保持文章中的圖標繼續顯示,但因為換掉了編輯器的設定檔,編輯器中的表情圖片變成了預設的幾張笑臉圖,之前自行增加的那些圖片都無法顯示了。

重寫一個設定檔不就好了嘛?

我知道一定有人會這樣說。因為我自己就是跟自己這麼說的。

然而我完全忘記該怎麼寫這個檔案,因為上一次搞這個設定檔的時候沒有寫筆記!碰到這種事,當然力馬手刀拜問 Google 大神,很快的找到一篇跟這個主題相關的文章:Add more smileys to CKeditor? 看了看內容,大致就是將以下的程式碼寫入編輯器的 config.js 檔案裡頭

config.smiley_path=CKEDITOR.basePath+'plugins/smiley/images/msn/';

config.smiley_images=['angel_smile.gif', 'angry_smile.gif', 'broken_heart.gif', 'cake.gif', 'confused_smile.gif', 'cry_smile.gif', 'devil_smile.gif', 'embaressed_smile.gif', 'envelope.gif', 'heart.gif', 'kiss.gif', 'lightbulb.gif', 'omg_smile.gif', 'regular_smile.gif', 'sad_smile.gif', 'shades_smile.gif', 'teeth_smile.gif', 'thumbs_down.gif', 'thumbs_up.gif', 'tounge_smile.gif', 'whatchutalkingabout_smile.gif', 'wink_smile.gif'];

config.smiley_descriptions=['', ':(', '', '', ':~', ':\'(', '', '', '', '', '', '', ':-O', ':-)', ':-(', '8-)', ':D', '', '', ':-P', ':|', ';-)'];

config.smiley_path 是指你放置圖片的路徑,放哪裡當然隨你了(其實放 plugins/smiley/images/ 底下就可以了)。重點是後面 config.smiley_images 要依序列出目錄底下的檔案名稱,有幾張寫幾個囉。config.smiley_descriptions 則是可有可無,基本上就是對應每張圖片的 alt 文字,滑鼠 hover 會看見;你可以填寫文字或者":)"這樣的符號進去。

一邊發誓絕不再做第二次、一邊按照圖片資料夾的檔案將檔名資料填入,存檔之後清空 Drupal 和瀏覽器的cache,蠻懷期待的開啟編輯器的表情圖片視窗.....

....啥都沒有,仍然是預設值....broken heart

來來回回檢查幾次,都沒有什麼變化與差別,開始懷疑是不是自己搞錯了設定方式。後來想到該不會是要改模組還不是改編輯器的設定檔吧?

抱著姑且一試的心態,打開 CKEditor - WYSIWYG HTML editor 模組裏面的 ckeditor.config.js 檔案,把前述的程式碼貼到 CKEDITOR.editorConfig = function(config) {....} 裡頭。重複存檔、清空 cache 的流程,再開一次編輯器中的表情圖片視窗-----神奇的圖片們就一一出現了!

搞半天就是要去改模組中的設定檔,而不是編輯器的!(所以模組升級還是不能覆蓋了事!)這個部份一定要筆記下來,下次進行 Ckeditor 模組升級,一定要注意這個部份。(還要記得寫一份筆記告訴自己在升級前要來看這份筆記yes)。

Area