Scaffold めっちゃ楽なので大好きですが、MySQL のENUMは全く反映されませんよね。そこで、簡単なカスタマイズでENUMのデータ型に対してselectのoptionを実装する方法です。
ENUMはRDBMSの標準規格ではないらしいのでCakePHPの開発陣は全く無視を決め込んでおられるのでしょう。調べたけど全然出てきません。
標準だかどうだかはこの際どうでもいいので、これを実現してもっと楽したいという方のためにもメモ。

(※後日FormHelperのinputメソッドを拡張する実装を試してみました。興味のある方はこちらをご覧ください → CakePHP の FormHelper::input で、ENUM型を自動的にselect-optionタグにする方法

View/Scaffolds/form.ctp のコードを少しいじります。

あっさりとした簡易版なのでいくつか問題点がありますから、気になる人は改良してください。

先に問題点を申しますと、

  • enumにクォートだとか、カンマだとか、エスケープが必要な文字は考慮していません。

そのあたりは以下をベースにして作りこめば何とかなるでしょう。

ではまず、 App/View/Scaffolds/ にオリジナルの Cake/View/Scaffolds/form.ctp をコピーします。これに少しコードを追加するだけです。

で、どこにコードを追加するかというと

echo $this->Form->create();
echo $this->Form->inputs($scaffoldFields, array('created', 'modified', 'updated'));

この、2行の間です。そこに以下のコードを挿入。

/*--- | Implementation of MySQL's "enum" datatype | start | ---*/
$defaultModel = ClassRegistry::init( $this -> Form -> defaultModel );
$matchPattern = '/^enum\(\'(.+)\'\)$/u';    // 改良の余地ありですね
$_scaffoldFields = array();
foreach( $scaffoldFields as $field ) {
    $_schema = $defaultModel -> _schema[$field];

    if( isset( $_schema['type'] ) && preg_match( $matchPattern, $_schema['type'], $m ) ) {
        $_options = explode( ",", $m[1] );
        $options = $_schema['null'] ? array( null => '', ) : array();
        foreach( $_options as $_option ) {
            $value = trim( $_option, "'" );
            $options[$value] = $value;
        }

        $_scaffoldFields[$field] = array(
            'options' => $options,
        );
        /*---------------------------------------
         デフォルトの値は FormHelper が自動的に補完
        $_scaffoldFields[$field]['value'] => $_scema['default'];
        ---------------------------------------*/
        unset( $_options, $_option, $options );
    } else {
        $_scaffoldFields[] = $field;
    }
}
$scaffoldFields = $_scaffoldFields;
unset( $defaultModel, $matchPattern, $_schema, $_scaffoldFields );
/*--- | Implementation of MySQL's "enum" datatype | end | ---*/

ポイントは、このコードを挿入する位置、でしょうか?
先に述べた2行の間しかダメなんですねぇ。
特に Form::create の後におかないと Form::$defaultModel が更新されないので Model::_schema を正しく拾えません。

問題点を再度述べますと、

  • ENUMの文字列を正規表現で分解するときにあまり凝ったことをしてないので、カンマやシングルクォーテーションを含んだ値は大変なことになります。

そういえば、はるか昔まだ1.2になるかどうかって頃に同じ目的のカスタマイズに一度挑戦したことがあったのですが挫折したような記憶が(^^;)
ただ、あの時は全くよく分かってなかったこともありますが、そもそも MySQL の ENUMの設定をCakePHP自体が拾っていなかったような気がします。
そのころを思えば少しはENUMというデータ型が日の目を浴びてきたようでもありますが、もっと全面的にプッシュしてくれないものでしょうかねぇ。MySQLの内部ではENUMは数値で扱ってますから動作はキビキビ、データは軽量、見た目は人にやさしい、という3拍子揃った素晴らしいデータタイプではないかと。

あと気になる点は、このカスタマイズはビューでやるよりも FormHelper でやったほうがいいんじゃないの?っていうこと。FormHelper::input()メソッドをオーバーライドする方法を今度模索してみます。(追記:やってみました→FormHelper で、ENUM型を自動的にselect-optionタグにする方法)

いずれにしても簡単にカスタマイズできて気に入らなければきれいに元に戻せますからENUMを使ったテーブルの scaffolding の際には一度お試しあれ。これを実装できるかどうかで楽さ加減がだいぶ違うと思いますよ。


[追記]

以下のQ&Aにおいて、ControllerとBehaviorとでENUMをあつかうTIPSが書かれてるのを発見。参考になります。(さらに追記。後日わたし = zuborawka 自身の回答もアップしてみました。)

CakePHP 2.0 – Use MySQL ENUM field with form helper to create Select Input

質問者 Tomas Gonzalez氏 が「CakePHP の FormHelper は ENUM をサポートしていないようだから記事を探したんだけど、だれかいい方法知りませんか?」
ってなことを聞いたら

回答者 Moz Morris氏 が「CakePHPは標準仕様に準拠するように作ってるんで、それはバグじゃなくて仕様だし、これからも変わることはないでしょう」って答えます。

で、その方が Gonzalez氏におすすめしているコードがこちら。まぁ、ヒント程度なので、これをもとにしてってことですね。

YourController.php

// get column type
 $type = $this->Model->getColumnType('field');

// extract values in single quotes separated by comma
 preg_match_all("/'(.*?)'/", $type, $enums);

// enums
 var_dump($enums[1]);

なるほど、Model::getColumnType() を使うといいんですね。

これにGonzalez氏がお礼を述べると同時に、「でも Controllerじゃなくて Model 側でなんとかならないものだろうか。」とリプライ。

すると別の回答者 Natdrip氏が、昔のコードなんかを繋ぎ合わせてこんなの作ったよと、EnumerableBehavior を紹介してくれています。
これはいいですね。

/**
* Behavior with useful functionality around models containing an enum type field
*
* Copyright (c) Debuggable, http://debuggable.com
*
*
*
* @package default
* @access public
*
* reworked by Nathanael Mallow for cakephp 2.0
*
*/
/*
 *Use case:Add this (EnumerableBehavior.php)  to app/Model/Behavior/
 *  -->in the Model add public $actsAs = array('Enumerable');     
 *  -->in the *_controller add $enumOptions = $this->Categorie->enumOptions('Section');
 *  -->in the view add print $this->Form->input('{db_field_name}', array('options' =>       $enumOptions, 'label' => 'here'));
 *
 *
 */
class EnumerableBehavior extends ModelBehavior {
/**
 * Fetches the enum type options for a specific field
 *
 * @param string $field 
 * @return void
 * @access public
 */
  function enumOptions($model, $field) {

 //Cache::clear(); 
 $cacheKey = $model->alias . '_' . $field . '_enum_options';
 $options = Cache::read($cacheKey);

 if (!$options) {
  $sql = "SHOW COLUMNS FROM `{$model->useTable}` LIKE '{$field}'";
  $enumData = $model->query($sql);

      $options = false;
      if (!empty($enumData)) {
    $enumData = preg_replace("/(enum|set)\('(.+?)'\)/", '\\2', $enumData[0]['COLUMNS']['Type']);
    $options = explode("','", $enumData);   
      }
      Cache::write($cacheKey, $options);
    }
    return $options;
  }
}

あとこれは古い記事でたぶん1.2ぐらいではないかと思うのですが、Controller::beforeRenderでの実装方法のアイデアがBakeryに掲載されています。

Baked enum fields reloaded