Posts tagged select
iPhone アプリ開発メモ 時刻を取得する
6※iPhone アプリを開発する勉強中です。自分用に勉強したときのメモです。
非公開API を使用していたためコードを改めました(2010.12.7)
現在時刻を取得する方法
NSTimer で1秒ごとに onTimer メソッドを呼び出し、UILabel clock の内容を更新する。
- (void)onTimer { NSDate *now = [NSDate date]; [formatter setDateFormat:@"kk"]; int h = [[formatter stringFromDate:now] intValue]; [formatter setDateFormat:@"mm"]; int m = [[formatter stringFromDate:now] intValue]; [formatter setDateFormat:@"ss"]; int s = [[formatter stringFromDate:now] intValue]; clock.text = [NSString stringWithFormat:@"%02d:%02d:%02d", h, m, s]; } - (void)viewDidLoad { timer = [NSTimer scheduledTimerWithTimeInterval:(1.0) target:self selector:@selector(onTimer) userInfo:nil repeats:YES]; }
[symfony] askeet 5日目
15日目はログイン処理の追加とページ処理です。
ログイン処理
ログインリンク追加
askeet/apps/frontend/templates/layout.php
about のリンクの前に入れる
<li><?php echo link_to('sign in', 'user/login') ?></li>
WordPress の設定を使ってデータベースにアクセスする方法
8WordPress をプラグインの作成やカスタマイズするときに WordPress のデータベースの設定を使用してアクセスする方法です。
WordPress では wpdb のオブジェクトが $wpdb というグローバル変数に入っています。この wpdb クラスを使用してデータベースにアクセスします。wpdb クラスは wp-includes/wp-db.php で定義されています。
SQL を発行する
$wpdb->query('SQL文');
CakePHP1.2 モデルの generateList は非推奨メソッドなので find(’list’) を使用する
3CakePHP で select タグを作成する際に CakePHP1.1 ではモデルの generateList メソッドを使用しましたが、このメソッドは CakePHP1.2 では非推奨メソッドになっているようです。その代わりに find メソッドを使用します。
$this->Model->generateList();
と書く代わりに
$this->Model->find('list');
と書きます。
find メソッドのこの書き方は他に
- find(‘count’)
- レコード数を取得する。COUNT(*) の SQL を実行する
- find(‘first’)
- 最初のレコードを取得する。 LIMIT 1 で SQL を実行する
- find(‘all’)
- 全てのレコードを取得する。findAll と同等。
findAll は内部で find(‘all’) を実行している。
などがあります。
CakePHP1.2 Form ヘルパーで日付のフォームを作る
1CakePHP1.2 の Form ヘルパーを使用して日付のフォームを作成したときのメモです。
$attr = array('minYear' => 2000, 'maxYear' => date('Y'), 'separator' => ' / '); echo $form->dateTime('Model/field', 'YMD', 'NONE', date('Y-m-d'), $attr);
とすると下のような日付を選択するフォームができます。
第2引数の ‘YMD’ で年月日の並び順を指定します。日付を表示しない場合は ‘NONE’ を指定します。
- NONE
- 非表示
- YMD
- 年月日の順に表示
- DMY
- 日月年の順に表示
- MDY
- 月日年の順に表示
第3引数で時間表示の指定をします。
- NONE
- 非表示
- 12
- 時間を12時間表示
- 24
- 時間を24時間表示
第4引数でデフォルトの日時を指定します。
第5引数で属性を指定します。
- separator
- 日付の select タグの間に表示する文字
- minYear
- 開始する年
- maxYear
- 終了する年
- interval
- 分を何分刻みで表示するか
CakePHP 1.2 の deleteAll
1CakePHP 1.2 の saveAll その1
CakePHP 1.2 の saveAll その2
のエントリーを書いているときに deleteAll というメソッドがあり気になったので調べてみました。
CakePHP 1.1 で開発時に delete するときに ID を指定するしか方法がなく、ある条件でまとめて削除したいときなどは findAll してからループで delete していました。このときも条件を指定して削除する方法がないかとソースを調べたのですがありませんでした。
使い方は非常に簡単です。findAll のように条件を指定して deleteAll を実行するだけです。
$conditions = array('User.name'=>'suzuki'); if ($this->User->deleteAll($conditions)) { $this->Session->setFlash('削除しました'); } else { $this->Session->setFlash('削除に失敗しました'); }
実行される SQL は以下のような感じです。
SELECT `User`.`id` FROM `users` AS `User` WHERE `User`.`name` = 'suzuki' DELETE `User` FROM `users` AS `User` WHERE `User`.`id` IN (8, 10)
SELECT で条件に合う ID を抽出して WHERE IN で DELETE しています。
ただし CakePHP1.2 の削除ですが、MySQL 4.0 では SQL の DELETE 文でエラーになってしまいます。
MySQL 5.0 ではエラーにならずに削除できました。エラーになる原因は “DELETE” の後ろにテーブルのエイリアス名があるためです。
これは “cakephp1.2でのPostgreSQLエラー。” フォーラム – CakePHP Users in Japan でもあるように既に修正されているようですが、昨日 CakePHP のサイトからダウンロードした CakePHP 1.2.0.6311 beta ではまだ修正されていないようです。
CakePHP select タグの選択していないときの状態を指定する
0Cute CakePHP Trick of the Day – GenerateList Empty Slot In List | Web Development 2.0: Web Design, CakePHP, Javascript
で select タグの選択していないときの状態の値を指定する方法が書かれていますが、この方法は間違っています。
元のエントリのコメントでも指摘されていますが、ヘルパーのメソッドの使い方が違います。コードを実際に書いて検証してみれば、動かないのがすぐに分かります。
元の紹介されている方法はそもそも PHP の文法的におかしいのでそこは適当に修正して紹介します。(変数名に $ がなかったり、generateList() を出力をどこにも保存していないかったりします。)
コントローラで下記のように generateList でリストを取得して
$state_id = $this->State->generateList();
ビューで
echo $form->input($state_id, array('empty' => '--'));
と紹介されています。
CakePHP1.1 の Formヘルパーには input メソッドがないので CakePHP 1.2 でのやり方だと思いますが、実際に Form ヘルパーの input メソッドは
function input($fieldName, $options = array())
と定義されています。上記のように書くと
で、実際にはどう書けばいいかというと
echo $form->input('Model/Field', array('empty'=>'---', 'type'=>'select', 'options'=>$state_list));
または、
echo $form->select('Model/Field', $state_list, null, null, array('empty'=>'---'));
と書けば select タグの先頭に
<option value=''>---</option>
と入ります。
CakePHP1.1 では 「CakePHP HTMLヘルパーで select タグを表示する」のエントリで書いたように結構面倒だったので新しい Form ヘルパーは使いやすいですね。
OpenPNE 特定ページを SSL で接続する
3OpenPNE で個人情報などを送信するようなフォームや管理画面を SSL で接続する方法です。
SSL を使用するように設定を変更する
openpne/config.phpの以下の行を変更
特定ページを SSL で接続するように設定
define('OPENPNE_USE_SSL_PARAM', false);
をdefine('OPENPNE_USE_SSL_PARAM', true);
に変更
これだけで特定ページが SSL で接続されるようになります。
SSL を使用したいアクションを追加する
デフォルトで SSL 接続されるようになっているページ以外も SSL 接続にしたい場合は
$GLOBALS['_OPENPNE_SSL_REQUIRED'] = array( 'pc' => array( 'page_o_regist_prof', 'page_o_regist_prof_confirm', 'do_o_regist_prof', 'page_o_regist_intro', 'page_o_ri', 'page_o_regist_end', 'page_h_config_prof', 'page_h_config_prof_confirm', 'do_h_config_prof', 'page_h_config_ktai', 'do_h_config_ktai_send', ), 'ktai' => array( 'page_o_login', 'do_o_login', 'do_o_easy_login', 'page_o_login2', 'do_o_update_ktai_address', 'page_o_regist_pre', 'page_o_regist_input', 'do_o_insert_c_member', 'page_o_regist_end', 'page_o_password_query', 'do_o_password_query', 'page_h_config_prof', 'do_h_config_prof_update_c_member', 'page_h_config_easy_login', 'do_h_config_easy_login', 'page_h_config_mail', 'do_h_config_mail_insert_c_ktai_address_pre', 'page_h_pc_send', 'page_h_pc_send_confirm', 'do_h_pc_send_insert_c_pc_address_pre', 'page_h_config_password_query', 'do_h_config_password_query_update_password_query', 'page_h_config_password', 'do_h_config_password_update_password', ));
となっているところに SSL 接続したいアクションを追加していく。
例えば、携帯ではリマインダーは SSL 接続になりますが PC では SSL 接続ではありません。
そこで PC でも SSL にしたい場合は上の pc の配列にリマインダーのアクションの “page_o_password_query” を追加します。
これで http://www.example.com/?m=pc&a=page_o_password_query という URL は自動的に
https://www.example.com/?m=pc&a=page_o_password_query へリダイレクトされます。
注意点は上記の URL からフォームが送信される ?m=pc&a=do_o_password_query というURL も SSL にする必要があります。
これをしないとフォームの画面は SSL でも送信先が SSL ではなくなってしまいます。
PC 用のリマインダーを SSL にする場合は “page_o_password_query” と “do_o_password_query” の2つを追加する必要があるということです。
確認画面が入るフォームなどではフォーム画面表示アクション、確認画面表示アクション、実行アクションと3つ追加する必要があります。
ユーザに SSL を使用するか選択させるアクションの追加
ユーザが SSL を使用するか選択できるリストというのもあります。
$GLOBALS['_OPENPNE_SSL_SELECTABLE'] = array( 'pc' => array( 'page_h_config', 'do_h_config_1', 'do_h_config_2', 'do_h_config_3', 'page_o_login', 'page_o_tologin', 'do_o_login', ), 'ktai' => array( 'page_h_config', ));
このリストに追加するとフォームの右上やリンクの下に SSL 用のリンクが表示されユーザが SSL の使用をするか選択することができます。
CakePHP Model::generateList メソッドの {n}
2CakePHP で select タグを生成する際に generateList メソッドをよく使います。
ちなみに使い方は下記の通りです。
$this->Model->generateList($conditions, $order,$limit, $keyPath, $valuePath);
$coditions :検索条件
$order :ソートの指定
$limit :取り出す数
$keyPath :配列のキーにするフィールド
$valuePath :配列の値にするフィールド
この $keyPath と $valuePath の指定方法が曲者で
{n}.Model.field
のようにモデル名の前に「{n}.」をつけなくては正しくデータを取得できません。
この「{n}」というのがなんなのかが気になり調べてみました。
詳しくは下記リンク先を参照していただくと分かります。
{n} ? – Cake PHP | Google グループ
以下実際に CakePHP のコードを調べてみたことをまとめます。
- generateList メソッドでは検索条件などによって findAll する
- findAll したデータから Set::extract メソッドを使用して該当するフィールドデータのみ抜き出す
- Set::extract メソッドは配列以外にもオブジェクトからも extract できるように設計されている
- 配列の場合はモデル名の前に「{n}」があるかどうかで判定している
という感じのようです。
ちなみに Set クラスは /cake/libs/set.php で定義されていて、コメントを見ると配列用のライブラリクラスのようです。
また、generateList で $keyPath, $valuePath を指定しなかった場合は下記のようになるようです。
- $keyPath には モデルで指定した $primaryKey を使用
- $primaryKey の指定がなければ ‘id’ フィールドを使用
- $valuePath には モデルで指定した $displayField を使用
- $displayField の指定がなければ ‘title’ フィールドが存在すれば ‘title’ フィールドを使用
- ‘title’ フィールドが存在しなければ ‘name’ フィールドを使用
- ‘title’ フィールドも ‘name’ フィールドも存在しなければ ‘id’ フィールドを使用
フィールド名の付け方も重要ですね。