2014年03月30日

[CakePHP2.x] フォームのセレクトボックスで複数選択やグループ作成する

セレクトボックスには、色々なパターンがあるので、簡単に調べたことを記載する。

単一選択のセレクトボックス

複数の選択肢から1つを選ぶセレクトボックス。
配列の1番目が値で、2番目が表示される文字列。

$list = array('1' => 'abc, '2' => 'efg', '3' => 'hij');
$form->input('hogehoge', array(
  'type' => 'select',
  'options' => $list
));

実行結果:

単一のセレクトボックス実行結果

複数選択可能なセレクトボックス

shift押しながら選択すると、複数選択できるセレクトボックス。
'multiple' => trueを指定すると出来る。

$list = array('1' => 'abc, '2' => 'efg', '3' => 'hij');
$form->input('hogehoge', array(
  'type' => 'select',
  'options' => $list
));

実行結果:

複数選択可能なセレクトボックス実行結果

グループ化したセレクトボックス

グループ化したセレクトボックスは、配列を2次元配列にうすると可能になる。

$selectValue = array('group1' =>array('1'=>'abc', '2'=>'def', '3'=>'ghi'),'group2' => array('4' => 'opq','5' => 'rst'));
$form->input('hogehoge', array(
  'type' => 'select',
  'options' => $list
));

実行結果:

グループ化したセレクトボックス実行結果 

関連記事

ラベル:PHP cakephp フォーム
posted by lute at 14:49| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

[CakePHP2.x] フォームでセレクトボックスのデフォルト値を変更する

ユーザーに入力してもらうフォームで、セレクトボックスを作ると、デフォルトで選択されるのは配列の一番上になってしまう。
下記例だと、「abc」が選択された状態になっている。

$list = array('1' => 'abc, '2' => 'efg', '3' => 'hij');
$form->input('hogehoge', array(
  'type' => 'select',
  'options' => $list
));

が、ユーザーが前画面で見ていた情報を引き継ぎたいとか何だとか、デフォルト値を変えたいシーンがあると思う。
その時、どうやるかというとselectedで配列の番号を渡す。
以下の例だと、「efg」が選択された状態にデフォルトがなっている。

$list = array('1' => 'abc, '2' => 'efg', '3' => 'hij');
$form->input('hogehoge', array(
  'type' => 'select',
  'options' => $list,
  'selected' => 2
));

関連記事>
ラベル:PHP cakephp フォーム

posted by lute at 12:18| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2014年03月29日

[CakePHP2.X] メソッドの可視性

PHP5はクラスを書けるので、publicなメソッドだけではなく、protectedやprivateなメソッドを定義できる。

CakePHPでは、「_」を1つ付けるとprotected、「_」を2つ付けるとprivateメソッドになる。

class hogesController extends Appcontroller{
    // public宣言と同じ
    function publicFunc() {
    }

    // protected宣言と同じ
    function _protectedFunc() {
    }

    // private宣言と同じ
    function __privateFunc() {
    }

}
といいつつ、慣れなくて後で読んでも分かり辛いから、下記のように書いてしまっている。 下記でも動き的には問題ないが、規約に従ったほうが良いとは思う。
class hogesController extends Appcontroller{
    public function publicFunc() {
    }

    protected function _protectedFunc() {
    }

    private function __privateFunc() {
    }
}
ラベル:PHP cakephp
posted by lute at 02:59| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2014年03月27日

[CakePHP2.x] クエリ文字列の受け取り方

よくある「http://example.com/foo/var.php?name1=10&name2=20」のようなURLパラメータをCakePHPで受け取る方法。

URLパラメータは、paramsのurlキーに入ってくる。

$this->params['url']

最初に例示したURLだと、以下のようにすれば取得できる。

public function index() {
    $value1 = $this->params['url']['name1']; // 10
    $value2 = $this->params['url']['name2']; // 20
}

他にもCakePHPで値を渡す手段はあるけど、それは関連記事で。

関連記事

  • リダイレクト時の引数[URL]
ラベル:cakephp PHP
posted by lute at 20:51| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2014年03月25日

[CakePHP2.x] リダイレクト時の引数

CakePHPのブログチュートリアルに、下記のようにリダイレクトが載っている。
自分の作っているサンプルアプリで、引数を渡したいなと思ったので、やり方を調べてみた。

return $this->redirect(array('action' => 'index'));

このリダイレクト時に引数を渡したい時のやり方。
下記のように、アクション名の後に続ければよい。1つでも複数でも可。

public function add() {
    ・・・省略・・・
    return $this->redirect(array('action' => 'index','引数1','引数2'));
}

受け取る方のメソッドには、以下のように記載しておくと使える。

public function index($id = null, $id2 = null) {
    $this->set('posts', $this->Post->find('all'));
}
ラベル:cakephp PHP
posted by lute at 20:53| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2014年03月22日

[PHP] 配列の空要素を削除する

フォームで入力させて、入力項目がオプションの時等に、配列が空の場合がある。
計算したい時や空を除いて処理したい時とか、要素としては邪魔なので削除したい。
そんな時には、array_filter()を使用するの方法があるようだ。

配列の空要素を削除する

真ん中が空の配列を作成して、array_filter()を実行してみる。

$valueArray = array(1,2,'',4,5);
print_r($valueArray);
$valueArray = array_filter($valueArray);
print_r($valueArray);

結果は以下のようになる。

Array ( [0] => 1 [1] => 2 [2] => [3] => 4 [4] => 5 ) 
Array ( [0] => 1 [1] => 2 [3] => 4 [4] => 5 ) 

ちゃんと空の3つめの要素が削除されている。

配列の添え字を振りなおす

array_filter()を実行するだけだと、配列の添え字は元のまま。
添え字でアクセスする場合等は振り直したい。
そういう場合は、array_values()を更に実行すると振り直してくれる。

$valueArray = array(1,2,'',4,5);
$valueArray = array_values(array_filter($valueArray))
print_r($valueArray);

結果は以下のようになり、0、1、3、4だったのが、0、1、2、3に変わっている。

Array ( [0] => 1 [1] => 2 [2] => [3] => 4 [4] => 5 ) 
Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 )

なるべく配列の順序には依存しないプログラムにしたいけど、何かあった時には使えそう。

参考

ラベル:PHP cakephp
posted by lute at 21:00| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

[CakePHP2.x] フォームから保存時にデータを追加する方法

フォームからデータ入力してもらって、合わせて値を追加して保存したい(例えば入力してもらった値の平均値とか)という時に、どうやれば良いのかわからなかったので調べた。
つまり、連想配列への追加をどうやるかっていう話なんだけど。

<?php
public function add() {
        if ($this->request->is('post')) {
            $this->Post->create();
            if ($this->Post->save($this->request->data)) {
                $this->Session->setFlash(__('Your post has been saved.'));
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('Unable to add your post.'));
        }
    }
?>

上記がチュートリアルのBlogのコード。
実際にフォームで入力したデータが、連想配列で以下に入ってくる。

$this->request->data

その時、Postテーブルのhogehogeという行にも、ユーザーが入力していないけど値を追加したいという時は、 saveの前に以下のように連想配列に追加すれば出来る。
以下は、hogehogeにvalという値を追加して保存している。

$this->request->data['Post']['hogehoge'] = 'val';
$this->Post->save($this->request->data)
ラベル:PHP cakephp フォーム
posted by lute at 13:59| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2014年03月21日

[PHP] 平均値を求める

今回はCakePHPではなく、普通のPHPライブラリを使用する。

<?php
$speed = array(10.463,12.44,11,25.7,18,5.067);
$total = array_sum($speed);
$average = round($total/count($array),2);
?>

array_sum()で配列の合計値を求めて、countで配列数を数えて割り算している。
roundは、計算結果を小数点有効桁数2桁で四捨五入している。

各関数の説明

関数名

説明

array_sum() 配列の中の値の合計を計算する
count() 配列の要素を数える
round() 浮動小数点を丸める

もし、切り捨てで計算したいなら、roundで第3引数を以下のように指定すれば良いみたい。

$average = round($total/count($array),2,PHP_ROUND_HALF_DOWN);

参考

ラベル:PHP
posted by lute at 22:00| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

[CakePHP2.x] find(‘all’)で条件を指定して抽出する方法

Blogチュートリアルだと、find('all')で、postsテーブルにあるデータを全部引っ張ってきている。

<?php
class PostsController extends AppController {
    public $helpers = array('Html', 'Form');

    public function index() {
        $this->set('posts', $this->Post->find('all'));
    }
}
?>

しかし、条件で絞り込んで検索したいときはある。
というので、id=1のブログ記事のみ抽出し、降順で検索結果を返すやり方。

<?php
class PostsController extends AppController {
    public $helpers = array('Html', 'Form');

    public function index() {
        $conditions = array(
            'conditions' => array(
                'Post.id' => 1
                ),
            'order' => array(
                'Post.title' => 'desc',
                )
        );
        $this->set('posts',$this->Post->find(‘all‘,$conditions));
    }
}
?>

上記は1つしか引っかからないので、全然実用的ではないが、conditionsをfind()の引数で指定できる。「order」で、'asc'を指定すれば昇順になる。

and条件で複数指定したい場合は、以下のように複数記載すれば良い。

$conditions = array(
        'conditions' => array(
            'Post.id' => 1,
            'Post.Title' => 'test'
        ),
    );

参考

データを取得する[CakePHP]

ラベル:PHP cakephp 検索
posted by lute at 21:29| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

[CakePHP2.x] チュートリアルのBlogを作ってみる

と言っても、CakePHPサイトのブログチュートリアルをそのまま辿れば特に問題なく出来た。
これだと、流石に書くこと無さすぎるので、写経そのままして、よく分からなかったり、ハマったりした所を書いておく。

命名規約

CakePHPは、名前でそれぞれがマッピングされるようにできている。
公式サイトの規約にも説明があるのだが、表でまとめると以下の感じ。

名前とファイル名の関係

Database
(table名)

Model

Controller

View

名前 posts Post PostsController

-

ファイル名

-

Post.php PostsController.php /Model/Posts/の下に置いたファイル

上記のような関係になっている。大文字/小文字や、Modelだけ複数形が単数形になるのが分かりにくい気がするんだが、英語圏の人は普通なのかね。

単語が2つ繋がってたり、複数のテーブルを結合するのは、また別の機会に。

CakePHPはPHPだ

おまえは何言ってるんだという感じだが、最初分からなかったので。
Model.phpを作成すると思うんだけど、チュートリアルに以下のように記載されているんだよね。

class Post extends AppModel {
}

んで、そのまま書くと画面に「class Post extends AppModel」とか表示されてるし、何だこれ?と思ってた。
PHPの構文で囲んでいなかったからだー、と気づいたのは後になってから。

<?php
class Post extends AppModel {
}
?>
ラベル:PHP cakephp
posted by lute at 15:59| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。