WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート symfony

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

DBはMySqlです。
例えば掲載されてから一週間以内のレコードを取得


$q = Doctrine_Query::create()
->select('u.*')
->from('User u')
->where('CURRENT_TIMESTAMP - INTERVAL 7 DAY < created_at');

$users = $q->execute();
こんな感じでいけます。ただCASE文は駄目なようです。

->where('(CASE WHEN CURRENT_TIMESTAMP - INTERVAL 7 DAY < created_at THEN 1 ELSE 0 END) = 1')

Exception report[Doctrine_Query_Exception]
File :/home/sites/doctrine/lib/Doctrine/Query.php
Line :343
Message :Unknown aggregate alias: CASE
まあ、普通最初のクエリを使うでしょうか問題ないですが、たとえば新しいレコードに今日から1週間以内に登録されたレコードかどうかをフラグとして取ってきてNEWマークをだしたりとか、よくやると思います。

SELECT
u.*,
(CASE WHEN CURRENT_TIMESTAMP - INTERVAL 7 DAY < created_at THEN 1 ELSE 0 END) AS is_new
FROM user u
というようなレコードは色々試しましたが1.1.1現在出来ないようです。まあ、ホスト言語側でどうにでもやりようはありますけど。あとSELECTにINTERVALを入れたりCASTも出来ないようです。

->addSelect('CAST(created_at AS DATE)')
->addSelect('(u.created_at - INTERVAL 7 DAY) as is_new')
両方駄目でした。

joinLeftなんかすごく便利に良く出来てるので、SQLを柔軟にするのは難しいでしょうね。このようなクエリーを使わなくてすむようにDB設計段階から考えて使った方が良さそうです。

もしDQLで書く方法あったらコメントお願いします。


    このエントリーをはてなブックマークに追加

GmGuardPlugin


sfGuardPluginはすごく便利なのですが、「認証に利用するIDが固定されてしまう」という点と、「ユーザーのテーブルが1対1のリレーションで二つに分かれてしまうのが気持ち悪い」という点が気になって、作ってみました。sfGuardPluginを使った方がいいのかまだ少し悩んでますが、とりあえずアップしてみます。
ご意見ありましたらお願いします。

※対応ORMはpropelのみです。
※2009/5/22
remember meの機能でたまに挙動がおかしい時があるのに気づきましたが、1つのプロジェクトで複数のサブドメイン&アプリで運用していて、cookieなど様々なものが絡み合っているので、まだ突き止めていません。どうにか時間を作ってがんばります。何かありましたらコメントお願いします。
一つのユーザーIDが一つのハッシュしか持てなくなっていたので、修正しました。↑恐らくこれが原因です。

■インストール

symfony plugin-install http://plugin.gomo.jp/plugins/GmGuardPlugin/GmGuardPlugin-1.3.1.tgz
あるいは
symfony plugin-upgrade http://plugin.gomo.jp/plugins/GmGuardPlugin/GmGuardPlugin-1.3.1.tgz

※1.*から1.3.0にUPするときはDBを落として新しく作り直してください。
※1.3.0から1.3.1にUPするときもDBを落として新しく作り直してください。

symfony propel-build-sql
mysql -u root dbname < data/sql/plugins.GmGuardPlugin.lib.model.schema.sql
または
DROP TABLE IF EXISTS `gm_guard_remember`;
CREATE TABLE `gm_guard_remember`
(
`target_pkey` INTEGER NOT NULL,
`hash` VARCHAR(32) NOT NULL,
`ip_address` VARCHAR(50) NOT NULL,
`created_at` DATETIME,
PRIMARY KEY (`target_pkey`,`hash`)
)Type=InnoDB;


■~/apps/sys/lib/myUser.class.phpの継承元を変更

class myUser extends GmGuardSecurityUser
{
}


■~/apps/app_name/config/settings.yml設定

all:
.settings:
enabled_modules: [default, GmGuardAuth]

.actions:
login_module: GmGuardAuth
login_action: signin

secure_module: GmGuardAuth
secure_action: secure

ちなみにenabled_modulesというのは~/apps/app_name/modulesに無いmoduleを使いたいときに、ここに設定します。逆に言えば~/apps/app_name/modulesに置いたmoduleは自動的に使えるようになります。

■~/apps/app_name/config/app.yml設定
*は必須です。

all:
gm_guard_plugin:
class: Account #*認証に使うテーブルのclass名
id_column: email #*IDに使うカラム名
password_column: password #*パスワードに使うカラム名
credential_class: Credential #クリデンシャルに使うクラス名
credential_column: credential_name #クリデンシャルに使うカラム名。
                       credential_classを指定した場合はそのクラスのテーブルのカラム名。
                       単独で指定した場合はclassのカラム名
