Archive | symfony1.4 RSS feed for this section

actionsからlayoutへパラメータを渡す このエントリーをはてなブックマークに追加

27 1月

今更symfony1.4ネタ?と思うかもしれませんが、いろいろとsf1.4で作ったために、未だに新しいフレームワークに移行していません。

今までアクションからレイアウトへパラメータを渡すには、slotなどを使うしかないかな?と思っていたんですが、この間そうでもないということがワカッタのでメモしておきます。

actions.class.phpなどで、コンテキストに変数をセットして

$this->getContext()->set('変数名', '渡したいパラメータ');

layoutでゲットすればよかった。

$sf_context->get('変数名');

symfony1.4でCSV出力 このエントリーをはてなブックマークに追加

24 8月

symfony1.4でCSV出力がしたいとき、CakePHPのヘルパーをsymfony用に少し書き換えて使ったのでメモ。
CakePHPのヘルパはここで発見。
http://blog.asial.co.jp/721

(1) CSV Helper (PHP 5)のダウンロード

http://bakery.cakephp.org/articles/view/csv-helper-php5 からソースをコピーしてPROJECT/lib/helper/CsvHelper.phpとして保存。
lib/helper以下にあるヘルパは勝手に読み込まれる。べんりだなー。もしもhelperというディレクトリがなければ自分で作る。mkdir!

(2) Helperクラスのダウンロード

CSVHelperはそのままだと動かない。extendsしてるクラスがないから。
CakePHPをダウンロードしてきて、CAKEPHP/cake/libs/view/helper.php をCsvHelper.phpと同じディレクトリに保存。
また、26行目付近のApp::import(‘Core’, ‘Overloadable’); を削除。
それから、35行目付近のclass Helper exetnds…は、継承を削除して class Helper { だけにする。

要は、CsvHelperに必要な親クラスはincludeするけど、親クラスが継承しているOverloadableはいらないので削除、というかんじ。
ここまでで、lib/helperにはCsvHelper.phpとHelper.csvがあることになる。

(3) CsvHelperの修正

function render は、$this->outputをreturn しているけど、これを削除。
echo $outputとして、renderは出力をするメソッドにしてしまう。

(4) アクションにconfigを作る

通常だと、表示にlayoutが読み込まれるので余計なHTMLタグが入ってしまうので、CSVダウンロードの処理をするときだけはレイアウトを読み込まない設定にしたい。
apps/APPLICATION/module/MODULE/config に、view.ymlを作成。
configディレクトリがないときは作る。view.ymlでは以下のようにする。

downloadSuccess:
  has_layout: false
    http_metas:
      cache-control: public
      pragma: public

has_layoutでレイアウトを読み込まない設定。true/falseでの設定のよう。
metaはたぶん、キャッシュコントロール的なかんじ。CsvHelperのほうでヘッダを出力するので、あんまり考えなくていいと思う。

(5) actions.class.phpにメソッドを追加

ここでは、executeDownloadなどにしておく。

public function executeDownload(sfWebRequest $request)
{
  $this->csv = new CsvHelper();
  $this->headers = array('ユーザID', '名前', '性別', '誕生日', '作成日', '更新日');
  $this->fields = array('id', 'name', 'gender', 'birthday', 'created_at', 'updated_at');
  $this->filename = 'profile.csv';
  $this->profiles = Doctrine_Core::getTable('Profile')->findAll();
}

headers でCSVに表示するヘッダを作成。
fieldsでは、利用するモデルの項目名(なんていうか、$profile->get(‘id’)とかで使う、idっていうこと)。

(6) downloadSuccess.phpの作成

templateに先ほどのメソッドのビューを作成。

$csv->setFilename($filename);

foreach($headers as $h){
  $header[] = $h;
}
$csv->addRow($header);

foreach($profiles as $profile){
  $row = array();
  foreach($fields as $f){
    $row[] = $profile->get($f);
  }
  $csv->addRow($row);
}

$csv->render(true, 'sjis-win', 'utf-8');

sf_contextでよく使うもの このエントリーをはてなブックマークに追加

12 4月

symfony1.4をまだ使っている。レイアウトの中でグローバルメニューなどを書いているとき、sf_contextの内容を使うことがあるので、よく使うメソッドなどをメモ。

アクション内で利用できる sfContext::getInstance() は、テンプレート内で利用する $sf_context と同じ。($sf_contextはsfContextのインスタンス)

symfony API » sfContext Class | symfony | Web PHP Framework

  • 現在のアクション名
    $sf_context->getActionName()
  • 現在のモジュール名
    $sf_context->getModuleName()
  • リクエスト
    $sf_context->getRequest()