2010年4月アーカイブ

symfonyの話。前回に引き続き、具体的な例を書く。

■やりたいこと:Hostの編集画面で、Domain一覧のリストボックスの選択肢を絞りたい

テーブルDomainとHostがあって、Host.domain_idがDomain.idを参照してるとする。

テーブルHostのモジュールを作成すると、編集画面でdomain_idの箇所はドメイン名の一覧のリストボックス(プルダウン)が表示される。そこまではいいんだけど、全てのドメインをそこに表示するのではなくて、そのユーザーが所有しているドメインのみを表示させたいとする。

 以下のようなschema.ymlを作った(かなりはしょってるけど)。Domain.nameは一意だから、Host.domain_nameとDomain.nameをリレーションさせた。その後、doctrin:buildでフォームを作成したけど、Domain.nameがテキストボックスじゃなかった。

# schema.yml
Host:
  actAs: { Timestampable: ~ }
  columns:
    domain_name: { type: string(255), notnull: true }
    name:        { type: string(255), notnull: true }
  relations:
    Domain:      { onDelete: CASCADE, local: domain_name, foreign: name }

Domain:
  actAs: { Timestampable: ~ }
  columns:
    name:      { type: string(255), notnull: true }

今考えるとDomain.nameにunique制約付けてないせいかな・・・

とりあえずメモ書き程度。

筋トレ開始

| コメント(0) | トラックバック(0)

本ブログでの私生活のネタはスゴい久しぶりな気がする。

1週間前に筋トレを始めた。現在178cm, 58kg (多分)。目標体重60kg。

今更ながらビリーズブートキャンプ・・・ブックオフとかで500円くらいでたたき売られてるかと思いきや、意外にそうでもない。

プロテインとかも買ってみた。トレーニングの前後+寝る前に飲んでる。効果が出るまで続けたい。

現在symfonyを使って作っているサイトでは、利用者がユーザー登録するような形になる予定。

ちょっとググったらsfApplyPluginというのがあるらしい。こちらのページに導入の仕方が書いてあった。しかしもうだまされない。これはDoctrineに対応していないかもしれない、と思ってsfApplyPluginのページを見たら、案の定Propel限定。

でも、検索したらやっぱりあった。Doctrine対応のsfDoctrineApplyPluginというのが。とりあえず試してみたいが、Zend Frameworkも必要??

GW中にでも試してみようと思う。

symfonyでschema.ymlにごにょごにょ書いていざテーブル作成!と思ったら以下のエラー。

SQLSTATE[HY000]: General error: 1005 Can't create table 'dbname.#sql-192c_1a6' (errno: 150). Failing Query: "ALTER TABLE table1 ADD CONSTRAINT table1_user_id_sf_guard_user_id FOREIGN KEY (user_id) REFERENCES sf_guard_user(id)". Failing Query: ALTER TABLE table1 ADD CONSTRAINT domain_user_id_sf_guard_user_id FOREIGN KEY (user_id) REFERENCES sf_guard_user(id)

結論:原因は外部キーを付けるフィールドと参照先のフィールドの型があっていないこと。

MovableType用のSyntaxHighligherを導入したので、そのテスト。

public void doSomething() {
     System.out.println("Hello World!");
}

引き続きsymfonyでアプリ作成中に、以下のようなエラーが出た。

The module "sfGuardAuth" is not enabled.

昨日は全く問題なく動いていたのに・・・とりあえずググるとall:の後に書くと無視されることがある、とか.settingが2つあったとかその他色々情報が見付かったけど、どれも自分のケースには該当しない。

30分くらい悩んだ後、もう一度settings.ymlを見てみたら・・・エラーメッセージ通り、単にsfGuardAuthが存在しないだけだった!アホだ・・・

※frontendのsettings.ymlには存在していてbackendには存在していなかった。昨日問題なく動いたのは、frontendでログインしてその後にbackendに移動したからセッションが有効だったため。で、1日経ってセッションが切れてsfGuardAuthモジュールのログインページに飛ばそうとしたら、そんなのがない!ってなったらしい。

symfony 1.1を使っていた時に、sfGuardPluginについてのエントリーを書いた。sfGuardUserテーブルにはログインID、パスワードくらいしか情報が無くて、本名やメールアドレスなどのフィールドは別テーブルを作って1:1のリレーションをさせなければいけないという内容。

symfony 1.4でsfDoctrineGuardPluginでも基本コンセプトは一緒なんだけど、このページ(英語)に従ってやったら非常に簡単にできた。概略は以下の通り。

  • schema.ymlにプロファイルテーブル(Profile)を追加し、sfGuardUserと関連づける
  • sfGuardUserのfixtureを修正
  • symfony doctrine:buildでテーブル、モデル、フォームを作成
  • sfGuardUserAdminForm.class.phpを修正し、プロファイルのフォームも読み込む
  • generator.ymlを少し修正