save_to_session_columns: [email,name] #セッション(sf_user)に保存するカラム
remember_cookie_expire: 60*60*24*30 #自動ログイン機能のクッキー保存時間
password_hash_func: md5 #パスワードをハッシュかするPHP関数
routes_register: on #認証ページに自動でルートを設定するか
redirect_uri: module/action #ログイン成功時、リダイレクトするURL
(リクエストしたページがあった場合はそちらに優先的にリダイレクトします)
remember_cookie: gm_remember_me
remember_me_ipcheck: false
cookie_domain: .gomo.jp


■自動ログイン機能を使うならフィルターをONにする。

security:
class: GmGuardRememberFilter


1.3.1同じIDで複数のハッシュを持てるように修正。合わせて1.3.0のcookieの名前を保存するのをやめました。
1.3.0remember_cookieをDBに保存するようにしました。同じDBを使って複数のサブドメインで別セッションを使いたい時使えます。
1.2.1ログアウト時、戻り先のURLをクリアーするように変更
1.2.0クリデンシャルが1:nの別テーブルの場合に対応
1.1.0remember_me_ipcheckと cookie_domainを追加。
1.0.3戻り先のセッションを保存する挙動を見直しました。
1.0.2ログイン成功時にリダイレクトするURLをセットできるようにしました。
1.0.1secureとsignoutのアクション時に間違えてsigninにリダイレクトしていました。

[symfony 1.1.6]

    このエントリーをはてなブックマークに追加

たとえばwww.example.comだったらフロントエンドアプリへ。sys.example.comだったらアプリケーションsysを実行したい時の.htaccessの書き方です。


RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ index.php [QSA,L]

RewriteCond %{HTTP_HOST} ^sys\.
RewriteRule ^(.*)$ sys.php [QSA,L]
ようは、どのフロントコントローラーを起動するか、ということなので、結構柔軟に設定できます。例えばwww.example.com/m/以下の接続はmobileアプリケーションにだと

RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{REQUEST_URI} ^/m/
RewriteRule ^(.*)$ mobile.php [QSA,L]
など。

[symfony 1.2.7]

    このエントリーをはてなブックマークに追加

doctrineで環境をdev、ウェブデバッグをtrueにすると画面の上にいろいろな情報が出ますがその中にsymfonyDBiconのアイコンでデータベースへのクエリーログが出ます。
これがある日突然?出なくなってました。
いろいろ試したところpropelのプラグインがONになっていると出ないようです。


class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
// for compatibility / remove and enable only the plugins you want
$this->enableAllPluginsExcept(array('sfCompat10Plugin'));
}
}
としていたところを

class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
// for compatibility / remove and enable only the plugins you want
$this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
}
}
で出るようになりました。同時に使うなと・・・まあ、そりゃそうでしょうよ。でも、例外でも投げてくれればいいのに。
[symfony 1.2.6]

    このエントリーをはてなブックマークに追加

モバイルでフォームに日本語の値を戻すときに文字化けが発生しました。
モバイルの文字コード変換は自家製のフィルタでやっていました。resuestのParameterHolderの中身にをUTF-8に変換し、処理後、すべてのrespose contentsをShift_JISに変換していました。一部抜粋するとこんな感じです。


public function execute($filterChain)
{
$response = $this->getContext()->getResponse();

if ($this->isFirstCall())
{
$agent = GmAgentMobile::getInstance();
if($agent->isDoCoMo())
{
$response->setContentType('application/xhtml+xml; charset=Shift_JIS');
}
else
{
$response->setContentType('text/html; charset=Shift_JIS');
}

$ph = $this->getContext()->getRequest()->getParameterHolder();
foreach($ph->getAll() as $key=>$value)
{
$ph->set($key, $this->convertEncoding($value, 'UTF-8', 'SJIS'));
}
}

$filterChain->execute();

$contents = $response->getContent();

$response->setContent(mb_convert_encoding($contents, 'SJIS', 'UTF-8'));

}
で問題はフォームに値をbindするときに

$this->form = new JobSearchMobileForm();
$this->form->bind($request->getGetParameters());
としていたのですが、getGetParametersはrequestのParameterHolderからではなく$_GETの値を別に保持していてそれを返していたのです。つまりShift_JISの値がそのまま入っていました。で、フィルターでもう一度Shift_JISに変換していたので文字化けしていたのです。
フォームにbindするところを

$this->form = new JobSearchMobileForm();
$this->form->bind($request->getParameterHolder()->getAll());
に直したら文字化けしなくなりました。ParameterHolderにGETかPOSTかの区分けが無いのだからgetGetParametersとgetPostParametersは別のところから取ってきてるのは考えればわかるのですが、なかなか頭がそっちに向かず結構はまってしまいました。

モバイルはsymfonyを使わずに作り直しかけてました。OTZ
あー、テンプレも他チームにやってもらっちゃったんだよな・・・月曜にsymofnyに戻す話をしなきゃ・・・

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。