※この記事はページリニューアル以前の記事です。そのため表示の崩れや、リンク切れなどを含む可能性があります。(順次修正予定)

sfSavvyPlugin ってどんなプラグイン?

sfSavvyPlugin はモデルや配列を元に動的で修正可能なテーブルを生成してくれるヘルパーらしいです。
モデルを使う場合は、propel-generate-crud で生成するものと機能的に変わらず、使いどころが難しい。。。というか、どういう用途に使うのか理解してません。
まぁ、とりあえず順番なので入れてみる。


インストール

symfony plugin-install http://plugins.symfony-project.com/sfSavvyPlugin
かんたんインストール。
[sfSavvyPlugin-1.0.0.tgz - 2007/11/5 現在]


設定

まず、Savvyヘルパーを利用できるようにします。
[settings.yml]
all:
  .settings:
    standard_helpers:       [Savvy]
全てのテンプレートで使えるようにする場合は、standard_helpers に'Savvy'を上記のように追加します。

あるいは、Savvyヘルパーを利用するテンプレートだけに適用したい場合は、下記のコードをテンプレートの最初に挿入します。
<?php use_helper('Savvy') ?>


利用できる関数

Wikiにあるように、関数は4つ用意されています。
下記に簡単に列挙します。コード詳細はサンプルをご覧下さい。

Simple Dynamic HTML Table

<?php echo getSimpleTable($models, null, null); ?>
テーブル生成関数です。
第1引数: モデル
第2引数: 表示するデータのメソッド名の配列
第3引数: ルーティングルール。編集・削除などへのリンクルールの作成


Simple Edit Form

<?php echo getEditForm($model, null, null); ?>
修正フォーム生成関数です。
第1引数: 編集するモデル
第2引数: 編集するデータのメソッド名の配列
第3引数: HTMLのアトリビュートオプション。


Save Form

<?php saveFormData($myModel, $sf_request, "Item Updated") ?>
モデル保存関数です。
第1引数: 保存するモデル
第2引数: sfRequestオブジェクト
第3引数: sfRequestアトリビュートに追加するメッセージ("msg")


Simple Delete Form

<?php echo getDeleteTable($models, 'Are You Sure You Want To Delete This Item?', null); ?>
削除フォーム生成関数です。
第1引数: 削除するモデル
第2引数: 削除確認メッセージ
第3引数: HTMLのアトリビュートオプション。

設定ファイルなどで'escaping_strategy'をオンにしている場合、モデルなどが引数として正常に利用できない場合があります。
なので、
$obj;
$sf_request;
↓
$sf_data->getRaw('obj');
$sf_context->getRequest(ESC_RAW);
などを利用することを考えます。


SavvyHelper.php を書き換える

そこそこ古いプラグインなので、修正しないと使えない部分と、修正した方がオレ好みってところがあったので、いじっちゃいました。
ごめんなさい ><

[/plugins/sfSavvyPlugin/lib/helper/SavvyHelper.php]

95行目あたり
$routingParams = "?";
↓
$routingParams = "";
'link_to'の仕様が変わってるので修正。

105行目あたり
$table .= link_to($routingRules[$routing[$j]], $routing[$j].$routingParams);
↓
$table .= link_to($routingRules[$routing[$j]], $routing[$j], array('query_string'=>$routingParams));
コチラも'link_to'の仕様が変わってるので修正。
[追記]
上記は嘘です。仕様なんて変わるわけありません。ごめんなさい><
routing をちゃんと設定しておけば正常に動作します。

196行目あたり
$html = form_tag($action);
↓
$html = form_tag($action, array('onSubmit'=>"return confirm('$confirmMsg');"));
'onClick'に動作を書くより、submitボタンを利用して'onSubmit'にconfirmをやらせる方がええ。

205行目あたり
$html .= "<input type=\"button\" value=\"Delete\" onClick=\"if(confirm('$confirmMsg')) document.forms[0].submit();\" />\n";
↓
if(isset($attributes['hidden'])) {
	foreach($attributes['hidden'] as $key=>$val){
		$html .= "<input type=\"hidden\" name=\"{$key}\" value=\"{$val}\" />";
	}
}
$html .= "<input type=\"submit\" name=\"commit\" value=\"Delete\" />\n";
input(hidden)タグを動的に生成できるようにしちゃう。


まとめ

一応サンプルを作ったけど、用途がコレであってるのかわからん。
とりあえず、こんなもんだという事だけ覚えとこう。


--
全然進みません。。。