一点注意。多分、schema.ymlのsfGuardUserとProfileの外部キーの所で、onDelete: CASCADE が必要な気がする。

※その他、sfGuardPlugin関係のtipsをまとめたページがあった。というかこっちのページを先に見つけた。そこで、2つのテーブル(sfGuardUserとsfGuardUserProfile)を関連づける方法は書いてあったけど、1つの画面で編集できるようにする方法は載ってなかった。

■環境

symfony 1.4.3

自分用メモ。

DreamHostで動いているシステムのDBの中身を触る際、phpMyAdminなんて使うのはたるいのでsshでログインしてmysqlコマンドを使う。

DBの文字コードはutf8だけど、mysqlコマンドはlatin1を使おうとする。解決方法は2通り。

1. 以下のようにコマンドラインオプションで文字コードを指定。

mysql -h mysql.example.com -u user -p --default-character-set=utf8

2. ホームディレクトリに .my.cnf というファイルを作り、そこに以下の内容を記述。ファイル名はドットで始まることに注意(3分くらいハマった)。

[client]
default-character-set=utf8

 

Bazaarを使ってみようと思って、Eclipseの環境を設定するところまではこないだやった。で、実際にEclipseのプロジェクトをBazaarに登録しようと思ったけど上手く行かない。

Team -> Share Projectとやったら特にエラーとか出てないし問題無さそうと思ったんだけど、ファイルを変更してコミットしようとしてもnothing to commitとかでる。

ちょっとググったらこんなのを見つけた。

今はプログラムを書く方が重要なので、これの問題解決は後回しにし、当面はSubversionを使う事にした。後からBazaarに移行することも出来るし。

 

自分用メモ。ググればすぐ出てくるはてなのページ

 

■symfony 1.4はDoctrineがデフォルトORM

最近またSymfonyでアプリを作ってる。前回触ってから1年以上。その間にバージョンなどに大きな変化が…IT業界、時代の流れに付いていくのだけで大変。

さて、symfony 1.4ではDoctrineがデフォルトのORマッパーになったらしい。以前触っていた1.1ではPropelがデフォルトでDoctrineというのは名前だけしか聞いたこと無かったんだけど、今回せっかくなんで使ってみることにした。

ちなみに、symfony 1.4でPropelを使うには、一番簡単なのはプロジェクト作成時にORMにPropelを指定すること。このページ(英語)に載ってた。

■sfGuardPluginはPropel用、らしい。

sfGuardPluginはPropel用だというのを知らずにインストールしたら、当然何も動かない。アンインストールしようとすると以下のエラーが出る。

# symfony plugin:uninstall sfGuardPlugin

Fatal error: Class 'sfPropelBaseTask' not found in C:\path\to\projectname\application\plugins\sfGuardPlugin\lib\task\sfGuardAddGroupTask.class.php on line 20

解決方法としては、c:\path\to\projectname\application\plugins\sfGuardPlugin\lib\task フォルダーを削除してから、uninstallコマンドを実行する。

英語だけど全く同じ質問がgoogleの掲示板みたいなのにあった。

■Doctrine用にはsfDoctrineGuardPlugin

sfDoctrineGuardPluginってのがある。sfGuardPluginには劣ってるみたいな古い書き込みも見つけたけど、Symfony 1.4はDoctrineがデフォルトになったんだから、sfDoctrineGuardPluginも結構改善されているはず、と期待しつつ使用開始。

Firefoxの場合はFirebugという高機能なJavaScriptデバッガがあるので困らないけど、Internet Explorerの場合は昔懐かしのMicrosoft Script Debugger位しか無いのかなぁと思ってたら、IE8からは標準でツールが付いていて、F12キーでいつでも呼び出せる事に気づいた。

これは便利。

AJAXでは、以下のようにサーバーから返されたJSONをevalで元に戻すみたいな事を良くやると思う。

var result = eval("(" + responseText + ")");

サーバー側で何らかのエラーが発生して、responseTextにエラーメッセージが書かれてたりすると以下のようなエラーが発生する。

エラー: 構文エラーです。

最初は「構文的には何もおかしくないんだけどなぁ…」と結構悩んだけど、そこに書かれているJavaScriptの構文ではなくて、evalしている文字列がJavaScriptの構文じゃないって事だって分かった時は少し感動。

Joomlaコンポーネント内で(モジュールでも良いけど)カレンダーを表示させるのは簡単で、以下のようにやればいい(ただし正式なドキュメントは見あたらず)。

JHTML::_('calendar', ....);

Joomlaのカレンダー機能はこのカレンダーを使っているらしい。

オリジナルのカレンダーのドキュメントを見ると色々カスタマイズ出来るみたいだけど、Joomlaからだと以外に面倒だったのでメモ。本家フォーラムでも同じ事を質問してる人がいた。

Eclipse + symfony

| コメント(0) | トラックバック(0)

