バグ #110 カスタムフィールドの登録が出来ない
カスタムフィールドが登録できないバグを治しました。修正は1行ですが原因の特定に2時間近く掛かりました。カスタムフィールドは表示順をpostionという項目で制御しており、管理画面の矢印をクリックすることでソートすることができます。この機能を実装しているのがlistビヘイビアで、このビヘイビアを実装すればどんなテーブルでもたちまち並び替えが出来るようになるというものです。このビヘイビアのbeforeSaveに問題がありました。(答えはコードの後にあるので、じっくり見てから読み進めても良いですよ)

  function beforeSave(&$Model) {
    $result = true;
    if(empty($Model->id)) {
      $position_column = $this->settings[$Model->alias]['column'];
      $conditions = $this->settings[$Model->alias]['scope'];
      $result = $Model->find('first', array('conditions'=>$conditions, 'order'=>"$position_column DESC"));
      if($result) {
        $Model->data[$Model->alias][$position_column] = $result[$Model->alias][$position_column] + 1;
      }
    }
    return $result;
  }

さて、わかりましたか?
問題があったのは11行目。挿入しようとしたデータと同じpostionの行があった場合は番号をインクリメントするのですが、テーブルが空の場合などデータが無いと$resultがfalseになりbeforeSaveが異常終了してしまいます。なので修正はこれをtrueに変えただけです。モデルのコールバックやバリデーションを自作した場合は最後の戻り値に注意深くなければならないという事を再確認しました。

でもこれでチケットやプロジェクト、ユーザーに好きな項目を拡張する事ができるようになりましたね!