2009年2月6日金曜日

[symfony 1.0.18]symfonyでファイルアップ&ダウンロード

ちょっと興味本位でファイルのアップロード・ダウンロードができるアプリを作ってみた。
後悔はしていない。

ジェネレーターで作ったので所々はしょってますが、ちょー簡単な作りです。

まずファイルアップロード
自分は、DBにはファイル名と拡張子とサイズしか入れませんでした。
中身はuploadsに直接保存しています。

まずテンプレート内で

を組み込む。これだけでファイル選択のボタンが作成されます。

次にアクション内で
普通にDBに保存する値をセットしていき、
$this->getRequest()->moveFile('file',
sfConfig::get('sf_upload_dir').'ファイルへのパス);

を組み込む。moveFile()の第2引数には保存するパスを指定しています。
saveされたらuploadsの下を見てみましょう。
アップロードについては他のブログでも紹介されてるけど、
意外とダウンロードは難しいらしくあまり紹介されてない。

てことでダウンロードを実装します。
まず自分はファイルの一覧を作りました。
data/listSuccess.php みたいな。
そこにファイル名の横にダウンロードのリンクを作成し、
飛んだ先のアクションで直にダウンロードが始まるようにしました。
まずアクション
 public function executeDownload() {
  $data = DataPeer::retrieveByPk($this->getRequestParameter('id'));
  $file_path = sfConfig::get('sf_upload_dir').'ファイルへのパス';
  $file_name = 'ファイル名';
  $this->getResponse()->addHttpMeta('Content-Type',
'application/octet-stream; name='.$file_name);
  $this->getResponse()->addHttpMeta('Content-Disposition',
'attachment; filename='.$file_name);
  $this->getResponse()->addHttpMeta('Content-Length', ファイルサイズ);
  $this->send_data = fread(fopen($file_path, 'rb'), ファイルサイズ);
 }

まず、日本語で書いてある所は人によって入るものが違います。
最後の$this->send_data には実際のファイルデータが入っていて、テンプレートに渡しています。

そしてテンプレート
data/downloadSuccess.php
<?php echo $send_data ?>


これだけでアップロード・ダウンロードができるようになりました☆
気をつけなければならないのは、最後のdownloadSuccess.phpのlayout.phpを外す事です。
HTML要素が入っているとファイルの中身が壊れてしまうので注意です。

ジェネレーター最高^p^

2008年11月27日木曜日

[symfony 1.0.18]はうとぅーゆーずdoSelectRS

久々の更新でテンション上がってきました。
開発しつつちょっと詰まったのでメモメモ。。

仕事で使ってるDBのテーブルがなかなかでかくて、
使いたいカラムは1つか2つなのにdoSelectで全部持ってくるのはナンセンスだ!
ってことでaddSelectColumnを使ってみました。
カラムを指定してオブジェクトを取り出す時は
doSelectRSを使うって決まりがあるらしいけど、
そうすると$user->getName()とかいう風に取り出せない。
なんでかなーと調べるうちに見つけたのがFetchMode
細かい説明はいまいち把握してないのでできないですが、
以下にソースを記述しておきます。
$oCriteria = new Criteria;
$oCriteria->addSelectColumn(UserPeer::NAME);
$oCriteria->add(UserPeer::ID, $this->getRequestParameter('id'), Criteria::EQUAL);
$result = UserPeer::doSelectRS($oCriteria);
$result->setFetchMode(ResultSet::FETCHMODE_ASSOC);
while ($result->next()) {
 $this->user_name = $oResult->getString('NAME');
}


これでテンプレートの方で$user_nameを呼び出すと中身が取り出せました^-^

[symfony 1.0.18]今更ながら

先月から新しい職場で開発してるのですが、
自分が使ってるsymfonyのバージョンは
1.0.18
です。
えへへ

2008年10月28日火曜日

[symfony]リレーション組んでいるDBへのフィクスチャデータ投入

ちょと詰まったのでメモ。

リレーションシップを組んでいるDBへフィクスチャデータを投入する際に
Railsの仕様ではモデルに対して1つのフィクスチャファイルを作成していたので
symfonyでもそうなのかなーと思い、同様にしてみた。
するとエラーが帰ってくる

"The object "hogehoge" from class "Hoge" is not defined in your data file."

ちゃんとテーブルは作られてるから問題はないはず。。。
困った時は黒猫たん。

黒<ファイル名じゃね?
俺<テーブル名+import.ymlだおー
俺<!!!!!

結論:
フィクスチャデータのファイルに連番を振るべし。

2008年10月25日土曜日

[symfony]xampp環境でVirtualHost

結構詰まったのでメモ。

ローカルで開発してると複数プロジェクトをやる機会があると思います。
そこでローカルでもVirtualHostで複数動作できるようにする方法を探しました。

環境は
WindowXP
xampp2.5
symfony 1.0.6 (今回は関係ないけど一応

まずhttpd.confを少し修正
LoadModule vhost_alias_module modules/mod_vhost_alias.so
↑ この行をコメントされてたら外す
httpd.confは以上。

次にhttpd.confと同じフォルダにあるextraフォルダに移動
extra/httpd-vhosts.confにVirtualHostの設定を追記
例)
## MyVirtualHost ##
NameVirtualHost *:80
<VirtualHost *:80>
 DocumentRoot "C:\sample/web"
 ServerName localhost
 <Directory "C:\sample/web">
  AllowOverride All
  Allow from all
 </Directory>
 Alias /sf C:\xampp/php/data/symfony/web/sf
 <Directory "C:\xampp/php/data/symfony/web/sf">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

<VirtualHost *:80>
 DocumentRoot "C:\testproject/web"
 ServerName testproject
 <Directory "C:\testproject/web">
  AllowOverride All
  Allow from all
 </Directory>
 Alias /sf C:\xampp/php/data/symfony/web/sf
 <Directory "C:\xampp/php/data/symfony/web/sf">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

自分はこれにOptionsFollowSymLinksを指定してた為におかしくなってた模様
とりあえずhttpd-vhosts.confは以上

最後にWindowsのHostファイルを修正します。
C:\WINDOWS/system32/drivers/etc/hosts
にあると思います。無ければ検索してください。
ここに
127.0.0.1 localhost
というのが設定されていると思います。
今回はNameVirtualHostにしましたので
127.0.0.1 testproject
を追記します。

127.0.0.1 localhost
127.0.0.1 testproject

こんな感じになると思います。
あとは再起動したらバッチリ!
クソハマリすると何もかも嫌いになりそうです^-^

[symfony]始めました。

Railsは少しお休みします。

2008年10月1日水曜日

[戯言]最近の出来事

Arua装備消滅から一気に意気消沈してもうどのぐらい経ったのか・・・
Aruaはもう引退ですね。なんかもう間違いない。
時間あればINして引退の意向をクラメンに伝えないと・・・
そもそもクラメンもINしてるかどうかwww

最近はLHを始めました。
意外とクソゲーってはまるよね。うん
でも何日か前UPDATEの際にドロップテーブルの値を変えちゃったのか
祭り状態になって、これMMOとしてどうなんだろってなりましたwww
NPCに1個2000弱で売れるアイテムが30万個以上ドロップて
そりゃ終わるあwww
でもゲームシステムはおもしろいから続けるんだろな・・・
彼女も気に入ってるし^-^

会社もうまく動いてないし、いろいろ疲れるなぁ
やっぱり社長がズボラ&無知なのが一番の原因だと思う。
それに輪をかけてコミュニケーション不足。
給料は払われてるけど明細の提示を怠るってもうダメだ。
誰かの下で働くってことはその人を慕ってる事が前提だと思うけど、
もう今は嫌悪しかない。
でもこれをネガティブに受け止めても仕方ないからポジティブに持っていかないとね。
反面教師としてこうなっちゃダメだと勉強になりました。
経営を夢見る自分にとっては有意義な1年だったのかと思います。