カテゴリー別アーカイブ: cakephp

cakephp2(2.4.4)でcontent-typeを変更

Resource interpreted as Image but transferred with MIME type text/html
というメッセージが出ていたので調査。

確かに画像を直接開くと、text/htmlなので画像が表示されない。

しかも、画像を出力している2つのコントローラで挙動が違うという謎現象。
AppControllerで画像出力処理を定義し、各コントローラーから呼び出している。
以下のように一見2重の設定をすると治った。
片方だけだと、片方のコントローラではtext/htmlになってしまう。
不思議だ、、、

class AppController extends Controller {
  function resize_image(array $options) {
    ...
    header("Content-Type: {$size['mime']}");
    $this->response->type($size['mime']);
    ...
  }
}

[cakephp] find(‘count’)について

何も考えずに、

        $params =
            array(
                "conditions" =>  $conditions,   // 検索条件
                'fields' => array('User.id')
            );
        $count = $this->User->find("count", $params);

とやって、$countが帰ってこないなあと思ったら。
fieldsを指定していると、countが実行されないらしい。
参考:http://d.hatena.ne.jp/solitary_shell/20090228/1235816868

        $params =
            array(
                "conditions" =>  $conditions,   // 検索条件
                'fields' => array()
            );
        $count = $this->User->find("count", $params);

として、対応。

[cakephp]他のコントローラーへPOSTすると何も表示されない

他のコントローラーの処理へPOSTで遷移しようとすると、何も表示されないままおわってしまうという現象に遭遇。
Securityコンポーネントを使用していたため発生していた。
そんなにセキュリティに気を使わなくてもよい画面だったので、Securityコンポーネントをはずして対処。

[cakephp] group by を使っていると paginateが返す値がおかしい。

group byを使用して、paginateを使うと、帰ってくる値がおかしい。
結局、以下のように自分で計算・取得しなおして、対処した。

        $params =
            array(
                "conditions" => array('Test.keyword' => $keyword),   // 検索条件
                'fields' => array('Test.id'),
                'group'=>'Test.id',
                'order'=>'Test.created'
            );

        $this->Test->recursive = 0;

        $this->paginate = array_merge($params, array("limit" => $limit));
        $results = $this->paginate();

        // paginateが返す件数とページ数などがおかしいので修正する
        $sql = 'SELECT id
                FROM tests Test'
;
        $sql .= " WHERE keyword='".$keyword."' ";
        $sql .= " GROUP BY id ";
        $results_count = $this->Test->query($sql, false);

        $this->params['paging']['Test']["current"] = isset($this->params["named"]["page"]) ? $this->params["named"]["page"] : 1;
        $this->params['paging']['Test']["page"] = isset($this->params["named"]["page"]) ? $this->params["named"]["page"] : 1;
        $this->params['paging']['Test']["count"] = count($results_count);
        $this->params['paging']['Test']["pageCount"] = intval(ceil(count($results_count) / $limit));
        $this->params['paging']['Test']["prevPage"] = ($this->params['paging']['Test']["page"] > 1);
        $this->params['paging']['Test']["nextPage"] = ($this->params['paging']['Test']["count"] > ($this->params['paging']['Test']["page"] * $limit));

        // paginateが返すレコードがおかしいので修正する
        $limit_from = ($this->params['paging']['Test']["current"]-1) * $limit;

        $sql = 'SELECT id
                FROM tests Test'
;
        $sql .= " WHERE keyword='".$keyword."' ";
        $sql .= " GROUP BY id ";
        $sql .= " LIMIT  ".$limit_from.",".$limit;
        $results = $this->Test->query($sql, false);

[cakephp]input(“id”)はhiddenになる

最近は、cakephpの仕事をしています。
個人的メモ。

echo $form->input(‘id’);

と記述すると、

のようなタグが出力される。
idは、キーとして使用される事が多いので、cakeが自動的に判断して、hiddenにしているようだ。
親切なんだけど、しばらく悩んだ。