FuelPHPを使ったリレーションがやっとわかったのでメモしておきます。
要件は下記の通り。
テーブル「カード」と、
テーブル「ユーザーが所持するカード一覧」の2種類を用意し、
特定のユーザーが持っているカードだけ抽出する
まずは「カード」のテーブルを作成します。
カードID、カード名だけの単純なテーブルです。
CREATE TABLE `testdb`.`table_card` ( `cardid` VARCHAR( 32 ) NOT NULL UNIQUE, `name` VARCHAR( 256 ), INDEX ( `cardid` ) ) ENGINE = MYISAM ;
次にユーザーが所有するカードの一覧のテーブルです。
こちらもシリアル、ユーザーID、カードID、枚数だけの単純なもの。
CREATE TABLE `testdb`.`table_userscard` ( `id` SERIAL NOT NULL DEFAULT NULL UNIQUE, `userid` VARCHAR( 256 ), `cardid` VARCHAR( 32 ), `count` INT, INDEX ( `id` ) ) ENGINE = MYISAM ;
単純な \Fuel\Core\Model_Crud ではなく、\Orm\Model を使います。
ORM(オブジェクトリレーショナルマッパー)はざっくり言うと“リレーションを組むのに便利なモデル”です。
ORMを使うには事前に準備が必要になります。
≫Introduction - Relations - Orm Package - FuelPHP Documentation
≫FuelPHPのORM(オブジェクトリレーショナルマッパー) | WinRoad徒然草
≫FuelPHPをやってみる (8) - Orm\Modelを試す - - kinjou_jのメモログ
いよいよORMを継承したクラスを作ります。
まずはユーザーの所有カード。
バリデーションの設定など色々行えますが、ここではシンプルに。
fuel/app/classes/model/userscard.php
class Model_Userscard extends \Orm\Model{ protected static $_table_name = 'table_userscard'; protected static $_primary_key = array('id'); protected static $_propeties = array( 'id', 'userid', 'cardid', 'count' ); }
そしてリレーションを設定するカードのモデル。
fuel/app/classes/model/card.php
class Model_Card extends \Orm\Model{ protected static $_table_name = 'table_card'; protected static $_primary_key = array('cardid'); protected static $_propeties = array( 'cardid', 'name' ); /********************************** * リレーション:一対多 */ protected static $_has_many = array( 'owncard' => array( 'model_to' => 'Model_Userscard', 'key_from' => 'cardid', 'key_to' => 'cardid', 'cascade_save' => false, 'cascade_delete' => false ) ); }
key_from、key_toで結合する項目を指定しています。
また、cascade_save、cascade_deleteは「false」にして、カード情報を変更や削除しても、所有情報には影響が出ないようにしています。
そしていよいよ本番! リレーションを使い、かつ、リレーション内での絞り込みです。
$results = Model_Card::find( 'all', array( 'related' => array( 'owncard' => array( // リレーション条件を指定 'where'=> array( // リレーション内での検索 array( 'userid', '=', 'ABC12345' ) ) ) ), // table_card 側での検索はこっちに記述 // 'where' => array( // array( 'exp' => 3 ) // ), 'order_by' => array( 'cardid'=> 'asc' ) ));
モデル内で作成したリレーション条件名を「related」で指定し、
その中で同じように「where」を指定するだけなのですが、
これがなぜか情報が見付かりませんでした。^^;
同じ状況で悩んでいる方のお役に立てればと。
\Orm\Model を継承した場合と、\Fuel\Core\Model_Crud を継承した場合ではメソッド名も違いますし、取得できるデータ形式もだいぶ違いますので注意が必要です。
一度 var_dump() で確認してみてください。
FuelPHPで端末によって表示を切り替える方法はいくつかあるようですが、
一番簡単なのは Themeクラスを使うことです。
今回の要件は下記の通り。
fuel + app + classes | + controller | + list.php ←コントローラー | + view + template_pc.php ←PC用テンプレート + template_mobile.php ←携帯用テンプレート + pc ←PC用テーマディレクトリ | + list | + index.php | + mobile ←携帯用テーマディレクトリ + list + index.php
まずは初期化部分。
class Controller_List extends Controller{ function before(){ parent::before(); // テーマ設定 $this->theme = Theme::instance( 'custom', array( 'active' => "pc", // 存在するテーマディレクトリを指定 'fallback' => 'pc', // activeが存在しない場合に使うテーマ 'paths' => array(APPPATH.'views'), // 検索パス 'view_ext' => '.php' // テーマファイル拡張子 ) ); // モバイル端末ならテンプレート変更 // iPadは除外 if (Agent::browser() != "iPad" && Agent::is_mobiledevice()){ $this->theme->active('mobile'); $this->theme->set_template('template_mobile'); }else{ $this->theme->active('pc'); $this->theme->set_template('template_pc'); } }
いったんインスタンスを作る時に active を指定しないとエラーになるので、
PC向けのテーマ(active)を指定して、後から変更しています。
FuelPHPの Agentクラスでは iPadもモバイル端末扱いなのですが、
iPadは PCと同じほうがいいですよねw
続いて表示部分。
public function action_index() { $this->theme->template->title = "ページタイトル"; $this->theme->template->content = $this->theme->view('list/index', Array( 'hoehoe' => 'ほえほえ' )); return $this->theme; }
タイトルと、テーマ内で使う変数を指定しています。
最後にテーマを返すことで表示させます。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title><?php echo $title; ?></title> </head> <body> <?php echo $content; ?> <p>PC用</p> </body> </html>
リスト表示するテーマ <?php echo $hoehoe; ?>
このへんを参考にしました。
≫FuelPHPのテーマクラスのサンプル - BTT's blog
≫FuelPHPのテーマクラス | WinRoad徒然草
この記事のサンプルでは Controllerクラスを継承した方法を使っていますが、Controllerクラスを拡張した Controller_Templateを使う方法もあります。
テンプレートコントローラーでは変数「$template」でテンプレートを指定することが出来ます。
class Controller_Entry extends Controller_Template{ public $template = 'template_pc';
画面の反映はテーマを使ったのと同じ様なものです。
サンプルでは Controllerクラスを継承していたので return で表示内容を返す必要がありましたが、Controller_Templateクラスを継承している場合その必要はありません。
$this->template 内のものが自動的に表示されます。
$this->template->content = $this->Theme->view( 'list/index', array('hoehoe'=>'ほえほえ') );
テーマの設定を使って切り替える方法もあるようです。
インストールはこのへんを参考にしました。
≫【PHP】Xdebugを利用したデバッグ環境構築(5.3)
Microsoft Visual C++ 2008 再頒布可能パッケージが必要
≫【PHP】Xdebugを利用したデバッグ環境構築(php5.2)
どのDLLが必要なのか。
≫XAMPPでXDebugを有効にする。 - ぐだぐだ日記
php.iniの設定
≫PHP向けのNetBeans IDEのエディタでのPHPソース・コードのデバッグ
しかしどうやってもインストールできない!!!
おっかしいなーとコマンドプロンプトで「php.exe -v」すると「with Xdebug」の文字が。
インストールできてんじゃん!
でも phpinfo() だと出てこない。なんでだろ? と思ったら
php.ini 自体が違っていて……。
コマンドプロンプトで実行するときは下記を。
C:\Program Files (x86)\Ampps\php\php.ini
Apacheから実行する時は下記を読んでいたんですね。
C:\Program Files (x86)\Ampps\apache\php.ini
そりゃ動かないわーーー!!
追記(2013.3.21):
無事審査通って公開されましたー!
紹介ページそのうち新しくしますw
以下、当時の記事。
結果から言うとダメでした。^^;
iTunes Connect>Manage Your Pplications>Review Status>Resolution Centerで詳細を確認すると下記のような文章が。
We found that your app initiates the In App Purchase process in a non-standard manner.
Tapping buy button prompts the user to log in using Apple ID and password prior to displaying the In App Purchase confirmation window.
To restore previously purchased In App Purchase products, it would be appropriate to provide a "Restore" button as a separate process from the In App Purchase and initiate the restore process when the "Restore" button is tapped by the user.
Other/Information Needed
Additionally, we began the review of your app but are not able to continue because we need sample data that can be imported to the app so that we'd be able to access all the feature of your app.
Alternatively, you may provide a demo video that demonstrates your app in use.
You can provide a link to a demo video of your app in iTunes Connect. Go to "Manage Your Applications," select your app, click "Edit Information," then scroll to the "Review Notes" section and add the demonstration video access details.
For discrete code-level questions, you may wish to consult with Apple Developer Technical Support.
えーと、アプリ内課金で購入済みのユーザーに対するリストア(復元)処理を含めろということなのかな?
このへんを参考にしてみたいと思います。
≫アプリ内課金のリストア(購入済み)処理が原因でリジェクトされた場合の対処法
≫失敗しない iOS In-App Purchase プログラミング
≫iOS: In App Purchase、Restore処理のハマりポイント
あとはデモデータがないから検証が継続できないよと。動作しているデモムービーを用意してくれてもいいよ、ということですかね。
仕事が今詰っているのでまだまだ時間かかりそうです。
以前 FuelPHPのメール文字化け対策の記事を書きましたが不完全でした。
今度こそ対策ができた(と思う)のでまとめたいと思います。
FuelPHPからメールを送ったら Gmailでは正常に読めたのに、携帯では文字化けしてしまったのでその対処法をメモしときます。
といってもまた場当たり的な対処な感じですが。
PhraseExpressでただ文章を登録するだけだったらIMEの辞書登録で充分です。
ここではもう一歩進んだ使い方を紹介します。
インストールから基本的な使い方までは前の記事をご覧下さい。
≫[PhraseExpress]よく使うフレーズを簡単入力! PhraseExpressはじめの一歩 | RuputerFan
<strong>{#cursor}<strong>
フレーズの変換が行われた後{#cursor}の位置にカーソルが入りますので、そのまま入力が行えます。
HTMLのタグを登録する時なんかに有効です。
TwitterなどのWebサービスやショピングなど、メールアドレスを入力することってものすごく多いですよね。例えば住所もそうですし、メールの書き出しもだいたい同じ文章を毎回入力しますよね。
こういった繰り返し使われる文字を少ない労力で入力しちゃおうというのが「PhraseExpress」です。
;mel ←キーボードで入力
[email protected] ←即座に表示される文字;myad ←キーボードで入力
東京都千代田区外神田1丁目 ←即座に表示される文字
MacやiPhone/iPadなら「TextExpander」という超定番アプリがあるんですが、Windows版が存在しないので今回のアプリを使うことにしました。
一歩進んだ使い方についてはこちらをどうぞ。
≫[PhraseExpress]ただの辞書登録とは違う!一歩進んだ使い方 | RuputerFan
先ほど書いた [FuelPHP]デフォルト以外のデータベースを利用する ですが、正しい方法を教えていただきました。そもそも FuelPHPには設定を切り替えるための簡単な方法がありました。
fuel/app/config/ → 共通設定
fuel/app/config/development/ → 開発用設定
fuel/app/config/production/ → 公開(製品)用設定
という感じになっており、development/db.php に開発環境の、production/db.php に公開環境のDB設定を記述すればいいのでした。設定名も「default」のままで。
そして環境を切り替えるには、fuel/app/bootstrap.php を下記のように編集するだけです。
/** * Fuel::DEVELOPMENT 開発環境 * Fuel::TEST テスト環境 * Fuel::STAGE ステージング環境 * Fuel::PRODUCTION 製品環境 */ Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::PRODUCTION);
末尾の名前を書き換えるだけなんですね。便利。
.htaccessで切り替える方法もあるようです。
参考:インストール方法 - インストール - FuelPHP ドキュメント
SetEnv FUEL_ENV production
環境変数「FUEL_ENV」を「development」にすれば開発環境なわけですね。
初期状態で作業をしているとURLは
http://hoge.com/mailform/index.php/entry/confirm
のようになり、「index.php」がURLに含まれてしまいます。
個人的にはちょっと美しくないなあと思うので消すことにしました。
まずはFulePHPインストールディレクトリの .htaccess を下記のようにします。
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] </IfModule>
次に fuel/app/config/config.php を下記のように編集します。
//'index_file' => 'index.php', 'index_file' => false,
これでURLは下記のようになるはずです。
http://hoge.com/mailform/entry/confirm
修正記事を書きましたので、そちらをご覧下さい。(2012.09.14)
FuelPHPからメールを送ったら Gmailでは正常に読めたのに、携帯では文字化けしてしまったのでその対処法をメモしときます。
といってもまた場当たり的な対処な感じですが。