PHPでもEclipseを使い始めてしばらく経つけど、デバッガは使ってなかった。今回、symfonyを使って構築中のとあるシステムの開発で、Eclipseを単にエディタとしてだけでなくデバッガも含めたちゃんと統合開発環境として使ってみようと思った。

やることはこんな感じかな。

  1. Eclipse(PHP用)のインストール
  2. XAMPPのインストール
  3. symfonyのインストール
  4. Eclipseのプロジェクトとしてsymfonyのプロジェクトを作成
  5. 4.で作ったプロジェクトが参照できるようにApacheの設定
  6. PHPでデバッガを有効にする
  7. Eclipseの設定

1~3は情報も沢山あると思うので割愛。

■Eclipseのプロジェクトとしてsymfonyのプロジェクトを作成

まずは普通にEclipseでPHPプロジェクトを作成。ソース用のフォルダを分けるのは個人的な趣味。

Eclipse PHPプロジェクト作成

次に/path/to/workspace-php/foo/applicatioinにsymfonyプロジェクトを作成。

cd c:\path\to\workspace-php\foo\application
symfony generate:project foo

 

自分用メモ。

JoomlaでJSON出力する方法。Joomlaのドキュメントページより。

PHPではjson_encodeを使って出力するだけ。HTTPレスポンスのヘッダも変えてるか。

JavaScript側の処理に関しての注意点はこちらのページが分かりやすい。MooTools 1.2 だとJSON.decodeというのが使えるみたいだけど、Joomla 1.5に付属のMooTools 1.1では使えないっぽい。

(追記) MooTools 1.1のドキュメントの場所を教えてもらった。MooToolsのページから探しても見付からなかった・・・

昔はblogと言えばMovable Typeだったけど、最近はWordPressの方が圧倒的に便利だと思う。プラグインのインストールやバージョンアップなどがマウス操作だけでちょちょいとできるのはかなり嬉しい。

最近作ったWordPressでのblog。例のオンライン英会話や海外インターンシップなどを扱うサイト。

自分用メモ。

Joomlaコンポーネントを作る時は、これを参考にちゃんとSQLインジェクションの対策しなくちゃダメよ。

 

 

このブログもダラダラ書き続けてるけど、あまり見栄えを良くしたり便利にしたりって言う努力をしてなかった。年を取ると新しいことにチャレンジしなくなるもんだなぁと反省。

さて、ずーーーっと前から、Movable Typeのエディタのしょぼさにが嫌で、最近はWordPressを使っている別のブログに書き込む方が多かったんだけど、ちょっと"Movable Type エディタ"で検索したところ、FCKeditorをインストールしているページがいくつか見付かった。FCKeditorなら別のCMSとかでも使ったことあるし、と思って早速インストール。

やり方はこのページの通り。3番の「編集画面のデフォルトフォーマットをリッチエディタに設定」ってのをやらないとダメだった(これで20分くらいハマった)。

結果はかなり快適。もっと早くやっておけば良かった・・・

開発環境としてXAMPPをインストールしApacheを起動しようとしたけど起動できず。error.logを見たら以下のメッセージが。

(OS 10048)通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。 : make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down

え?80番使うようなの動かしてないけど・・・とかなり焦った。80番ポートを使ってるプロセスを特定するには、Windowsだと以下のコマンドでOK。

netstat -aon | findstr 80 | findstr LISTEN

で、表示されたプロセスIDをタスクマネージャーで調べると・・・犯人はSkype。

Skypeの設定→詳細→接続でポートの設定が出来るので、80番は使わないように設定変更。

Joomlaのコンポーネントの話。MVC形式の場合、一般的にはviewはview.html.phpというファイル名で、そこでtemplateを読み込んで表示する、と言う流れになる。

html以外、例えばAJAXなどでXMLを表示したい場合のやりかた。

Controllerへの引数にformat=xmlというのを渡すと、view.html.phpではなくてview.xml.phpが呼ばれる。
HTMLヘッダーのmime typewを正しく設定するには、Controllerの中で以下のようにすれば大丈夫っぽい。

$doc =& JFactory::getDocument();
$doc->setMimeEncoding('application/xml'); 
$doc->setType('xml'); 

ここここら辺を参考にした。


Javaの逆コンパイラーJadをEclipseで使う為のプラグイン、JadClipse。

インストール方法は、SourceforgeからJarをダウンロードして、それをEclipseのpluginsディレクトリに入れてEclipseを再起動するだけ、だと思ってたんだけど...

Eclipseの起動オプションで-cleanを使わないと、pluginsディレクトリから新規プラグインの検索を行わないっぽい。(前からこういう動作だったっけ?)

一度JadClipseが認識されれば、次からは-cleanオプションは必要ない。

環境;
Eclipse 3.5
JadClipse 3.3.0

このブログの作者

名前:kazu
仕事:IT関係の何でも屋
メール:kazu 後幕 kazu どと tv
詳しくはこの辺

このアーカイブについて

このページには、2010年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2010年3月です。

次のアーカイブは2010年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