FCKeditor のサーバーブラウザーをRailsで書く。

必要だったので書きました。

fckconfig.js の設定

まずは、fckconfig.js に、サーバーブラウザーのURLを教えます。

FCKConfig.LinkBrowser = true ;
FCKConfig.LinkBrowserURL = "/fck/index";
FCKConfig.LinkBrowserWindowWidth        = 600;
FCKConfig.LinkBrowserWindowHeight       = 600;
FCKConfig.LinkUpload    = true ;
FCKConfig.LinkUploadURL = '/fck/quick_upload'

こんな感じで。

fck_controller.rb の実装

あとは単に/fck/index でアクセスされるところを実装すればいいだけなのですが。ファイルアップロードをAjaxで行うためにresponds_to_parentプラグインを使っています。これだとiframeにポストして、親側でJavaScriptを動かすのが楽に。

class FckController < ApplicationController
  def index   # fck dialog (通常のリンク)から呼び出される
    set_files
  end

  def image   # fck dialog (画像リンク)から呼び出される
    set_files
    render :action => "index"
  end

  def browse  # ファイルリストを更新する(ajaxで呼び出される)
    set_files
    render :partial => "files"
  end

  def upload  # ブラウザ上でアップロードする
    save_file(:new_file)
    @script ||= "$('new_file').value = ''; Browse();"   # 成功したらクライアントのBrowse()を呼び出して、ファイルリストを更新。
    responds_to_parent do
      render :update do |html|
        html << @script
      end
    end
  end

  def quick_upload # fck dialog から呼び出されるアップローダー
    begin
      save_file("NewFile")
    rescue WebJourney::ApplicationError => e
      @script = <<-EOS
<script type="text/javascript">
window.parent.OnUploadCompleted(1, null, null, "#{e.message}");
</script>
EOS
      render :text => @script
    end
  end
quick_uplaod アクション ?

これははブラウザを開かずにdialog上でファイルをアップロードするときに呼び出されます。これだけ特殊なのでメモを残しておくと、NewFileという名前のパラメーターでFCKのダイアログからファイルをアップロードするときに呼び出されます。レスポンスのHTMLは、JavaScriptのみを記述します。

<script type="text/javascript">
<!--//
window.parent.OnUploadCompleted(0, '<%=h @file.image_src_path %>', '<%=h @file.name %>', null);
<% end %>
//-->
</script>

こんな感じで、window.parent.OnUploadCompleted(error, url, filename, message) を呼び出すように記述するとよいでしょう。

  • error : 0 であれば成功。1 であれば、message がalertによって呼び出されます。それ以外にはFCKの方で201などが予約されています。
  • url : リンクするURL
  • filename : なんだっけ。

quickuploadのレスポンスについては、http://wiki.fckeditor.net/Developer%27s_Guide/Participating/Server_Side_Integration#Upload が詳しいです。

このページには、Xmlレスポンスで実装する"行儀のよい"やり方(UI部分はFCKのjavascriptが担保してくれる)がかかれているのですが、この方法だとイメージがサムネイルで表示されないので、何のためのサーバーブラウザーか、ということになりかねなくて、断念しました。サムネイルするやつはお金を取るみたいですし。

実装コード(Controller, View)はSVN上においてます。ファイルシステムではなくてデータベースにバイナリをつっこんでいるので、あまりよろしくないかも。