CakePHPにはBakeがあります。皆様利用されている方も多いかと思います。
データベースを元に登録画面や一覧画面などを自動で出力してくれる機能です。
拡張すれば独自の機能も作れますが、その話はどこかで。。。
今回は基本的にはCakePHPの本体を変更するのはあまりしたくはないのですが
Bake時に出力される「Controller」が個人的にはそのままでは使いづらく
開発の効率が若干無駄になる気がしたので変更してみました。
変更したのは「cake/console/libs/tasks」にある「controller.php」の中を変更。
変更したコードは「bakeActions()」内を次のように変更し、どのような機能にしたかというと
コントローラー名を基本的に記述させないことと、セッションメッセージの出力を変更したことが主になります。
function bakeActions($controllerName, $admin = null, $wannaUseSession = true) { $currentModelName = $modelImport = $this->_modelName($controllerName); if ($this->plugin) { $modelImport = $this->plugin . '.' . $modelImport; } if (!App::import('Model', $modelImport)) { $this->err(__('You must have a model for this class to build scaffold methods. Please try again.', true)); exit; } $actions = null; $modelObj =& new $currentModelName(); $controllerPath = $this->_controllerPath($controllerName); $pluralName = $this->_pluralName($currentModelName); $singularName = Inflector::variable($currentModelName); $singularHumanName = Inflector::humanize($currentModelName); $pluralHumanName = Inflector::humanize($controllerName); $actions .= "\n"; $actions .= "\tfunction {$admin}index() {\n"; $actions .= "\t\t\$this->{\$this->modelClass}->recursive = 0;\n"; $actions .= "\t\t\$this->set('{$pluralName}', \$this->paginate(\$this->modelClass));\n"; $actions .= "\t}\n"; $actions .= "\n"; $actions .= "\tfunction {$admin}view(\$id = null) {\n"; $actions .= "\t\tif (!\$id) {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('Invalid %s.', true),__(\$this->modelClass,true)));\n"; $actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n"; } else { $actions .= "\t\t\t\$this->flash(sprintf(__('Invalid %s.', true)),__(\$this->modelClass,true)), array('action'=>'index'));\n"; } $actions .= "\t\t}\n"; $actions .= "\t\t\$this->set('" . $singularName . "', \$this->{\$this->modelClass}->read(null, \$id));\n"; $actions .= "\t}\n"; $actions .= "\n"; /* ADD ACTION */ $compact = array(); $actions .= "\tfunction {$admin}add() {\n"; $actions .= "\t\tif (!empty(\$this->data)) {\n"; $actions .= "\t\t\t\$this->{\$this->modelClass}->create();\n"; $actions .= "\t\t\tif (\$this->{\$this->modelClass}->save(\$this->data)) {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s has been saved', true),__(\$this->modelClass,true)));\n"; $actions .= "\t\t\t\t\$this->redirect(array('action'=>'index'));\n"; } else { $actions .= "\t\t\t\t\$this->flash(sprintf(__('The %s has been saved.', true),__(\$this->modelClass,true)), array('action'=>'index'));\n"; } $actions .= "\t\t\t} else {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s could not be saved. Please, try again.', true),__(\$this->modelClass,true)));\n"; } $actions .= "\t\t\t}\n"; $actions .= "\t\t}\n"; foreach ($modelObj->hasAndBelongsToMany as $associationName => $relation) { if (!empty($associationName)) { $habtmModelName = $this->_modelName($associationName); $habtmSingularName = $this->_singularName($associationName); $habtmPluralName = $this->_pluralName($associationName); $actions .= "\t\t\${$habtmPluralName} = \$this->{\$this->modelClass}->{$habtmModelName}->find('list');\n"; $compact[] = "'{$habtmPluralName}'"; } } foreach ($modelObj->belongsTo as $associationName => $relation) { if (!empty($associationName)) { $belongsToModelName = $this->_modelName($associationName); $belongsToPluralName = $this->_pluralName($associationName); $actions .= "\t\t\${$belongsToPluralName} = \$this->{\$this->modelClass}->{$belongsToModelName}->find('list');\n"; $compact[] = "'{$belongsToPluralName}'"; } } if (!empty($compact)) { $actions .= "\t\t\$this->set(compact(" . join(', ', $compact) . "));\n"; } $actions .= "\t}\n"; $actions .= "\n"; /* EDIT ACTION */ $compact = array(); $actions .= "\tfunction {$admin}edit(\$id = null) {\n"; $actions .= "\t\tif (!\$id && empty(\$this->data)) {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('Invalid %s', true),__(\$this->modelClass,true)));\n"; $actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n"; } else { $actions .= "\t\t\t\$this->flash(sprintf(__('Invalid %s', true),__(\$this->modelClass,true)), array('action'=>'index'));\n"; } $actions .= "\t\t}\n"; $actions .= "\t\tif (!empty(\$this->data)) {\n"; $actions .= "\t\t\tif (\$this->{\$this->modelClass}->save(\$this->data)) {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s has been saved', true),__(\$this->modelClass,true)));\n"; $actions .= "\t\t\t\t\$this->redirect(array('action'=>'index'));\n"; } else { $actions .= "\t\t\t\t\$this->flash(sprintf(__('The %s has been saved.', true),__(\$this->modelClass,true)), array('action'=>'index'));\n"; } $actions .= "\t\t\t} else {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\t\$this->Session->setFlash(sprintf(__('The %s could not be saved. Please, try again.', true),__(\$this->modelClass,true)));\n"; } $actions .= "\t\t\t}\n"; $actions .= "\t\t}\n"; $actions .= "\t\tif (empty(\$this->data)) {\n"; $actions .= "\t\t\t\$this->data = \$this->{\$this->modelClass}->read(null, \$id);\n"; $actions .= "\t\t}\n"; foreach ($modelObj->hasAndBelongsToMany as $associationName => $relation) { if (!empty($associationName)) { $habtmModelName = $this->_modelName($associationName); $habtmSingularName = $this->_singularName($associationName); $habtmPluralName = $this->_pluralName($associationName); $actions .= "\t\t\${$habtmPluralName} = \$this->{\$this->modelClass}->{$habtmModelName}->find('list');\n"; $compact[] = "'{$habtmPluralName}'"; } } foreach ($modelObj->belongsTo as $associationName => $relation) { if (!empty($associationName)) { $belongsToModelName = $this->_modelName($associationName); $belongsToPluralName = $this->_pluralName($associationName); $actions .= "\t\t\${$belongsToPluralName} = \$this->{\$this->modelClass}->{$belongsToModelName}->find('list');\n"; $compact[] = "'{$belongsToPluralName}'"; } } if (!empty($compact)) { $actions .= "\t\t\$this->set(compact(" . join(',', $compact) . "));\n"; } $actions .= "\t}\n"; $actions .= "\n"; $actions .= "\tfunction {$admin}delete(\$id = null) {\n"; $actions .= "\t\tif (!\$id) {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('Invalid id for %s', true),__(\$this->modelClass,true)));\n"; $actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n"; } else { $actions .= "\t\t\t\$this->flash(sprintf(__('Invalid %s', true),__(\$this->modelClass,true)), array('action'=>'index'));\n"; } $actions .= "\t\t}\n"; $actions .= "\t\tif (\$this->{\$this->modelClass}->del(\$id)) {\n"; if ($wannaUseSession) { $actions .= "\t\t\t\$this->Session->setFlash(sprintf(__('%s deleted', true),__(\$this->modelClass,true)));\n"; $actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n"; } else { $actions .= "\t\t\t\$this->flash(sprintf(__('%s deleted', true),__(\$this->modelClass,true)), array('action'=>'index'));\n"; } $actions .= "\t\t}\n"; $actions .= "\t}\n"; $actions .= "\n"; return $actions; }
ほぼ変えてしまったので、まるまる記載しました。
かなり長くはなります(笑
コメント
[…] CakePHP Bakeの機能を変更してみる | WIDGET-INFO […]