JavaScriptで作られたHTMLエディタはいくつかありますが、僕はTinyMCEが好きで、よく使っています。
Railsアプリに組み込むのも簡単で、少しJavaScriptコードをいじるだけで、AjaxでロードしたテキストエリアにTinyMCEを組み込むこともできます。
TinyMCEがさらにすごいのは、MCImageManagerとMCFileManagerというプラグインをもっていることです。
MCImageManagerは画像をアップロードすることができ、GDを使ってサムネイルも作ってくれます。
MCFileManagerは想像どおりの機能をもっています。
また、MCImageManagerとMCFileManagerは相互に連携することが可能です。
これらは単にTinyMCEのプラグインというだけでなく、単独でアプリに組み込むこともできるのが素晴らしいです。
どちらも売り物なので買わなければなりませんが、値段は高くないので、充分買う価値はあると思います。
MCImageManagerとMCFileManagerはこのように素晴らしいものですが、PHPで作られているというのがひとつの難点です。
ファイルをアップロードするときはたいていユーザー認証が必要となりますが、組み込み元のアプリがRailsの場合、それを実現するには、PHPからRailsのセッションとユーザー権限を参照しなければなりません。
そのやり方については、TinyMCE Forumに質問されているのを見つけましたが、具体的なやり方は見つかりませんでした。
ということで、ここに僕のやり方を書いておきます。
MCImageManager/MCFileManagerは認証の枠組をもっており、プラグインという形でそれを拡張できるようになっています。
そのため、コードをどこに記述し、どのように拡張するかは問題ではありません。
PHPとRailsでのセッション/権限情報の受け渡しだけが問題となります。
セッション/権限情報の受け渡し方法としては以下の2つの方法が考えられます。
- RailsのセッションをDBに保存し、PHPがそのセッション情報と権限を取得し認証する
- PHPからRailsにHTTPリクエストを送ってRails側に認証させる
まず1を検討します。
セッション情報をDBに保存するには、config/environment.rb で
config.action_controller.session_store = :active_record_store
とするだけでよいので非常に簡単ですが、セッションに保存されたデータは sessions テーブルの data フィールドに Marshal.dump の結果が格納されます。
セッションが有効かどうかチェックするだけであれば問題ありませんが、セッションからユーザー情報を取得し権限をチェックする必要がある場合、data フィールドの中身を Marshal.load しなければなりません。
PHP自身でそれをやるのは困難ですし、Rubyのスクリプトを作って呼び出そうとすると、Railsのライブラリ群をロードしなければならず(それがないとクラス情報が足りなくてエラーになります)、起動に時間がかかってしまいます。
sessions テーブルにカラムを追加してユーザー情報を取りやすくすることもできないわけではありませんが、ActiveRecordをこのために拡張するのはきれいでないし、実装も面倒です。
1は難しそうなので、2の方法を検討します。
RailsのセッションIDはCookieの _session_id で渡されており、MCImageManager/MCFileManagerを開いたときもこのCookieが渡されるので、PHPからRailsのセッションIDを取得することは可能です。
このセッションIDをCookieにセットして、PHPからRailsへ、ローカルホストのWebサーバーを介してリクエストを送って認証結果を返してもらえばよさそうです。
PHPにはCURLライブラリがあるので、HTTPリクエストを送るのは簡単です。
ということで、2の方法で実装することとします。