find系のサンプル
[]

2009.12.08

このエントリーをはてなブックマークに追加
はてなブックマーク - find系のサンプル

環境

  • CakePHP 1.2.4.8284

全件取得したいが、不等条件が必要な場合。

findAllBy<カラム>だとうまくいかなかったので、以下のようにした。

$this->Mymodel->find('all', array(
    "conditions" =>
        array(
            "Mymodel.code" => $code,
            'Mymodel.del_flag <>' => 1
        )
    )
);

できあがるSQL

SELECT ... 省略 WHERE `Mymodel`.`code` = 'XA00001' AND `Mymodel`.`del_flag` <> '1'

CakePHP メモ
[]

2009.11.20

このエントリーをはてなブックマークに追加
はてなブックマーク - CakePHP メモ

環境

  • CakePHP 1.2.5

モデル

アプリケーションモデル

すべてのモデルの基底クラスを定義したい場合。

// @path app/app_model.php
class AppModel extends Model {
}

ビヘイビア

継承を使わずにメソッドをモデルに追加したい場合。

作り方

Myaclビヘイビアの作成。

// @path app/model/behaviors/myacl.php
class MyaclBehavior extends ModelBehavior {
    function check(){
        // TODO: nothing special.
    }
}

参考リンク - CakePHP API Ref: ModelBehavior Class Info

使い方

モデル内で。

// @path app/models/mymodel.php
class Mymodel extends AppModel {
    public $name = 'Mymodel';
    public $actsAs = array('Myacl');
}

コントローラー内

$this->Mymodel->check();

参考リンク - CakePHP API Ref: 3.8.1 ビヘイビアを使用する

コントローラー

アプリケーションコントローラー

コントローラー全体で共通して使うメソッドを集めたコントローラーを定義する。

// @path app/app_controller.php
class AppController extends Controller
{
}

コンポーネント

コントローラー全体で使い回せるツールを定義する。

作り方
// @path app/controllers/components/hoge
class HogeComponent extends Object
{
    function someMethod(){
        // ...
    }
}
使い方

コントローラー内で。

$components = array('Hoge');
// ...
$this->Hoge->someMethod();
// ...

レイアウトの切り替え

コントローラー内で。

$this->layout = 'other'; // app/views/layouts/other.ctp を使う。

自動レンダリングの無効化

コントローラー内で。

$this->autoRender = false;

ページネーション

コントローラー内で。

$this->pagenator = array();

GROUP BY対策

// @path app/app_model.php
function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
  $parameters = compact('conditions');
  $this->recursive = $recursive;
  $count = $this->find('count', array_merge($parameters, $extra));
  if (isset($extra['group'])) {
    $count = $this->getAffectedRows();
  }
  return $count;
}

バリデーション

モデル内で。

// @path app/models/hoge.php
class Hoge extends AppModel
{
  public $name = "Hoge";
  public $validate = array(
    'myfield' => array(
      'rule1'=>array(
        'rule'=>'notEmpty',
        'message'=>'なんか入力してください。',
      )
    )
  );
}

コントローラー内で。

// ...
public $uses = array("Hoge");
// ...
function add($id)
{
  // TODO: 初期化処理
  $hoge = $this->Hoge->findById($id);
  $errors = array();
 
  if( ! empty($this->data))
  {
    $this->Hoge->set($this->data);
    if($this->Hoge->validates() )
    {
      // 入力検査クリア
      // TODO: 確認ページ表示処理
      $this->render('add_confirm');
    }
    else
    {
      // 入力検査失敗
      $errors = $this->Hoge->invalidFields();
    }
  }
  // TODO: デフォルト表示処理
  $this->set('hoge', $hoge);
}

Ajax

ビュー内で

// jqueryロード済み
<script type="text/javascript">
$.getJSON("/controller/myaction", function(o){
  // コールバック処理
  if(o.hasError){
    // エラー;
  }
  else{
    // 成功;
  }
});
</script>

コントローラー内で

function myaction()
{
  if($this->RequestHandler->isAjax() ){
    $this->layout = 'ajax';
    Configure::write("debug", 0);
   
    $data = $this->Mydata->findById(1);
    if(empty($data) ){
      $err = array("hasError"=>"エラー");
      echo json_encode($err);
      exit; //=> exitしないとjquery側のコールバックが動作しない。
    }
   
    echo json_encode($data);
    exit; //=> exitしないとjquery側のコールバックが動作しない。
  }
  else{
    // エラーにする場合。
    $this->cakeError('error404');
  }
}

ビュー

ヘルパー

データを変換して出力するためのフィルターとかを定義する。

作り方
// @path app/views/helpers/hoge.php
class HogeHelper extends AppHelper
{
     function someMethod(){}
}
使い方

コントローラー内で。

$helpers = array('Hoge');

ビューテンプレート内で。

<?php $hoge->someMethod(); ?>

トランザクション

コントローラー内で。

$db =& ConnectionManager::getDataSource('default');
$db->begin($this->Mymodel);
if( ! $this->Employee->save($data ) ) {
    $db->rollback($this->Mymodel);
}
$db->commit($this->Mymodel);

エラー関連

404エラーにする

404エラービュー

<!-- @path app/views/errors/error404.ctp -->
ERROR: ページが見つかりませんでした。

コントローラー内で。

$this->cakeError('error404');

アプリケーションエラーハンドラ

// @path app/error.php
class AppError extends ErrorHandler
{
    function error404($params)
    {
  $this->controller->layout='error'; // レイアウトを切り替える場合。
  parent::error404($params);
    }
}

キャッシュ

無効化

// @path app/cofig/core.php
Configure::write('Cache.disable', true);

プラグイン

使い回せるモデル/コントローラー/ビューのセットを定義する場合。

作り方

使い方

テスト

ログ出力

  • モデル内で
  • コントーラー内で
  • コンポーネント内で
  • ビュー内で
  • ヘルパー内で
$this->log($somevar, LOG_DEBUG);

つまり、logメソッドで行けます。 ログが多くなるとラベル必要になるので、以下のようにしてます。

$this->log("なんかラベル:" . print_r($somevar, TRUE), LOG_DEBUG);

自分は、unix系なので、

$ tail -f app/tmp/logs/debug.log

でデバッグ出力を見張って、変数の内容を確認してます。