2006-04-24 16:38:16 +00:00
#!/usr/bin/php -q
2005-07-04 01:07:14 +00:00
< ? php
2005-08-21 06:49:02 +00:00
/* SVN FILE: $Id$ */
2005-05-22 23:24:09 +00:00
/**
2006-07-18 11:11:44 +00:00
* Command - line code generation utility to automate programmer chores .
2006-07-23 18:59:52 +00:00
*
2006-07-18 11:11:44 +00:00
* Bake is CakePHP ' s code generation script , which can help you kickstart
* application development by writing fully functional skeleton controllers ,
* models , and views . Going further , Bake can also write Unit Tests for you .
2005-08-21 06:49:02 +00:00
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework < http :// www . cakephp . org />
2006-05-26 05:29:17 +00:00
* Copyright ( c ) 2005 , Cake Software Foundation , Inc .
* 1785 E . Sahara Avenue , Suite 490 - 204
* Las Vegas , Nevada 89104
2005-08-21 06:49:02 +00:00
*
2005-12-23 21:57:26 +00:00
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
2005-08-21 06:49:02 +00:00
*
2006-01-13 23:53:23 +00:00
* @ filesource
2006-05-26 05:29:17 +00:00
* @ copyright Copyright ( c ) 2005 , Cake Software Foundation , Inc .
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP Project
* @ package cake
* @ subpackage cake . cake . scripts . bake
* @ since CakePHP v 0.10 . 0.1232
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
*/
2006-06-14 18:02:37 +00:00
define ( 'DS' , DIRECTORY_SEPARATOR );
if ( function_exists ( 'ini_set' )) {
ini_set ( 'display_errors' , '1' );
ini_set ( 'error_reporting' , '7' );
}
2006-10-10 18:24:25 +00:00
$app = null ;
2006-05-26 05:29:17 +00:00
$root = dirname ( dirname ( dirname ( __FILE__ )));
$core = null ;
$here = $argv [ 0 ];
$help = null ;
$project = null ;
for ( $i = 1 ; $i < count ( $argv ); $i += 2 ) {
switch ( $argv [ $i ]) {
case '-a' :
case '-app' :
$app = $argv [ $i + 1 ];
break ;
case '-c' :
case '-core' :
$core = $argv [ $i + 1 ];
break ;
case '-r' :
case '-root' :
$root = $argv [ $i + 1 ];
break ;
case '-h' :
case '-help' :
$help = true ;
break ;
case '-p' :
case '-project' :
$project = true ;
$projectPath = $argv [ $i + 1 ];
2006-10-10 22:05:41 +00:00
$app = $argv [ $i + 1 ];
2006-05-26 05:29:17 +00:00
break ;
}
}
2006-10-10 22:05:41 +00:00
if ( ! $app ) {
$app = $argv [ 1 ];
}
if ( ! is_dir ( $app )) {
$project = true ;
$projectPath = $app ;
2006-10-14 18:07:52 +00:00
2006-10-10 22:05:41 +00:00
}
2006-10-14 18:07:52 +00:00
2006-10-10 22:05:41 +00:00
if ( $project ) {
$app = $projectPath ;
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$shortPath = str_replace ( $root , '' , $app );
$shortPath = str_replace ( '../' , '' , $shortPath );
$shortPath = str_replace ( '//' , '/' , $shortPath );
2006-10-14 18:07:52 +00:00
2006-10-13 08:52:26 +00:00
$pathArray = explode ( '/' , $shortPath );
$appDir = array_pop ( $pathArray );
$rootDir = implode ( '/' , $pathArray );
2006-10-10 18:24:25 +00:00
$rootDir = str_replace ( '//' , '' , $rootDir );
2006-10-14 18:07:52 +00:00
2006-10-13 03:46:47 +00:00
if ( ! $rootDir ) {
$rootDir = $root ;
$projectPath = $root . DS . $appDir ;
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
define ( 'ROOT' , $rootDir );
define ( 'APP_DIR' , $appDir );
2006-10-13 04:45:12 +00:00
2006-06-19 20:02:36 +00:00
define ( 'DEBUG' , 1 );;
2006-10-09 20:27:28 +00:00
define ( 'CAKE_CORE_INCLUDE_PATH' , $root );
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
if ( function_exists ( 'ini_set' )) {
2006-06-19 20:02:36 +00:00
ini_set ( 'include_path' , ini_get ( 'include_path' ) .
PATH_SEPARATOR . CAKE_CORE_INCLUDE_PATH . DS .
2006-10-09 20:27:28 +00:00
PATH_SEPARATOR . ROOT . DS . APP_DIR . DS );
2006-06-19 20:02:36 +00:00
define ( 'APP_PATH' , null );
define ( 'CORE_PATH' , null );
2006-06-14 18:02:37 +00:00
} else {
define ( 'APP_PATH' , ROOT . DS . APP_DIR . DS );
define ( 'CORE_PATH' , CAKE_CORE_INCLUDE_PATH . DS );
2006-05-26 05:29:17 +00:00
}
2006-10-09 20:27:28 +00:00
/**
* Tag template for a div with a class attribute .
*/
define ( 'TAG_DIV' , '<div class="%s">%s</div>' );
/**
* Tag template for a paragraph with a class attribute .
*/
define ( 'TAG_P_CLASS' , '<p class="%s">%s</p>' );
/**
* Tag template for a label with a for attribute .
*/
define ( 'TAG_LABEL' , '<label for="%s">%s</label>' );
/**
* Tag template for a fieldset with a legend tag inside .
*/
define ( 'TAG_FIELDSET' , '<fieldset><legend>%s</legend>%s</label>' );
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
require_once ( CORE_PATH . 'cake' . DS . 'basics.php' );
require_once ( CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php' );
require_once ( CORE_PATH . 'cake' . DS . 'dispatcher.php' );
require_once ( CORE_PATH . 'cake' . DS . 'scripts' . DS . 'templates' . DS . 'skel' . DS . 'config' . DS . 'core.php' );
2006-05-26 05:29:17 +00:00
uses ( 'inflector' , 'model' . DS . 'model' );
2006-10-09 20:27:28 +00:00
require_once ( CORE_PATH . 'cake' . DS . 'app_model.php' );
require_once ( CORE_PATH . 'cake' . DS . 'app_controller.php' );
2006-05-26 05:29:17 +00:00
uses ( 'neat_array' , 'model' . DS . 'connection_manager' , 'controller' . DS . 'controller' , 'session' ,
'configure' , 'security' , DS . 'controller' . DS . 'scaffold' );
$pattyCake = new Bake ();
if ( $help === true )
{
$pattyCake -> help ();
exit ();
}
if ( $project === true )
{
$pattyCake -> project ( $projectPath );
exit ();
}
$pattyCake -> main ();
/**
2006-07-18 11:11:44 +00:00
* Bake is a command - line code generation utility for automating programmer chores .
2006-05-26 05:29:17 +00:00
*
* @ package cake
* @ subpackage cake . cake . scripts
2005-08-21 06:49:02 +00:00
*/
2006-04-24 16:38:16 +00:00
class Bake {
2006-04-27 10:04:08 +00:00
2006-05-26 05:29:17 +00:00
/**
2006-07-18 11:11:44 +00:00
* Standard input stream .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ var filehandle
2006-05-26 05:29:17 +00:00
*/
var $stdin ;
/**
2006-07-18 11:11:44 +00:00
* Standard output stream .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ var filehandle
2006-05-26 05:29:17 +00:00
*/
var $stdout ;
/**
2006-07-18 11:11:44 +00:00
* Standard error stream .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ var filehandle
2006-05-26 05:29:17 +00:00
*/
var $stderr ;
/**
2006-07-18 11:11:44 +00:00
* Associated controller name .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ var string
2006-05-26 05:29:17 +00:00
*/
2006-10-09 20:27:28 +00:00
var $controllerName = null ;
2006-05-26 05:29:17 +00:00
/**
2006-07-18 11:11:44 +00:00
* If true , Bake will ask for permission to perform actions .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ var boolean
2006-05-26 05:29:17 +00:00
*/
var $interactive = false ;
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
var $__modelAlias = false ;
2006-05-26 05:29:17 +00:00
/**
2006-07-18 11:11:44 +00:00
* Private helper function for constructor
* @ access private
2006-05-26 05:29:17 +00:00
*/
function __construct () {
$this -> stdin = fopen ( 'php://stdin' , 'r' );
$this -> stdout = fopen ( 'php://stdout' , 'w' );
$this -> stderr = fopen ( 'php://stderr' , 'w' );
$this -> welcome ();
}
/**
2006-07-18 11:11:44 +00:00
* Constructor .
2006-05-26 05:29:17 +00:00
*
* @ return Bake
*/
function Bake () {
return $this -> __construct ();
}
/**
2006-07-18 11:11:44 +00:00
* Main - loop method .
2006-05-26 05:29:17 +00:00
*
*/
function main () {
if ( ! file_exists ( CONFIGS . 'database.php' )) {
$this -> stdout ( '' );
$this -> stdout ( '' );
$this -> stdout ( 'Your database configuration was not found. Take a moment to create one:' );
$this -> stdout ( '' );
$this -> stdout ( '' );
$this -> doDbConfig ();
}
require_once ( CONFIGS . 'database.php' );
$this -> stdout ( '[M]odel' );
$this -> stdout ( '[C]ontroller' );
$this -> stdout ( '[V]iew' );
$invalidSelection = true ;
while ( $invalidSelection ) {
$classToBake = strtoupper ( $this -> getInput ( 'Please select a class to Bake:' , array ( 'M' , 'V' , 'C' )));
switch ( $classToBake ) {
case 'M' :
$invalidSelection = false ;
$this -> doModel ();
break ;
case 'V' :
$invalidSelection = false ;
$this -> doView ();
break ;
case 'C' :
$invalidSelection = false ;
$this -> doController ();
break ;
default :
$this -> stdout ( 'You have made an invalid selection. Please choose a type of class to Bake by entering M, V, or C.' );
}
}
}
/**
2006-07-18 11:11:44 +00:00
* Database configuration setup .
2006-05-26 05:29:17 +00:00
*
*/
function doDbConfig () {
$this -> hr ();
$this -> stdout ( 'Database Configuration Bake:' );
$this -> hr ();
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$driver = '' ;
while ( $driver == '' ) {
$driver = $this -> getInput ( 'What database driver would you like to use?' , array ( 'mysql' , 'mysqli' , 'mssql' , 'sqlite' , 'postgres' , 'odbc' ), 'mysql' );
if ( $driver == '' ) {
$this -> stdout ( 'The database driver supplied was empty. Please supply a database driver.' );
}
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
switch ( $driver ) {
case 'mysql' :
2006-10-14 19:05:23 +00:00
$connect = 'mysql_connect' ;
2006-10-09 20:27:28 +00:00
break ;
case 'mysqli' :
$connect = 'mysqli_connect' ;
break ;
case 'mssql' :
2006-10-14 19:05:23 +00:00
$connect = 'mssql_connect' ;
2006-10-09 20:27:28 +00:00
break ;
case 'sqlite' :
2006-10-14 19:05:23 +00:00
$connect = 'sqlite_open' ;
2006-10-09 20:27:28 +00:00
break ;
case 'postgres' :
2006-10-14 19:05:23 +00:00
$connect = 'pg_connect' ;
2006-10-09 20:27:28 +00:00
break ;
case 'odbc' :
2006-10-14 19:05:23 +00:00
$connect = 'odbc_connect' ;
2006-10-09 20:27:28 +00:00
break ;
default :
$this -> stdout ( 'The connection parameter could not be set.' );
break ;
}
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
$host = '' ;
while ( $host == '' ) {
$host = $this -> getInput ( 'What is the hostname for the database server?' , null , 'localhost' );
if ( $host == '' ) {
$this -> stdout ( 'The host name you supplied was empty. Please supply a hostname.' );
}
}
$login = '' ;
while ( $login == '' ) {
$login = $this -> getInput ( 'What is the database username?' );
if ( $login == '' ) {
$this -> stdout ( 'The database username you supplied was empty. Please try again.' );
}
}
$password = '' ;
2006-06-14 18:02:37 +00:00
$blankPassword = false ;
2006-05-26 05:29:17 +00:00
2006-06-14 18:02:37 +00:00
while ( $password == '' && $blankPassword == false ) {
2006-05-26 05:29:17 +00:00
$password = $this -> getInput ( 'What is the database password?' );
if ( $password == '' ) {
2006-06-14 18:02:37 +00:00
$blank = $this -> getInput ( 'The password you supplied was empty. Use an empty password?' , array ( 'y' , 'n' ), 'n' );
if ( $blank == 'y' )
{
$blankPassword = true ;
}
2006-05-26 05:29:17 +00:00
}
}
$database = '' ;
while ( $database == '' ) {
$database = $this -> getInput ( 'What is the name of the database you will be using?' );
if ( $database == '' ) {
$this -> stdout ( 'The database name you supplied was empty. Please try again.' );
}
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$prefix = '' ;
while ( $prefix == '' ) {
$prefix = $this -> getInput ( 'Enter a table prefix?' , null , 'n' );
}
2006-10-10 20:00:35 +00:00
if ( low ( $prefix ) == 'n' ) {
$prefix = '' ;
}
2006-05-26 05:29:17 +00:00
$this -> stdout ( '' );
$this -> hr ();
$this -> stdout ( 'The following database configuration will be created:' );
$this -> hr ();
2006-10-09 20:27:28 +00:00
$this -> stdout ( " Driver: $driver " );
$this -> stdout ( " Connection: $connect " );
$this -> stdout ( " Host: $host " );
$this -> stdout ( " User: $login " );
$this -> stdout ( " Pass: " . str_repeat ( '*' , strlen ( $password )));
$this -> stdout ( " Database: $database " );
$this -> stdout ( " Table prefix: $prefix " );
2006-05-26 05:29:17 +00:00
$this -> hr ();
$looksGood = $this -> getInput ( 'Look okay?' , array ( 'y' , 'n' ), 'y' );
if ( strtolower ( $looksGood ) == 'y' || strtolower ( $looksGood ) == 'yes' ) {
2006-10-09 20:27:28 +00:00
$this -> bakeDbConfig ( $driver , $connect , $host , $login , $password , $database , $prefix );
2006-05-26 05:29:17 +00:00
} else {
$this -> stdout ( 'Bake Aborted.' );
}
}
/**
2006-07-18 11:11:44 +00:00
* Action to create a Model .
2006-05-26 05:29:17 +00:00
*
*/
function doModel ()
{
$this -> hr ();
$this -> stdout ( 'Model Bake:' );
$this -> hr ();
$this -> interactive = true ;
$dbConnection = 'default' ;
/* $usingDefault = $this -> getInput ( 'Will your model be using a database connection setting other than the default?' );
if ( strtolower ( $usingDefault ) == 'y' || strtolower ( $usingDefault ) == 'yes' )
{
$dbConnection = $this -> getInput ( 'Please provide the name of the connection you wish to use.' );
} */
$db =& ConnectionManager :: getDataSource ( $dbConnection );
2006-06-14 18:02:37 +00:00
$usePrefix = empty ( $db -> config [ 'prefix' ]) ? '' : $db -> config [ 'prefix' ];
if ( $usePrefix ) {
$tables = array ();
foreach ( $db -> listSources () as $table ) {
2006-10-10 20:00:35 +00:00
if ( ! strncmp ( $table , $usePrefix , strlen ( $usePrefix ))) {
2006-06-14 18:02:37 +00:00
$tables [] = substr ( $table , strlen ( $usePrefix ));
}
}
} else {
$tables = $db -> listSources ();
}
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
$this -> stdout ( 'Possible models based on your current database:' );
for ( $i = 0 ; $i < count ( $tables ); $i ++ ) {
2006-10-09 20:27:28 +00:00
$this -> stdout ( $i + 1 . " . " . $this -> __modelName ( $tables [ $i ]));
2006-05-26 05:29:17 +00:00
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$enteredModel = '' ;
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
while ( $enteredModel == '' ) {
$enteredModel = $this -> getInput ( 'Enter a number from the list above, or type in the name of another model.' );
2006-05-26 05:29:17 +00:00
2006-10-09 20:27:28 +00:00
if ( $enteredModel == '' || intval ( $enteredModel ) > $i ) {
2006-05-26 05:29:17 +00:00
$this -> stdout ( 'Error:' );
$this -> stdout ( " The model name you supplied was empty, or the number \n you selected was not an option. Please try again. " );
2006-10-09 20:27:28 +00:00
$enteredModel = '' ;
2006-05-26 05:29:17 +00:00
}
}
2006-10-09 20:27:28 +00:00
if ( intval ( $enteredModel ) > 0 && intval ( $enteredModel ) <= $i ) {
$currentModelName = $this -> __modelName ( $tables [ intval ( $enteredModel ) - 1 ]);
2006-05-26 05:29:17 +00:00
} else {
2006-10-09 20:27:28 +00:00
$currentModelName = $this -> __modelName ( $enteredModel );
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$currentTableName = Inflector :: tableize ( $currentModelName );
2006-10-10 20:00:35 +00:00
if ( array_search ( $currentTableName , $tables ) === false ) {
$this -> stdout ( " \n Given your model named ' $currentModelName ', Cake would expect a database table named ' " . $currentTableName . " '. " );
$tableIsGood = $this -> getInput ( 'Is this correct?' , array ( 'y' , 'n' ), 'y' );
}
2006-05-26 05:29:17 +00:00
2006-10-09 20:27:28 +00:00
if ( strtolower ( $tableIsGood ) == 'n' || strtolower ( $tableIsGood ) == 'no' ) {
$table = $this -> getInput ( 'What is the name of the table (enter "null" to use NO table)?' );
2006-05-26 05:29:17 +00:00
}
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
$wannaDoValidation = $this -> getInput ( 'Would you like to supply validation criteria for the fields in your model?' , array ( 'y' , 'n' ), 'y' );
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$tempModel = new Model ( false , $currentTableName );
2006-05-26 05:29:17 +00:00
$modelFields = $db -> describe ( $tempModel );
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$validate = array ();
2006-05-26 05:29:17 +00:00
2006-10-10 20:00:35 +00:00
if ( array_search ( $currentTableName , $tables ) !== false && ( strtolower ( $wannaDoValidation ) == 'y' || strtolower ( $wannaDoValidation ) == 'yes' )) {
2006-05-26 05:29:17 +00:00
foreach ( $modelFields as $field ) {
$this -> stdout ( '' );
$prompt .= 'Name: ' . $field [ 'name' ] . " \n " ;
$prompt .= 'Type: ' . $field [ 'type' ] . " \n " ;
$prompt .= '---------------------------------------------------------------' . " \n " ;
$prompt .= 'Please select one of the following validation options:' . " \n " ;
$prompt .= '---------------------------------------------------------------' . " \n " ;
$prompt .= " 1- VALID_NOT_EMPTY \n " ;
$prompt .= " 2- VALID_EMAIL \n " ;
$prompt .= " 3- VALID_NUMBER \n " ;
$prompt .= " 4- VALID_YEAR \n " ;
$prompt .= " 5- Do not do any validation on this field. \n \n " ;
$prompt .= " ... or enter in a valid regex validation string. \n \n " ;
if ( $field [ 'name' ] == 'id' || $field [ 'name' ] == 'created' || $field [ 'name' ] == 'modified' ) {
$validation = $this -> getInput ( $prompt , null , '5' );
} else {
$validation = $this -> getInput ( $prompt , null , '1' );
}
switch ( $validation ) {
case '1' :
$validate [ $field [ 'name' ]] = 'VALID_NOT_EMPTY' ;
break ;
case '2' :
$validate [ $field [ 'name' ]] = 'VALID_EMAIL' ;
break ;
case '3' :
$validate [ $field [ 'name' ]] = 'VALID_NUMBER' ;
break ;
case '4' :
$validate [ $field [ 'name' ]] = 'VALID_YEAR' ;
break ;
case '5' :
break ;
default :
$validate [ $field [ 'name' ]] = $validation ;
2006-10-09 20:27:28 +00:00
break ;
2006-05-26 05:29:17 +00:00
}
}
}
2006-06-20 12:24:48 +00:00
$wannaDoAssoc = $this -> getInput ( 'Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)?' , array ( 'y' , 'n' ), 'y' );
2006-05-26 05:29:17 +00:00
if (( strtolower ( $wannaDoAssoc ) == 'y' || strtolower ( $wannaDoAssoc ) == 'yes' )) {
$this -> stdout ( 'One moment while I try to detect any associations...' );
//Look for belongsTo
foreach ( $modelFields as $field ) {
$offset = strpos ( $field [ 'name' ], '_id' );
if ( $offset !== false ) {
2006-10-09 20:27:28 +00:00
$belongsToClasses [] = $this -> __modelNameFromKey ( $field [ 'name' ]);
2006-05-26 05:29:17 +00:00
}
}
//Look for hasOne and hasMany and hasAndBelongsToMany
2006-10-09 20:27:28 +00:00
foreach ( $tables as $otherTable ) {
$tempOtherModel = new Model ( false , $otherTable );
$modelFieldsTemp = $db -> describe ( $tempOtherModel );
2006-05-26 05:29:17 +00:00
foreach ( $modelFieldsTemp as $field ) {
2006-10-09 20:27:28 +00:00
if ( $field [ 'name' ] == $this -> __modelKey ( $currentModelName )) {
$hasOneClasses [] = $this -> __modelName ( $otherTable );
$hasManyClasses [] = $this -> __modelName ( $otherTable );
2006-05-26 05:29:17 +00:00
}
}
2006-10-09 20:27:28 +00:00
$offset = strpos ( $otherTable , $currentTableName . '_' );
2006-05-26 05:29:17 +00:00
if ( $offset !== false ) {
2006-10-09 20:27:28 +00:00
$offset = strlen ( $currentTableName . '_' );
echo $this -> __modelName ( substr ( $otherTable , $offset ));
$hasAndBelongsToManyClasses [] = $this -> __modelName ( substr ( $otherTable , $offset ));
2006-05-26 05:29:17 +00:00
}
2006-10-09 20:27:28 +00:00
$offset = strpos ( $otherTable , '_' . $currentTableName );
2006-05-26 05:29:17 +00:00
if ( $offset !== false ) {
2006-10-09 20:27:28 +00:00
echo $this -> __modelName ( substr ( $otherTable , 0 , $offset ));
$hasAndBelongsToManyClasses [] = $this -> __modelName ( substr ( $otherTable , 0 , $offset ));
2006-05-26 05:29:17 +00:00
}
}
$this -> stdout ( 'Done.' );
$this -> hr ();
//if none found...
2006-06-14 18:02:37 +00:00
if ( count ( $hasOneClasses ) < 1 && count ( $hasManyClasses ) < 1 && count ( $hasAndBelongsToManyClasses ) < 1 && count ( $belongsToClasses ) < 1 ) {
2006-05-26 05:29:17 +00:00
$this -> stdout ( 'None found.' );
} else {
$this -> stdout ( 'Please confirm the following associations:' );
$this -> hr ();
if ( count ( $belongsToClasses )) {
for ( $i = 0 ; $i < count ( $belongsToClasses ); $i ++ ) {
2006-10-09 20:27:28 +00:00
$response = $this -> getInput ( " $currentModelName belongsTo { $belongsToClasses [ $i ] } ? " , array ( 'y' , 'n' ), 'y' );
2006-05-26 05:29:17 +00:00
if ( $response == 'y' ) {
$modelAssociations [ 'belongsTo' ][] = $belongsToClasses [ $i ];
}
}
}
if ( count ( $hasOneClasses )) {
for ( $i = 0 ; $i < count ( $hasOneClasses ); $i ++ ) {
2006-10-09 20:27:28 +00:00
$response = $this -> getInput ( " $currentModelName hasOne { $hasOneClasses [ $i ] } ? " , array ( 'y' , 'n' ), 'y' );
2006-05-26 05:29:17 +00:00
if ( $response == 'y' ) {
$modelAssociations [ 'hasOne' ][] = $hasOneClasses [ $i ];
}
}
}
if ( count ( $hasManyClasses )) {
for ( $i = 0 ; $i < count ( $hasManyClasses ); $i ++ ) {
2006-10-09 20:27:28 +00:00
$response = $this -> getInput ( " $currentModelName hasMany { $hasManyClasses [ $i ] } ? " , array ( 'y' , 'n' ), 'y' );
2006-05-26 05:29:17 +00:00
if ( $response == 'y' ) {
$modelAssociations [ 'hasMany' ][] = $hasManyClasses [ $i ];
}
}
}
if ( count ( $hasAndBelongsToManyClasses )) {
for ( $i = 0 ; $i < count ( $hasAndBelongsToManyClasses ); $i ++ ) {
2006-10-09 20:27:28 +00:00
$response = $this -> getInput ( " $currentModelName hasAndBelongsToMany { $hasAndBelongsToManyClasses [ $i ] } ? " , array ( 'y' , 'n' ), 'y' );
2006-05-26 05:29:17 +00:00
if ( $response == 'y' ) {
$modelAssociations [ 'hasAndBelongsToMany' ][] = $hasAndBelongsToManyClasses [ $i ];
}
}
}
}
$wannaDoMoreAssoc = $this -> getInput ( 'Would you like to define some additional model associations?' , array ( 'y' , 'n' ), 'y' );
while (( strtolower ( $wannaDoMoreAssoc ) == 'y' || strtolower ( $wannaDoMoreAssoc ) == 'yes' )) {
$assocs = array ( 1 => 'belongsTo' , 2 => 'hasOne' , 3 => 'hasMany' , 4 => 'hasAndBelongsToMany' );
$bad = true ;
while ( $bad ) {
$this -> stdout ( 'What is the association type?' );
$prompt = " 1- belongsTo \n " ;
$prompt .= " 2- hasOne \n " ;
$prompt .= " 3- hasMany \n " ;
$prompt .= " 4- hasAndBelongsToMany \n " ;
$assocType = intval ( $this -> getInput ( $prompt , null , null ));
if ( intval ( $assocType ) < 1 || intval ( $assocType ) > 4 ) {
$this -> stdout ( 'The selection you entered was invalid. Please enter a number between 1 and 4.' );
} else {
$bad = false ;
}
}
$assocClassName = $this -> getInput ( 'Classname of associated Model?' );
$modelAssociations [ $assocs [ $assocType ]][] = $assocClassName ;
2006-10-09 20:27:28 +00:00
$this -> stdout ( " Association ' $currentModelName { $assocs [ $assocType ] } $assocClassName ' defined. " );
2006-05-26 05:29:17 +00:00
$wannaDoMoreAssoc = $this -> getInput ( 'Define another association?' , array ( 'y' , 'n' ), 'y' );
}
}
$this -> stdout ( '' );
$this -> hr ();
$this -> stdout ( 'The following model will be created:' );
$this -> hr ();
2006-10-09 20:27:28 +00:00
$this -> stdout ( " Model Name: $currentModelName " );
2006-05-26 05:29:17 +00:00
$this -> stdout ( " DB Connection: " . ( $usingDefault ? 'default' : $dbConnection ));
2006-10-09 20:27:28 +00:00
$this -> stdout ( " Model Table: " . $currentTableName );
2006-05-26 05:29:17 +00:00
$this -> stdout ( " Validation: " . print_r ( $validate , true ));
if ( count ( $belongsToClasses ) || count ( $hasOneClasses ) || count ( $hasManyClasses ) || count ( $hasAndBelongsToManyClasses )) {
$this -> stdout ( " Associations: " );
if ( count ( $modelAssociations [ 'belongsTo' ])) {
for ( $i = 0 ; $i < count ( $modelAssociations [ 'belongsTo' ]); $i ++ ) {
2006-10-09 20:27:28 +00:00
$this -> stdout ( " $currentModelName belongsTo { $modelAssociations [ 'belongsTo' ][ $i ] } " );
2006-05-26 05:29:17 +00:00
}
}
if ( count ( $modelAssociations [ 'hasOne' ])) {
for ( $i = 0 ; $i < count ( $modelAssociations [ 'hasOne' ]); $i ++ ) {
2006-10-09 20:27:28 +00:00
$this -> stdout ( " $currentModelName hasOne { $modelAssociations [ 'hasOne' ][ $i ] } " );
2006-05-26 05:29:17 +00:00
}
}
if ( count ( $modelAssociations [ 'hasMany' ])) {
for ( $i = 0 ; $i < count ( $modelAssociations [ 'hasMany' ]); $i ++ ) {
2006-10-09 20:27:28 +00:00
$this -> stdout ( " $currentModelName hasMany { $modelAssociations [ 'hasMany' ][ $i ] } " );
2006-05-26 05:29:17 +00:00
}
}
if ( count ( $modelAssociations [ 'hasAndBelongsToMany' ])) {
for ( $i = 0 ; $i < count ( $modelAssociations [ 'hasAndBelongsToMany' ]); $i ++ ) {
2006-10-09 20:27:28 +00:00
$this -> stdout ( " $currentModelName hasAndBelongsToMany { $modelAssociations [ 'hasAndBelongsToMany' ][ $i ] } " );
2006-05-26 05:29:17 +00:00
}
}
}
$this -> hr ();
$looksGood = $this -> getInput ( 'Look okay?' , array ( 'y' , 'n' ), 'y' );
if ( strtolower ( $looksGood ) == 'y' || strtolower ( $looksGood ) == 'yes' ) {
2006-10-09 20:27:28 +00:00
if ( $currentTableName == Inflector :: tableize ( $currentModelName )) {
2006-05-26 05:29:17 +00:00
// set it to null...
// putting $useTable in the model
// is unnecessary.
$modelTableName = null ;
}
2006-10-09 20:27:28 +00:00
$this -> bakeModel ( $currentModelName , $dbConnection , $currentTableName , $validate , $modelAssociations );
2006-05-26 05:29:17 +00:00
if ( $this -> doUnitTest ()) {
2006-10-09 20:27:28 +00:00
$this -> bakeUnitTest ( 'model' , $currentModelName );
2006-05-26 05:29:17 +00:00
}
} else {
$this -> stdout ( 'Bake Aborted.' );
}
}
/**
2006-07-18 11:11:44 +00:00
* Action to create a View .
2006-05-26 05:29:17 +00:00
*
*/
function doView () {
$this -> hr ();
$this -> stdout ( 'View Bake:' );
$this -> hr ();
$uses = array ();
2006-07-29 05:58:31 +00:00
$wannaUseSession = 'y' ;
2006-05-26 05:29:17 +00:00
$wannaDoScaffold = 'y' ;
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
$controllerName = '' ;
while ( $controllerName == '' ) {
$controllerName = $this -> getInput ( 'Controller Name? (plural)' );
if ( $controllerName == '' ) {
$this -> stdout ( 'The controller name you supplied was empty. Please try again.' );
}
}
2006-10-10 18:24:25 +00:00
$controllerPath = $this -> __controllerPath ( $controllerName );
$controllerName = $this -> __controllerName ( $controllerName );
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
$doItInteractive = $this -> getInput ( " Would you like bake to build your views interactively? \n Warning: Choosing no will overwrite { $controllerClassName } views if it exist. " , array ( 'y' , 'n' ), 'y' );
if ( strtolower ( $doItInteractive ) == 'y' || strtolower ( $doItInteractive ) == 'yes' ) {
$this -> interactive = true ;
$wannaDoScaffold = $this -> getInput ( " Would you like to create some scaffolded views (index, add, view, edit) for this controller? \n NOTE: Before doing so, you'll need to create your controller and model classes (including associated models). " , array ( 'y' , 'n' ), 'n' );
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$admin = null ;
2006-05-26 05:29:17 +00:00
if ( strtolower ( $wannaDoScaffold ) == 'y' || strtolower ( $wannaDoScaffold ) == 'yes' ) {
2006-10-09 20:27:28 +00:00
$wannaDoAdmin = $this -> getInput ( " Would you like to create the views for admin routing? " , array ( 'y' , 'n' ), 'n' );
}
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
if (( strtolower ( $wannaDoAdmin ) == 'y' || strtolower ( $wannaDoAdmin ) == 'yes' )) {
2006-10-13 09:31:20 +00:00
require ( CONFIGS . 'core.php' );
2006-10-09 20:27:28 +00:00
if ( defined ( 'CAKE_ADMIN' )) {
2006-10-14 18:07:52 +00:00
$admin = CAKE_ADMIN . '_' ;
2006-10-09 20:27:28 +00:00
} else {
2006-10-14 18:07:52 +00:00
$adminRoute = '' ;
2006-10-09 20:27:28 +00:00
$this -> stdout ( 'You need to enable CAKE_ADMIN in /app/config/core.php to use admin routing.' );
2006-10-14 18:07:52 +00:00
$this -> stdout ( 'What would you like the admin route to be?' );
$this -> stdout ( 'Example: www.example.com/admin/controller' );
while ( $adminRoute == '' ) {
$adminRoute = $this -> getInput ( " What would you like the admin route to be? " , null , 'admin' );
}
if ( $this -> __addAdminRoute ( $adminRoute ) !== true ){
$this -> stdout ( 'Unable to write to /app/config/core.php.' );
$this -> stdout ( 'You need to enable CAKE_ADMIN in /app/config/core.php to use admin routing.' );
exit ();
} else {
$admin = $adminRoute . '_' ;
}
2006-10-09 20:27:28 +00:00
}
}
if ( strtolower ( $wannaDoScaffold ) == 'y' || strtolower ( $wannaDoScaffold ) == 'yes' ) {
2006-10-10 18:24:25 +00:00
$file = CONTROLLERS . $controllerPath . '_controller.php' ;
2006-05-26 05:29:17 +00:00
if ( ! file_exists ( $file )) {
2006-07-29 05:58:31 +00:00
$shortPath = str_replace ( ROOT , null , $file );
$shortPath = str_replace ( '../' , '' , $shortPath );
$shortPath = str_replace ( '//' , '/' , $shortPath );
2006-05-26 05:29:17 +00:00
$this -> stdout ( '' );
2006-07-29 05:58:31 +00:00
$this -> stdout ( " The file ' $shortPath ' could not be found. \n In order to scaffold, you'll need to first create the controller. " );
2006-05-26 05:29:17 +00:00
$this -> stdout ( '' );
die ();
} else {
2006-10-10 18:24:25 +00:00
loadController ( $controllerName );
$controllerClassName = $controllerName . 'Controller' ;
2006-10-09 20:27:28 +00:00
$controllerObj = & new $controllerClassName ();
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
if ( ! in_array ( 'Html' , $controllerObj -> helpers )) {
$controllerObj -> helpers [] = 'Html' ;
}
if ( ! in_array ( 'Form' , $controllerObj -> helpers )) {
$controllerObj -> helpers [] = 'Form' ;
2006-05-26 05:29:17 +00:00
}
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
loadModels ();
2006-10-09 20:27:28 +00:00
$controllerObj -> constructClasses ();
$currentModelName = $controllerObj -> modelClass ;
2006-10-14 18:07:52 +00:00
$this -> __modelClass = $currentModelName ;
2006-10-09 20:27:28 +00:00
$modelKey = Inflector :: underscore ( $currentModelName );
$modelObj =& ClassRegistry :: getObject ( $modelKey );
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$singularName = $this -> __singularName ( $currentModelName );
2006-10-10 18:24:25 +00:00
$pluralName = $this -> __pluralName ( $currentModelName );
2006-10-09 20:27:28 +00:00
$singularHumanName = $this -> __singularHumanName ( $modelObj -> name );
2006-10-10 18:24:25 +00:00
$pluralHumanName = $this -> __pluralHumanName ( $controllerName );
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$fieldNames = $controllerObj -> generateFieldNames ( null , false );
2006-05-26 05:29:17 +00:00
2006-07-23 18:59:52 +00:00
//-------------------------[INDEX]-------------------------//
2006-10-10 18:24:25 +00:00
$indexView = null ;
2006-10-09 20:27:28 +00:00
if ( ! empty ( $modelObj -> alias )) {
foreach ( $modelObj -> alias as $key => $value ) {
2006-05-26 05:29:17 +00:00
$alias [] = $key ;
}
}
2006-10-10 18:24:25 +00:00
$indexView .= " <div class= \" { $pluralName } \" > \n " ;
2006-10-09 20:27:28 +00:00
$indexView .= " <h2>List " . $pluralHumanName . " </h2> \n \n " ;
2006-07-29 05:58:31 +00:00
$indexView .= " <table cellpadding= \" 0 \" cellspacing= \" 0 \" > \n " ;
2006-05-26 05:29:17 +00:00
$indexView .= " <tr> \n " ;
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
foreach ( $fieldNames as $fieldName ) {
$indexView .= " \t <th> " . $fieldName [ 'prompt' ] . " </th> \n " ;
}
$indexView .= " \t <th>Actions</th> \n " ;
$indexView .= " </tr> \n " ;
2006-10-10 18:24:25 +00:00
$indexView .= " <?php foreach ( \$ { $pluralName } as \$ { $singularName } ): ?> \n " ;
2006-05-26 05:29:17 +00:00
$indexView .= " <tr> \n " ;
$count = 0 ;
foreach ( $fieldNames as $field => $value ) {
if ( isset ( $value [ 'foreignKey' ])) {
2006-10-10 18:24:25 +00:00
$otherModelName = $this -> __modelName ( $value [ 'model' ]);
$otherModelKey = Inflector :: underscore ( $otherModelName );
2006-10-09 20:27:28 +00:00
$otherModelObj =& ClassRegistry :: getObject ( $otherModelKey );
2006-10-10 18:24:25 +00:00
$otherControllerName = $this -> __controllerName ( $otherModelName );
$otherControllerPath = $this -> __controllerPath ( $otherControllerName );
2006-10-09 20:27:28 +00:00
if ( is_object ( $otherModelObj )) {
2006-10-10 18:24:25 +00:00
$displayField = $otherModelObj -> getDisplayField ();
$indexView .= " \t <td> <?php echo \$ html->link( \$ " . $singularName . " [' { $alias [ $count ] } '][' { $displayField } '], '/ " . $otherControllerPath . " /view/' . \$ " . $singularName . " [' { $alias [ $count ] } '][' { $otherModelObj -> primaryKey } '])?></td> \n " ;
2006-05-26 05:29:17 +00:00
} else {
2006-10-09 20:27:28 +00:00
$indexView .= " \t <td><?php echo \$ " . $singularName . " [' { $modelObj -> name } '][' { $field } ']; ?></td> \n " ;
2006-05-26 05:29:17 +00:00
}
$count ++ ;
} else {
2006-10-09 20:27:28 +00:00
$indexView .= " \t <td><?php echo \$ " . $singularName . " [' { $modelObj -> name } '][' { $field } ']; ?></td> \n " ;
2006-05-26 05:29:17 +00:00
}
}
2006-10-09 20:27:28 +00:00
$indexView .= " \t <td nowrap> \n " ;
2006-10-10 18:24:25 +00:00
$indexView .= " \t \t <?php echo \$ html->link('View','/ { $controllerPath } /view/' . \$ " . $singularName . " [' { $modelObj -> name } '][' { $modelObj -> primaryKey } '])?> \n " ;
$indexView .= " \t \t <?php echo \$ html->link('Edit','/ { $controllerPath } /edit/' . \$ " . $singularName . " [' { $modelObj -> name } '][' { $modelObj -> primaryKey } '])?> \n " ;
$indexView .= " \t \t <?php echo \$ html->link('Delete','/ { $controllerPath } /delete/' . \$ " . $singularName . " [' { $modelObj -> name } '][' { $modelObj -> primaryKey } '], null, 'Are you sure you want to delete: id ' . \$ " . $singularName . " [' { $modelObj -> name } '][' { $modelObj -> primaryKey } '])?> \n " ;
2006-05-26 05:29:17 +00:00
$indexView .= " \t </td> \n " ;
$indexView .= " </tr> \n " ;
2006-06-21 07:58:54 +00:00
$indexView .= " <?php endforeach; ?> \n " ;
2006-05-26 05:29:17 +00:00
$indexView .= " </table> \n \n " ;
2006-07-23 18:59:52 +00:00
$indexView .= " <ul class= \" actions \" > \n " ;
2006-10-10 18:24:25 +00:00
$indexView .= " \t <li><?php echo \$ html->link('New { $singularHumanName } ', '/ { $controllerPath } /add'); ?></li> \n " ;
2006-05-26 05:29:17 +00:00
$indexView .= " </ul> \n " ;
2006-10-10 18:24:25 +00:00
$indexView .= " </div> " ;
2006-07-23 18:59:52 +00:00
2006-05-26 05:29:17 +00:00
//-------------------------[VIEW]-------------------------//
2006-10-10 18:24:25 +00:00
$viewView = null ;
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
$viewView .= " <div class= \" { $singularName } \" > \n " ;
2006-10-09 20:27:28 +00:00
$viewView .= " <h2>View " . $singularHumanName . " </h2> \n \n " ;
2006-07-23 18:59:52 +00:00
$viewView .= " <dl> \n " ;
2006-10-10 18:24:25 +00:00
$count = 0 ;
2006-05-26 05:29:17 +00:00
foreach ( $fieldNames as $field => $value ) {
2006-07-23 18:59:52 +00:00
$viewView .= " \t <dt> " . $value [ 'prompt' ] . " </dt> \n " ;
2006-05-26 05:29:17 +00:00
if ( isset ( $value [ 'foreignKey' ])) {
2006-10-10 18:24:25 +00:00
$otherModelName = $this -> __modelName ( $value [ 'model' ]);
$otherModelKey = Inflector :: underscore ( $otherModelName );
2006-10-09 20:27:28 +00:00
$otherModelObj =& ClassRegistry :: getObject ( $otherModelKey );
2006-10-10 18:24:25 +00:00
$otherControllerName = $this -> __controllerName ( $otherModelName );
$otherControllerPath = $this -> __controllerPath ( $otherControllerName );
2006-10-09 20:27:28 +00:00
$displayField = $otherModelObj -> getDisplayField ();
2006-10-10 18:24:25 +00:00
$viewView .= " \t <dd> <?php echo \$ html->link( \$ " . $singularName . " [' { $alias [ $count ] } '][' { $displayField } '], '/ " . $otherControllerPath . " /view/' . \$ " . $singularName . " [' { $alias [ $count ] } '][' { $otherModelObj -> primaryKey } '])?></dd> \n " ;
2006-05-26 05:29:17 +00:00
$count ++ ;
} else {
2006-10-09 20:27:28 +00:00
$viewView .= " \t <dd> <?php echo \$ " . $singularName . " [' { $modelObj -> name } '][' { $field } ']?></dd> \n " ;
2006-05-26 05:29:17 +00:00
}
}
2006-07-23 18:59:52 +00:00
$viewView .= " </dl> \n " ;
$viewView .= " <ul class= \" actions \" > \n " ;
2006-10-10 18:24:25 +00:00
$viewView .= " \t <li><?php echo \$ html->link('Edit " . $singularHumanName . " ', '/ { $controllerPath } /edit/' . \$ " . $singularName . " [' { $modelObj -> name } '][' { $modelObj -> primaryKey } ']) ?> </li> \n " ;
$viewView .= " \t <li><?php echo \$ html->link('Delete " . $singularHumanName . " ', '/ { $controllerPath } /delete/' . \$ " . $singularName . " [' { $modelObj -> name } '][' { $modelObj -> primaryKey } '], null, 'Are you sure you want to delete: id ' . \$ " . $singularName . " [' { $modelObj -> name } '][' { $modelObj -> primaryKey } '] . '?') ?> </li> \n " ;
$viewView .= " \t <li><?php echo \$ html->link('List " . $pluralHumanName . " ', '/ { $controllerPath } /index') ?> </li> \n " ;
$viewView .= " \t <li><?php echo \$ html->link('New " . $singularHumanName . " ', '/ { $controllerPath } /add') ?> </li> \n " ;
2006-05-26 05:29:17 +00:00
foreach ( $fieldNames as $field => $value ) {
if ( isset ( $value [ 'foreignKey' ] ) ) {
2006-10-10 18:24:25 +00:00
$otherModelName = $this -> __modelName ( $value [ 'model' ]);
if ( $otherModelName != $currentModelName ) {
$otherControllerName = $this -> __controllerName ( $otherModelName );
$otherControllerPath = $this -> __controllerPath ( $otherControllerName );
$singularHumanName = $this -> __singularHumanName ( $value [ 'controller' ]);
$pluralHumanName = $this -> __pluralHumanName ( $value [ 'controller' ]);
$viewView .= " \t <li><?php echo \$ html->link('List " . $pluralHumanName . " ', '/ " . $otherControllerPath . " /index/')?> </li> \n " ;
$viewView .= " \t <li><?php echo \$ html->link('New " . $singularHumanName . " ', '/ " . $otherControllerPath . " /add/')?> </li> \n " ;
}
2006-05-26 05:29:17 +00:00
}
}
$viewView .= " </ul> \n \n " ;
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
$viewView .= " </div> \n " ;
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
2006-10-09 20:27:28 +00:00
foreach ( $modelObj -> hasOne as $associationName => $relation ) {
2006-10-10 18:24:25 +00:00
$new = true ;
2006-10-14 18:07:52 +00:00
2006-10-09 20:27:28 +00:00
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherControllerName = $this -> __controllerName ( $otherModelName );
2006-10-10 18:24:25 +00:00
$otherControllerPath = $this -> __controllerPath ( $otherModelName );
2006-10-09 20:27:28 +00:00
$otherSingularName = $this -> __singularName ( $associationName );
2006-10-10 18:24:25 +00:00
$otherPluralHumanName = $this -> __pluralHumanName ( $associationName );
$otherSingularHumanName = $this -> __singularHumanName ( $associationName );
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
$viewView .= " <div class= \" related \" > \n " ;
$viewView .= " <h3>Related " . $otherPluralHumanName . " </h3> \n " ;
2006-10-09 20:27:28 +00:00
$viewView .= " <?php if(!empty( \$ " . $singularName . " [' { $associationName } '])): ?> \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " <dl> \n " ;
2006-10-09 20:27:28 +00:00
$viewView .= " \t <?php foreach( \$ " . $singularName . " [' { $associationName } '] as \$ field => \$ value): ?> \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " \t \t <dt><?php echo \$ field ?></dt> \n " ;
2006-09-15 20:19:03 +00:00
$viewView .= " \t \t <dd> <?php echo \$ value ?></dd> \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " \t <?php endforeach; ?> \n " ;
$viewView .= " </dl> \n " ;
2006-07-23 18:59:52 +00:00
$viewView .= " <?php endif; ?> \n " ;
$viewView .= " <ul class= \" actions \" > \n " ;
2006-10-10 18:24:25 +00:00
$viewView .= " \t <li><?php echo \$ html->link('Edit " . $otherSingularHumanName . " ', '/ " . $otherControllerPath . " /edit/' . \$ " . $singularName . " [' { $associationName } '][' " . $modelObj -> { $otherModelName } -> primaryKey . " ']);?></li> \n " ;
$viewView .= " \t <li><?php echo \$ html->link('New " . $otherSingularHumanName . " ', '/ " . $otherControllerPath . " /add/');?> </li> \n " ;
$viewView .= " </ul> \n " ;
$viewView .= " </div> \n " ;
2006-05-26 05:29:17 +00:00
}
2006-10-09 20:27:28 +00:00
$relations = array_merge ( $modelObj -> hasMany , $modelObj -> hasAndBelongsToMany );
foreach ( $relations as $associationName => $relation ) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherControllerName = $this -> __controllerName ( $otherModelName );
2006-10-10 18:24:25 +00:00
$otherControllerPath = $this -> __controllerPath ( $otherModelName );
2006-10-09 20:27:28 +00:00
$otherSingularName = $this -> __singularName ( $associationName );
2006-10-10 18:24:25 +00:00
$otherPluralHumanName = $this -> __pluralHumanName ( $associationName );
$otherSingularHumanName = $this -> __singularHumanName ( $associationName );
2006-10-09 20:27:28 +00:00
$otherModelKey = Inflector :: underscore ( $otherModelName );
$otherModelObj =& ClassRegistry :: getObject ( $otherModelKey );
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
$viewView .= " <div class= \" related \" > \n " ;
$viewView .= " <h3>Related " . $otherPluralHumanName . " </h3> \n " ;
$viewView .= " <?php if(!empty( \$ " . $singularName . " [' { $associationName } '])):?> \n " ;
2006-07-29 05:58:31 +00:00
$viewView .= " <table cellpadding= \" 0 \" cellspacing= \" 0 \" > \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " <tr> \n " ;
2006-10-09 20:27:28 +00:00
$viewView .= " <?php foreach( \$ " . $singularName . " [' { $associationName } ']['0'] as \$ column => \$ value): ?> \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " <th><?php echo \$ column?></th> \n " ;
$viewView .= " <?php endforeach; ?> \n " ;
$viewView .= " <th>Actions</th> \n " ;
$viewView .= " </tr> \n " ;
2006-10-09 20:27:28 +00:00
$viewView .= " <?php foreach( \$ " . $singularName . " [' { $associationName } '] as \$ " . $otherSingularName . " ):?> \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " <tr> \n " ;
2006-10-09 20:27:28 +00:00
$viewView .= " \t <?php foreach( \$ " . $otherSingularName . " as \$ column => \$ value):?> \n " ;
2006-07-29 05:58:31 +00:00
$viewView .= " \t \t <td><?php echo \$ value;?></td> \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " \t <?php endforeach;?> \n " ;
2006-10-09 20:27:28 +00:00
$viewView .= " \t <td nowrap> \n " ;
2006-10-10 18:24:25 +00:00
$viewView .= " \t \t <?php echo \$ html->link('View', '/ " . $otherControllerPath . " /view/' . \$ " . $otherSingularName . " [' { $otherModelObj -> primaryKey } ']);?> \n " ;
$viewView .= " \t \t <?php echo \$ html->link('Edit', '/ " . $otherControllerPath . " /edit/' . \$ " . $otherSingularName . " [' { $otherModelObj -> primaryKey } ']);?> \n " ;
$viewView .= " \t \t <?php echo \$ html->link('Delete', '/ " . $otherControllerPath . " /delete/' . \$ " . $otherSingularName . " [' { $otherModelObj -> primaryKey } '], null, 'Are you sure you want to delete: id ' . \$ " . $otherSingularName . " [' { $otherModelObj -> primaryKey } '] . '?');?> \n " ;
2006-07-23 19:06:21 +00:00
$viewView .= " \t </td> \n " ;
2006-05-26 05:29:17 +00:00
$viewView .= " </tr> \n " ;
$viewView .= " <?php endforeach; ?> \n " ;
$viewView .= " </table> \n " ;
2006-07-22 06:09:11 +00:00
$viewView .= " <?php endif; ?> \n \n " ;
2006-07-23 18:59:52 +00:00
$viewView .= " <ul class= \" actions \" > \n " ;
2006-10-10 18:24:25 +00:00
$viewView .= " \t <li><?php echo \$ html->link('New " . $otherSingularHumanName . " ', '/ " . $otherControllerPath . " /add/');?> </li> \n " ;
$viewView .= " </ul> \n " ;
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
$viewView .= " </div> \n " ;
2006-05-26 05:29:17 +00:00
}
//-------------------------[ADD]-------------------------//
2006-10-10 18:24:25 +00:00
$addView = null ;
2006-10-09 20:27:28 +00:00
$addView .= " <h2>New " . $singularHumanName . " </h2> \n " ;
2006-10-10 18:24:25 +00:00
$addView .= " <form action= \" <?php echo \$ html->url('/ { $controllerPath } /add'); ?> \" method= \" post \" > \n " ;
2006-10-09 20:27:28 +00:00
$addView .= $this -> generateFields ( $controllerObj -> generateFieldNames ( null , true ));
$addView .= $this -> generateSubmitDiv ( 'Add' );
2006-05-26 05:29:17 +00:00
$addView .= " </form> \n " ;
2006-07-23 18:59:52 +00:00
$addView .= " <ul class= \" actions \" > \n " ;
2006-10-10 18:24:25 +00:00
$addView .= " <li><?php echo \$ html->link('List { $pluralHumanName } ', '/ { $controllerPath } /index')?></li> \n " ;
foreach ( $modelObj -> belongsTo as $associationName => $relation ) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
if ( $otherModelName != $currentModelName ) {
$otherControllerName = $this -> __controllerName ( $otherModelName );
$otherControllerPath = $this -> __controllerPath ( $otherModelName );
$otherSingularName = $this -> __singularName ( $associationName );
$addView .= " <li><?php echo \$ html->link('View " . $this -> __pluralHumanName ( $associationName ) . " ', '/ " . $otherControllerPath . " /index/');?></li> \n " ;
}
}
2006-05-26 05:29:17 +00:00
$addView .= " </ul> \n " ;
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
//-------------------------[EDIT]-------------------------//
2006-10-10 18:24:25 +00:00
$editView = null ;
2006-10-09 20:27:28 +00:00
$editView .= " <h2>Edit " . $singularHumanName . " </h2> \n " ;
2006-10-10 18:24:25 +00:00
$editView .= " <form action= \" <?php echo \$ html->url('/ { $controllerPath } /edit/'. \$ html->tagValue(' { $modelObj -> name } / { $modelObj -> primaryKey } ')); ?> \" method= \" post \" > \n " ;
$editView .= $this -> generateFields ( $controllerObj -> generateFieldNames ( null , true ));
2006-10-09 20:27:28 +00:00
$editView .= " <?php echo \$ html->hidden(' { $modelObj -> name } / { $modelObj -> primaryKey } ')?> \n " ;
$editView .= $this -> generateSubmitDiv ( 'Save' );
2006-05-26 05:29:17 +00:00
$editView .= " </form> \n " ;
2006-07-23 18:59:52 +00:00
$editView .= " <ul class= \" actions \" > \n " ;
2006-10-10 18:24:25 +00:00
$editView .= " <li><?php echo \$ html->link('Delete','/ { $controllerPath } /delete/' . \$ html->tagValue(' { $modelObj -> name } / { $modelObj -> primaryKey } '), null, 'Are you sure you want to delete: id ' . \$ html->tagValue(' { $modelObj -> name } / { $modelObj -> primaryKey } '));?> \n " ;
$editView .= " <li><?php echo \$ html->link('List { $pluralHumanName } ', '/ { $controllerPath } /index')?></li> \n " ;
foreach ( $modelObj -> belongsTo as $associationName => $relation ) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
if ( $otherModelName != $currentModelName ) {
$otherControllerName = $this -> __controllerName ( $otherModelName );
$otherControllerPath = $this -> __controllerPath ( $otherModelName );
$otherSingularName = $this -> __singularName ( $associationName );
$editView .= " <li><?php echo \$ html->link('View " . $this -> __pluralHumanName ( $associationName ) . " ', '/ " . $otherControllerPath . " /index/');?></li> \n " ;
}
}
2006-05-26 05:29:17 +00:00
$editView .= " </ul> \n " ;
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
//------------------------------------------------------------------------------------//
2006-10-10 18:24:25 +00:00
if ( ! file_exists ( VIEWS . $controllerPath )) {
mkdir ( VIEWS . $controllerPath );
2006-05-26 05:29:17 +00:00
}
2006-10-13 07:41:10 +00:00
if ( $admin ) {
$filename = VIEWS . $controllerPath . DS . $admin . 'index.thtml' ;
$this -> createFile ( $filename , $indexView );
$filename = VIEWS . $controllerPath . DS . $admin . 'view.thtml' ;
$this -> createFile ( $filename , $viewView );
$filename = VIEWS . $controllerPath . DS . $admin . 'add.thtml' ;
$this -> createFile ( $filename , $addView );
$filename = VIEWS . $controllerPath . DS . $admin . 'edit.thtml' ;
$this -> createFile ( $filename , $editView );
}
2006-10-14 18:07:52 +00:00
2006-10-13 07:41:10 +00:00
$filename = VIEWS . $controllerPath . DS . 'index.thtml' ;
2006-05-26 05:29:17 +00:00
$this -> createFile ( $filename , $indexView );
2006-10-13 07:41:10 +00:00
$filename = VIEWS . $controllerPath . DS . 'view.thtml' ;
2006-05-26 05:29:17 +00:00
$this -> createFile ( $filename , $viewView );
2006-10-13 07:41:10 +00:00
$filename = VIEWS . $controllerPath . DS . 'add.thtml' ;
2006-05-26 05:29:17 +00:00
$this -> createFile ( $filename , $addView );
2006-10-13 07:41:10 +00:00
$filename = VIEWS . $controllerPath . DS . 'edit.thtml' ;
2006-05-26 05:29:17 +00:00
$this -> createFile ( $filename , $editView );
$this -> hr ();
$this -> stdout ( '' );
$this -> stdout ( 'View Scaffolding Complete.' . " \n " );
}
} else {
$actionName = '' ;
while ( $actionName == '' ) {
$actionName = $this -> getInput ( 'Action Name? (use camelCased function name)' );
if ( $actionName == '' ) {
$this -> stdout ( 'The action name you supplied was empty. Please try again.' );
}
}
$this -> stdout ( '' );
$this -> hr ();
$this -> stdout ( 'The following view will be created:' );
$this -> hr ();
2006-10-10 18:24:25 +00:00
$this -> stdout ( " Controller Name: $controllerName " );
2006-05-26 05:29:17 +00:00
$this -> stdout ( " Action Name: $actionName " );
2006-10-10 18:24:25 +00:00
$this -> stdout ( " Path: app/views/ " . $controllerPath . DS . Inflector :: underscore ( $actionName ) . '.thtml' );
2006-05-26 05:29:17 +00:00
$this -> hr ();
$looksGood = $this -> getInput ( 'Look okay?' , array ( 'y' , 'n' ), 'y' );
if ( strtolower ( $looksGood ) == 'y' || strtolower ( $looksGood ) == 'yes' ) {
2006-10-10 18:24:25 +00:00
$this -> bakeView ( $controllerName , $actionName );
2006-05-26 05:29:17 +00:00
} else {
$this -> stdout ( 'Bake Aborted.' );
}
}
}
/**
2006-07-18 11:11:44 +00:00
* Action to create a Controller .
2006-05-26 05:29:17 +00:00
*
*/
function doController () {
$this -> hr ();
$this -> stdout ( 'Controller Bake:' );
$this -> hr ();
$uses = array ();
$helpers = array ();
$components = array ();
2006-07-29 05:58:31 +00:00
$wannaUseSession = 'y' ;
2006-05-26 05:29:17 +00:00
$wannaDoScaffolding = 'y' ;
2006-07-29 05:58:31 +00:00
2006-10-09 20:27:28 +00:00
$controllerName = '' ;
2006-05-26 05:29:17 +00:00
while ( $controllerName == '' ) {
$controllerName = $this -> getInput ( 'Controller name? Remember that Cake controller names are plural.' );
if ( $controllerName == '' ) {
$this -> stdout ( 'The controller name you supplied was empty. Please try again.' );
}
}
2006-10-10 18:24:25 +00:00
$controllerPath = $this -> __controllerPath ( $controllerName );
$controllerName = $this -> __controllerName ( $controllerName );
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
$doItInteractive = $this -> getInput ( " Would you like bake to build your controller interactively? \n Warning: Choosing no will overwrite { $controllerClassName } controller if it exist. " , array ( 'y' , 'n' ), 'y' );
if ( strtolower ( $doItInteractive ) == 'y' || strtolower ( $doItInteractive ) == 'yes' ) {
$this -> interactive = true ;
2006-10-10 18:24:25 +00:00
$wannaDoUses = $this -> getInput ( " Would you like this controller to use other models besides ' " . $this -> __modelName ( $controllerName ) . " '? " , array ( 'y' , 'n' ), 'n' );
2006-05-26 05:29:17 +00:00
if ( strtolower ( $wannaDoUses ) == 'y' || strtolower ( $wannaDoUses ) == 'yes' ) {
$usesList = $this -> getInput ( " Please provide a comma separated list of the classnames of other models you'd like to use. \n Example: 'Author, Article, Book' " );
$usesListTrimmed = str_replace ( ' ' , '' , $usesList );
$uses = explode ( ',' , $usesListTrimmed );
}
2006-07-29 05:58:31 +00:00
$wannaDoHelpers = $this -> getInput ( " Would you like this controller to use other helpers besides HtmlHelper and FormHelper? " , array ( 'y' , 'n' ), 'n' );
2006-05-26 05:29:17 +00:00
if ( strtolower ( $wannaDoHelpers ) == 'y' || strtolower ( $wannaDoHelpers ) == 'yes' ) {
$helpersList = $this -> getInput ( " Please provide a comma separated list of the other helper names you'd like to use. \n Example: 'Ajax, Javascript, Time' " );
$helpersListTrimmed = str_replace ( ' ' , '' , $helpersList );
$helpers = explode ( ',' , $helpersListTrimmed );
}
$wannaDoComponents = $this -> getInput ( " Would you like this controller to use any components? " , array ( 'y' , 'n' ), 'n' );
if ( strtolower ( $wannaDoComponents ) == 'y' || strtolower ( $wannaDoComponents ) == 'yes' ) {
$componentsList = $this -> getInput ( " Please provide a comma separated list of the component names you'd like to use. \n Example: 'Acl, MyNiftyHelper' " );
$componentsListTrimmed = str_replace ( ' ' , '' , $componentsList );
$components = explode ( ',' , $componentsListTrimmed );
}
2006-07-29 05:58:31 +00:00
$wannaUseSession = $this -> getInput ( " Would you like to use Sessions? " , array ( 'y' , 'n' ), 'y' );
2006-06-19 15:00:17 +00:00
$wannaDoScaffolding = $this -> getInput ( " Would you like to include some basic class methods (index(), add(), view(), edit())? " , array ( 'y' , 'n' ), 'n' );
2006-07-29 05:58:31 +00:00
2006-05-26 05:29:17 +00:00
}
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
if ( strtolower ( $wannaDoScaffolding ) == 'y' || strtolower ( $wannaDoScaffolding ) == 'yes' ) {
2006-10-09 20:27:28 +00:00
$wannaDoAdmin = $this -> getInput ( " Would you like to create the methods for admin routing? " , array ( 'y' , 'n' ), 'n' );
}
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
$admin = null ;
2006-10-09 20:27:28 +00:00
if (( strtolower ( $wannaDoAdmin ) == 'y' || strtolower ( $wannaDoAdmin ) == 'yes' )) {
2006-10-13 09:31:20 +00:00
require ( CONFIGS . 'core.php' );
2006-10-09 20:27:28 +00:00
if ( defined ( 'CAKE_ADMIN' )) {
$admin = CAKE_ADMIN . '_' ;
} else {
2006-10-14 18:07:52 +00:00
$adminRoute = '' ;
2006-10-09 20:27:28 +00:00
$this -> stdout ( 'You need to enable CAKE_ADMIN in /app/config/core.php to use admin routing.' );
2006-10-14 18:07:52 +00:00
$this -> stdout ( 'What would you like the admin route to be?' );
$this -> stdout ( 'Example: www.example.com/admin/controller' );
while ( $adminRoute == '' ) {
$adminRoute = $this -> getInput ( " What would you like the admin route to be? " , null , 'admin' );
}
if ( $this -> __addAdminRoute ( $adminRoute ) !== true ){
$this -> stdout ( 'Unable to write to /app/config/core.php.' );
$this -> stdout ( 'You need to enable CAKE_ADMIN in /app/config/core.php to use admin routing.' );
exit ();
} else {
$admin = $adminRoute . '_' ;
}
2006-10-09 20:27:28 +00:00
}
}
2006-05-26 05:29:17 +00:00
if ( strtolower ( $wannaDoScaffolding ) == 'y' || strtolower ( $wannaDoScaffolding ) == 'yes' ) {
2006-10-13 09:31:20 +00:00
loadModels ();
$actions = $this -> __bakeActions ( $controllerName , null , $wannaUseSession );
if ( $admin ) {
$actions .= $this -> __bakeActions ( $controllerName , $admin , $wannaUseSession );
2006-07-29 05:58:31 +00:00
}
2006-05-26 05:29:17 +00:00
}
if ( $this -> interactive === true ) {
$this -> stdout ( '' );
$this -> hr ();
$this -> stdout ( 'The following controller will be created:' );
$this -> hr ();
$this -> stdout ( " Controller Name: $controllerName " );
if ( count ( $uses )) {
$this -> stdout ( " Uses: " , false );
foreach ( $uses as $use ) {
if ( $use != $uses [ count ( $uses ) - 1 ]) {
$this -> stdout ( ucfirst ( $use ) . " , " , false );
} else {
$this -> stdout ( ucfirst ( $use ));
}
}
}
if ( count ( $helpers )) {
$this -> stdout ( " Helpers: " , false );
foreach ( $helpers as $help ) {
if ( $help != $helpers [ count ( $helpers ) - 1 ]) {
$this -> stdout ( ucfirst ( $help ) . " , " , false );
} else {
$this -> stdout ( ucfirst ( $help ));
}
}
}
if ( count ( $components )) {
$this -> stdout ( " Components: " , false );
foreach ( $components as $comp ) {
if ( $comp != $components [ count ( $components ) - 1 ]) {
$this -> stdout ( ucfirst ( $comp ) . " , " , false );
} else {
$this -> stdout ( ucfirst ( $comp ));
}
}
}
$this -> hr ();
$looksGood = $this -> getInput ( 'Look okay?' , array ( 'y' , 'n' ), 'y' );
if ( strtolower ( $looksGood ) == 'y' || strtolower ( $looksGood ) == 'yes' ) {
2006-10-09 20:27:28 +00:00
$this -> bakeController ( $controllerName , $uses , $helpers , $components , $actions );
2006-05-26 05:29:17 +00:00
if ( $this -> doUnitTest ()) {
2006-10-09 20:27:28 +00:00
$this -> bakeUnitTest ( 'controller' , $controllerName );
2006-05-26 05:29:17 +00:00
}
} else {
$this -> stdout ( 'Bake Aborted.' );
}
} else {
2006-10-09 20:27:28 +00:00
$this -> bakeController ( $controllerName , $uses , $helpers , $components , $actions );
2006-05-26 05:29:17 +00:00
exit ();
}
}
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
function __bakeActions ( $controllerName , $admin , $wannaUseSession ) {
$currentModelName = $this -> __modelName ( $controllerName );
$modelKey = Inflector :: underscore ( $currentModelName );
$singularName = $this -> __singularName ( $currentModelName );
$singularHumanName = $this -> __singularHumanName ( $currentModelName );
$pluralHumanName = $this -> __pluralHumanName ( $controllerName );
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
if ( ! class_exists ( $currentModelName )) {
$this -> stdout ( 'You must have a model for this class to build scaffold methods. Please try again.' );
exit ;
}
$modelObj = & new $currentModelName ();
$actions .= " \n " ;
$actions .= " \t function { $admin } index() { \n " ;
$actions .= " \t \t \$ this-> { $currentModelName } ->recursive = 0; \n " ;
$actions .= " \t \t \$ this->set(' { $controllerPath } ', \$ this-> { $currentModelName } ->findAll()); \n " ;
$actions .= " \t } \n " ;
$actions .= " \n " ;
$actions .= " \t function { $admin } view( \$ id = null) { \n " ;
$actions .= " \t \t if(! \$ id) { \n " ;
$actions .= " \t \t \t return false; \n " ;
$actions .= " \t \t } \n " ;
$actions .= " \t \t \$ this->set(' " . $singularName . " ', \$ this-> { $currentModelName } ->read(null, \$ id)); \n " ;
$actions .= " \t } \n " ;
$actions .= " \n " ;
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
$actions .= " \t function { $admin } add() { \n " ;
$actions .= " \t \t if(empty( \$ this->data)) { \n " ;
foreach ( $modelObj -> hasAndBelongsToMany as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
$actions .= " \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
$actions .= " \t \t \t \$ this->set('selected_ { $otherPluralName } ', null); \n " ;
}
}
foreach ( $modelObj -> belongsTo as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
if ( $currentModelName != $otherModelName ) {
$actions .= " \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
} else {
$actions .= " \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } ->generateList()); \n " ;
}
}
}
$actions .= " \t \t \t \$ this->render(); \n " ;
$actions .= " \t \t } else { \n " ;
$actions .= " \t \t \t \$ this->cleanUpFields(); \n " ;
$actions .= " \t \t \t if( \$ this-> { $currentModelName } ->save( \$ this->data)) { \n " ;
if ( strtolower ( $wannaUseSession ) == 'y' || strtolower ( $wannaUseSession ) == 'yes' ) {
$actions .= " \t \t \t \t \$ this->Session->setFlash('The " . Inflector :: humanize ( $currentModelName ) . " has been saved'); \n " ;
$actions .= " \t \t \t \t \$ this->redirect('/ { $controllerPath } /index'); \n " ;
} else {
$actions .= " \t \t \t \t \$ this->flash(' { $currentModelName } saved.', '/ { $controllerPath } /index'); \n " ;
}
$actions .= " \t \t \t } else { \n " ;
if ( strtolower ( $wannaUseSession ) == 'y' || strtolower ( $wannaUseSession ) == 'yes' ) {
$actions .= " \t \t \t \t \$ this->Session->setFlash('Please correct errors below.'); \n " ;
}
foreach ( $modelObj -> hasAndBelongsToMany as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
$actions .= " \t \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
$actions .= " \t \t \t \t if(empty( \$ this->data[' { $associationName } '][' { $associationName } '])) { \$ this->data[' { $associationName } '][' { $associationName } '] = null; } \n " ;
$actions .= " \t \t \t \t \$ this->set('selected_ { $otherPluralName } ', \$ this->data[' { $associationName } '][' { $associationName } ']); \n " ;
}
}
foreach ( $modelObj -> belongsTo as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
if ( $currentModelName != $otherModelName ) {
$actions .= " \t \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
} else {
$actions .= " \t \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } ->generateList()); \n " ;
}
}
}
$actions .= " \t \t \t } \n " ;
$actions .= " \t \t } \n " ;
$actions .= " \t } \n " ;
$actions .= " \n " ;
$actions .= " \t function { $admin } edit( \$ id) { \n " ;
$actions .= " \t \t if(empty( \$ this->data)) { \n " ;
$actions .= " \t \t \t \$ this->data = \$ this-> { $currentModelName } ->read(null, \$ id); \n " ;
foreach ( $modelObj -> hasAndBelongsToMany as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
$otherModelKey = Inflector :: underscore ( $otherModelName );
$otherModelObj =& ClassRegistry :: getObject ( $otherModelKey );
$actions .= " \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
$actions .= " \t \t \t if(empty( \$ this->data[' { $associationName } '][' { $associationName } '])) { \$ this->data[' { $associationName } '][' { $associationName } '] = null; } \n " ;
$actions .= " \t \t \t \$ this->set('selected_ { $otherPluralName } ', \$ this->__selectedArray( \$ this->data[' { $associationName } '][' { $associationName } '])); \n " ;
}
}
foreach ( $modelObj -> belongsTo as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
if ( $currentModelName != $otherModelName ) {
$actions .= " \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
} else {
$actions .= " \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } ->generateList()); \n " ;
}
}
}
$actions .= " \t \t } else { \n " ;
$actions .= " \t \t \t \$ this->cleanUpFields(); \n " ;
$actions .= " \t \t \t if( \$ this-> { $currentModelName } ->save( \$ this->data)) { \n " ;
if ( strtolower ( $wannaUseSession ) == 'y' || strtolower ( $wannaUseSession ) == 'yes' ) {
$actions .= " \t \t \t \t \$ this->Session->setFlash('The " . Inflector :: humanize ( $currentModelName ) . " has been saved'); \n " ;
$actions .= " \t \t \t \t \$ this->redirect('/ { $controllerName } /index'); \n " ;
} else {
$actions .= " \t \t \t \t \$ this->flash(' { $currentModelName } saved.', '/ { $controllerName } /index'); \n " ;
}
$actions .= " \t \t \t } else { \n " ;
if ( strtolower ( $wannaUseSession ) == 'y' || strtolower ( $wannaUseSession ) == 'yes' ) {
$actions .= " \t \t \t \t \$ this->Session->setFlash('Please correct errors below.'); \n " ;
}
foreach ( $modelObj -> hasAndBelongsToMany as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
2006-10-14 18:07:52 +00:00
2006-10-13 09:31:20 +00:00
$actions .= " \t \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
$actions .= " \t \t \t \t if(empty( \$ this->data[' { $associationName } '][' { $associationName } '])) { \$ this->data[' { $associationName } '][' { $associationName } '] = null; } \n " ;
$actions .= " \t \t \t \t \$ this->set('selected_ { $otherPluralName } ', \$ this->data[' { $associationName } '][' { $associationName } ']); \n " ;
}
}
foreach ( $modelObj -> belongsTo as $associationName => $relation ) {
if ( ! empty ( $relation [ 'className' ])) {
$otherModelName = $this -> __modelName ( $relation [ 'className' ]);
$otherSingularName = $this -> __singularName ( $associationName );
$otherPluralName = $this -> __pluralName ( $associationName );
if ( $currentModelName != $otherModelName ) {
$actions .= " \t \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } -> { $otherModelName } ->generateList()); \n " ;
} else {
$actions .= " \t \t \t \t \$ this->set(' { $otherPluralName } ', \$ this-> { $currentModelName } ->generateList()); \n " ;
}
}
}
$actions .= " \t \t \t } \n " ;
$actions .= " \t \t } \n " ;
$actions .= " \t } \n " ;
$actions .= " \n " ;
$actions .= " \t function { $admin } delete( \$ id = null) { \n " ;
$actions .= " \t \t if(! \$ id) { \n " ;
$actions .= " \t \t \t return false; \n " ;
$actions .= " \t \t } \n " ;
$actions .= " \t \t if( \$ this-> { $currentModelName } ->del( \$ id)) { \n " ;
if ( strtolower ( $wannaUseSession ) == 'y' || strtolower ( $wannaUseSession ) == 'yes' ) {
$actions .= " \t \t \t \$ this->Session->setFlash('The " . $this -> __singularHumanName ( $currentModelName ) . " deleted: id '. \$ id.''); \n " ;
$actions .= " \t \t \t \$ this->redirect('/ { $controllerName } /index'); \n " ;
} else {
$actions .= " \t \t \t \$ this->flash(' { $currentModelName } deleted: id '. \$ id.'.', '/ { $controllerPath } /index'); \n " ;
}
$actions .= " \t \t } \n " ;
$actions .= " \t } \n " ;
$actions .= " \n " ;
return $actions ;
}
2006-05-26 05:29:17 +00:00
/**
2006-07-18 11:11:44 +00:00
* Action to create a Unit Test .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ return Success
2006-05-26 05:29:17 +00:00
*/
function doUnitTest () {
if ( is_dir ( 'vendors' . DS . 'simpletest' ) || is_dir ( APP_PATH . 'vendors' . DS . 'simpletest' )) {
return true ;
}
$unitTest = $this -> getInput ( 'Cake test suite not installed. Do you want to bake unit test files anyway?' , array ( 'y' , 'n' ), 'y' );
$result = strtolower ( $unitTest ) == 'y' || strtolower ( $unitTest ) == 'yes' ;
if ( $result ) {
$this -> stdout ( " \n You can download the Cake test suite from http://cakeforge.org/frs/?group_id=62 " , true );
}
return $result ;
}
/**
2006-07-18 11:11:44 +00:00
* Creates a database configuration file for Bake .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $host
* @ param string $login
* @ param string $password
* @ param string $database
2006-05-26 05:29:17 +00:00
*/
2006-10-09 20:27:28 +00:00
function bakeDbConfig ( $driver , $connect , $host , $login , $password , $database , $prefix ) {
2006-05-26 05:29:17 +00:00
$out = " <?php \n " ;
$out .= " class DATABASE_CONFIG \n " ;
$out .= " { \n " ;
$out .= " \t var \$ default = array( \n " ;
2006-10-09 20:27:28 +00:00
$out .= " \t \t 'driver' => ' { $driver } ', \n " ;
$out .= " \t \t 'connect' => ' { $connect } ', \n " ;
$out .= " \t \t 'host' => ' { $host } ', \n " ;
$out .= " \t \t 'login' => ' { $login } ', \n " ;
$out .= " \t \t 'password' => ' { $password } ', \n " ;
2006-10-10 20:00:35 +00:00
$out .= " \t \t 'database' => ' { $database } ', \n " ;
2006-10-09 20:27:28 +00:00
$out .= " \t \t 'prefix' => ' { $prefix } ' \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t ); \n " ;
$out .= " } \n " ;
$out .= " ?> " ;
$filename = CONFIGS . 'database.php' ;
$this -> createFile ( $filename , $out );
}
/**
2006-07-18 11:11:44 +00:00
* Assembles and writes a Model file .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $modelClassName
* @ param object $dbConnection
* @ param string $modelTableName
* @ param array $validate
* @ param array $modelAssociations
2006-05-26 05:29:17 +00:00
*/
function bakeModel ( $modelClassName , $dbConnection , $modelTableName , $validate , $modelAssociations ) {
$out = " <?php \n " ;
$out .= " class $modelClassName extends AppModel \n " ;
$out .= " { \n " ;
$out .= " \t var \$ name = ' $modelClassName '; \n " ;
if ( $dbConnection != 'default' ) {
$out .= " \t var \$ useDbConfig = ' $dbConnection '; \n " ;
}
if ( $modelTableName != null ) {
$out .= " \t var \$ useTable = ' $modelTableName '; \n " ;
}
if ( count ( $validate )) {
$out .= " \t var \$ validate = array( \n " ;
$keys = array_keys ( $validate );
for ( $i = 0 ; $i < count ( $validate ); $i ++ ) {
$out .= " \t \t ' " . $keys [ $i ] . " ' => " . $validate [ $keys [ $i ]] . " , \n " ;
}
$out .= " \t ); \n " ;
}
$out .= " \n " ;
if ( count ( $modelAssociations [ 'belongsTo' ]) || count ( $modelAssociations [ 'hasOne' ]) || count ( $modelAssociations [ 'hasMany' ]) || count ( $modelAssociations [ 'hasAndBelongsToMany' ])) {
$out .= " \t //The Associations below have been created with all possible keys, those that are not needed can be removed \n " ;
if ( count ( $modelAssociations [ 'belongsTo' ])) {
$out .= " \t var \$ belongsTo = array( \n " ;
for ( $i = 0 ; $i < count ( $modelAssociations [ 'belongsTo' ]); $i ++ ) {
$out .= " \t \t \t ' { $modelAssociations [ 'belongsTo' ][ $i ] } ' => \n " ;
$out .= " \t \t \t array('className' => ' { $modelAssociations [ 'belongsTo' ][ $i ] } ', \n " ;
$out .= " \t \t \t \t \t 'conditions' => '', \n " ;
2006-09-28 16:44:02 +00:00
$out .= " \t \t \t \t \t 'fields' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'order' => '', \n " ;
$out .= " \t \t \t \t \t 'foreignKey' => '', \n " ;
$out .= " \t \t \t \t \t 'counterCache' => ''), \n \n " ;
}
$out .= " \t ); \n \n " ;
}
if ( count ( $modelAssociations [ 'hasOne' ])) {
$out .= " \t var \$ hasOne = array( \n " ;
for ( $i = 0 ; $i < count ( $modelAssociations [ 'hasOne' ]); $i ++ ) {
$out .= " \t \t \t ' { $modelAssociations [ 'hasOne' ][ $i ] } ' => \n " ;
$out .= " \t \t \t array('className' => ' { $modelAssociations [ 'hasOne' ][ $i ] } ', \n " ;
2006-09-28 16:44:02 +00:00
$out .= " \t \t \t \t \t 'foreignKey' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'conditions' => '', \n " ;
2006-09-28 16:44:02 +00:00
$out .= " \t \t \t \t \t 'fields' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'order' => '', \n " ;
$out .= " \t \t \t \t \t 'dependent' => ''), \n \n " ;
}
$out .= " \t ); \n \n " ;
}
if ( count ( $modelAssociations [ 'hasMany' ])) {
$out .= " \t var \$ hasMany = array( \n " ;
for ( $i = 0 ; $i < count ( $modelAssociations [ 'hasMany' ]); $i ++ ) {
$out .= " \t \t \t ' { $modelAssociations [ 'hasMany' ][ $i ] } ' => \n " ;
$out .= " \t \t \t array('className' => ' { $modelAssociations [ 'hasMany' ][ $i ] } ', \n " ;
2006-09-28 16:44:02 +00:00
$out .= " \t \t \t \t \t 'foreignKey' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'conditions' => '', \n " ;
2006-07-23 18:59:52 +00:00
$out .= " \t \t \t \t \t 'fields' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'order' => '', \n " ;
2006-07-23 18:59:52 +00:00
$out .= " \t \t \t \t \t 'limit' => '', \n " ;
$out .= " \t \t \t \t \t 'offset' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'dependent' => '', \n " ;
$out .= " \t \t \t \t \t 'exclusive' => '', \n " ;
$out .= " \t \t \t \t \t 'finderSql' => '', \n " ;
$out .= " \t \t \t \t \t 'counterSql' => ''), \n \n " ;
}
$out .= " \t ); \n \n " ;
}
if ( count ( $modelAssociations [ 'hasAndBelongsToMany' ])) {
$out .= " \t var \$ hasAndBelongsToMany = array( \n " ;
for ( $i = 0 ; $i < count ( $modelAssociations [ 'hasAndBelongsToMany' ]); $i ++ ) {
$out .= " \t \t \t ' { $modelAssociations [ 'hasAndBelongsToMany' ][ $i ] } ' => \n " ;
$out .= " \t \t \t array('className' => ' { $modelAssociations [ 'hasAndBelongsToMany' ][ $i ] } ', \n " ;
$out .= " \t \t \t \t \t 'joinTable' => '', \n " ;
2006-07-23 18:59:52 +00:00
$out .= " \t \t \t \t \t 'foreignKey' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'associationForeignKey' => '', \n " ;
2006-07-23 18:59:52 +00:00
$out .= " \t \t \t \t \t 'conditions' => '', \n " ;
$out .= " \t \t \t \t \t 'fields' => '', \n " ;
$out .= " \t \t \t \t \t 'order' => '', \n " ;
$out .= " \t \t \t \t \t 'limit' => '', \n " ;
$out .= " \t \t \t \t \t 'offset' => '', \n " ;
2006-05-26 05:29:17 +00:00
$out .= " \t \t \t \t \t 'uniq' => '', \n " ;
$out .= " \t \t \t \t \t 'finderQuery' => '', \n " ;
$out .= " \t \t \t \t \t 'deleteQuery' => '', \n " ;
$out .= " \t \t \t \t \t 'insertQuery' => ''), \n \n " ;
}
$out .= " \t ); \n \n " ;
}
}
$out .= " } \n " ;
$out .= " ?> " ;
2006-10-09 20:27:28 +00:00
$filename = MODELS . Inflector :: underscore ( $modelClassName ) . '.php' ;
2006-05-26 05:29:17 +00:00
$this -> createFile ( $filename , $out );
}
/**
2006-07-18 11:11:44 +00:00
* Assembles and writes a View file .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $controllerName
* @ param string $actionName
* @ param string $content
2006-05-26 05:29:17 +00:00
*/
function bakeView ( $controllerName , $actionName , $content = '' ) {
2006-07-29 05:58:31 +00:00
$out = " <h2> $actionName </h2> \n " ;
2006-05-26 05:29:17 +00:00
$out .= $content ;
2006-10-10 18:24:25 +00:00
if ( ! file_exists ( VIEWS . $this -> __controllerPath ( $controllerName ))) {
mkdir ( VIEWS . $this -> __controllerPath ( $controllerName ));
2006-05-26 05:29:17 +00:00
}
2006-10-10 18:24:25 +00:00
$filename = VIEWS . $this -> __controllerPath ( $controllerName ) . DS . Inflector :: underscore ( $actionName ) . '.thtml' ;
2006-05-26 05:29:17 +00:00
$this -> createFile ( $filename , $out );
}
/**
2006-07-18 11:11:44 +00:00
* Assembles and writes a Controller file .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $controllerName
* @ param array $uses
* @ param array $helpers
* @ param array $components
* @ param string $actions
2006-05-26 05:29:17 +00:00
*/
function bakeController ( $controllerName , $uses , $helpers , $components , $actions = '' ) {
$out = " <?php \n " ;
$out .= " class $controllerName " . " Controller extends AppController \n " ;
$out .= " { \n " ;
$out .= " \t //var \$ scaffold; \n " ;
$out .= " \t var \$ name = ' $controllerName '; \n " ;
if ( count ( $uses )) {
2006-10-09 20:27:28 +00:00
$out .= " \t var \$ uses = array(' " . $this -> __modelName ( $controllerName ) . " ', " ;
2006-05-26 05:29:17 +00:00
foreach ( $uses as $use ) {
if ( $use != $uses [ count ( $uses ) - 1 ]) {
2006-10-09 20:27:28 +00:00
$out .= " ' " . $this -> __modelName ( $use ) . " ', " ;
2006-05-26 05:29:17 +00:00
} else {
2006-10-09 20:27:28 +00:00
$out .= " ' " . $this -> __modelName ( $use ) . " ' " ;
2006-05-26 05:29:17 +00:00
}
}
$out .= " ); \n " ;
}
2006-07-29 05:58:31 +00:00
$out .= " \t var \$ helpers = array('Html', 'Form' " ;
if ( count ( $helpers )) {
foreach ( $helpers as $help ) {
if ( $help != $helpers [ count ( $helpers ) - 1 ]) {
2006-10-09 20:27:28 +00:00
$out .= " , ' " . Inflector :: camelize ( $help ) . " ' " ;
2006-07-29 05:58:31 +00:00
} else {
2006-10-09 20:27:28 +00:00
$out .= " , ' " . Inflector :: camelize ( $help ) . " ' " ;
2006-07-29 05:58:31 +00:00
}
2006-05-26 05:29:17 +00:00
}
}
$out .= " ); \n " ;
if ( count ( $components )) {
$out .= " \t var \$ components = array( " ;
foreach ( $components as $comp ) {
if ( $comp != $components [ count ( $components ) - 1 ]) {
2006-10-09 20:27:28 +00:00
$out .= " ' " . Inflector :: camelize ( $comp ) . " ', " ;
2006-05-26 05:29:17 +00:00
} else {
2006-10-09 20:27:28 +00:00
$out .= " ' " . Inflector :: camelize ( $comp ) . " ' " ;
2006-05-26 05:29:17 +00:00
}
}
$out .= " ); \n " ;
}
$out .= $actions ;
$out .= " } \n " ;
$out .= " ?> " ;
2006-10-10 18:24:25 +00:00
$filename = CONTROLLERS . $this -> __controllerPath ( $controllerName ) . '_controller.php' ;
2006-05-26 05:29:17 +00:00
$this -> createFile ( $filename , $out );
}
/**
2006-07-18 11:11:44 +00:00
* Assembles and writes a unit test file .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $type One of " model " , and " controller " .
* @ param string $className
2006-05-26 05:29:17 +00:00
*/
function bakeUnitTest ( $type , $className ) {
$out = '<?php ' . " \n \n " ;
$error = false ;
switch ( $type ) {
case 'model' :
$out .= " class { $className } TestCase extends UnitTestCase \n { \n " ;
$out .= " \t var \$ object = null; \n \n " ;
$out .= " \t function setUp() \n \t { \n \t \t \$ this->object = new { $className } (); \n " ;
$out .= " \t } \n \n \t function tearDown() \n \t { \n \t \t unset( \$ this->object); \n \t } \n " ;
$out .= " \n \t /* \n \t function testMe() \n \t { \n " ;
$out .= " \t \t \$ result = \$ this->object->doSomething(); \n " ;
$out .= " \t \t \$ expected = 1; \n " ;
$out .= " \t \t \$ this->assertEquals( \$ result, \$ expected); \n \t } \n \t */ \n } " ;
$path = MODEL_TESTS ;
2006-10-09 20:27:28 +00:00
$filename = $this -> __singularName ( $className ) . '.test.php' ;
2006-05-26 05:29:17 +00:00
break ;
case 'controller' :
$out .= " class { $className } ControllerTestCase extends UnitTestCase \n { \n " ;
$out .= " \t var \$ object = null; \n \n " ;
$out .= " \t function setUp() \n \t { \n \t \t \$ this->object = new { $className } (); \n " ;
$out .= " \t } \n \n \t function tearDown() \n \t { \n \t \t unset( \$ this->object); \n \t } \n " ;
$out .= " \n \t /* \n \t function testMe() \n \t { \n " ;
$out .= " \t \t \$ result = \$ this->object->doSomething(); \n " ;
$out .= " \t \t \$ expected = 1; \n " ;
$out .= " \t \t \$ this->assertEquals( \$ result, \$ expected); \n \t } \n \t */ \n } " ;
$path = CONTROLLER_TESTS ;
2006-10-09 20:27:28 +00:00
$filename = $this -> __pluralName ( $className . 'Controller' ) . '.test.php' ;
2006-05-26 05:29:17 +00:00
break ;
default :
$error = true ;
break ;
}
$out .= " \n ?> " ;
if ( ! $error ) {
$this -> stdout ( " Baking unit test for $className ... " );
$path = explode ( DS , $path );
foreach ( $path as $i => $val ) {
2006-10-09 20:27:28 +00:00
if ( $val == '' || $val == '../' ) {
2006-05-26 05:29:17 +00:00
unset ( $path [ $i ]);
}
}
$path = implode ( DS , $path );
2006-10-09 20:27:28 +00:00
echo $path ;
2006-06-19 01:44:18 +00:00
$unixPath = DS ;
2006-06-19 01:47:08 +00:00
if ( strpos ( PHP_OS , 'WIN' ) === 0 ){
2006-06-19 01:44:18 +00:00
$unixPath = null ;
}
if ( ! is_dir ( $unixPath . $path )) {
2006-05-26 05:29:17 +00:00
$create = $this -> getInput ( " Unit test directory does not exist. Create it? " , array ( 'y' , 'n' ), 'y' );
if ( low ( $create ) == 'y' || low ( $create ) == 'yes' ) {
$build = array ();
2006-06-19 01:44:18 +00:00
2006-05-26 05:29:17 +00:00
foreach ( explode ( DS , $path ) as $i => $dir ) {
$build [] = $dir ;
2006-06-19 01:44:18 +00:00
if ( ! is_dir ( $unixPath . implode ( DS , $build ))) {
mkdir ( $unixPath . implode ( DS , $build ));
2006-05-26 05:29:17 +00:00
}
}
}
}
2006-06-19 01:44:18 +00:00
$this -> createFile ( $unixPath . $path . DS . $filename , $out );
2006-05-26 05:29:17 +00:00
}
}
/**
2006-07-18 11:11:44 +00:00
* Prompts the user for input , and returns it .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $prompt Prompt text .
* @ param mixed $options Array or string of options .
* @ param string $default Default input value .
* @ return Either the default value , or the user - provided input .
2006-05-26 05:29:17 +00:00
*/
function getInput ( $prompt , $options = null , $default = null ) {
if ( ! is_array ( $options )) {
$print_options = '' ;
} else {
$print_options = '(' . implode ( '/' , $options ) . ')' ;
}
if ( $default == null ) {
$this -> stdout ( '' );
$this -> stdout ( $prompt . " $print_options \n " . '> ' , false );
} else {
$this -> stdout ( '' );
$this -> stdout ( $prompt . " $print_options \n " . " [ $default ] > " , false );
}
$result = trim ( fgets ( $this -> stdin ));
if ( $default != null && empty ( $result )) {
return $default ;
} else {
return $result ;
}
}
/**
2006-07-18 11:11:44 +00:00
* Outputs to the stdout filehandle .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $string String to output .
* @ param boolean $newline If true , the outputs gets an added newline .
2006-05-26 05:29:17 +00:00
*/
function stdout ( $string , $newline = true ) {
if ( $newline ) {
fwrite ( $this -> stdout , $string . " \n " );
} else {
fwrite ( $this -> stdout , $string );
}
}
/**
2006-07-18 11:11:44 +00:00
* Outputs to the stderr filehandle .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $string Error text to output .
2006-05-26 05:29:17 +00:00
*/
function stderr ( $string ) {
fwrite ( $this -> stderr , $string );
}
/**
2006-07-18 11:11:44 +00:00
* Outputs a series of minus characters to the standard output , acts as a visual separator .
2006-05-26 05:29:17 +00:00
*
*/
function hr () {
$this -> stdout ( '---------------------------------------------------------------' );
}
/**
2006-07-18 11:11:44 +00:00
* Creates a file at given path .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $path Where to put the file .
* @ param string $contents Content to put in the file .
* @ return Success
2006-05-26 05:29:17 +00:00
*/
function createFile ( $path , $contents ) {
2006-10-09 20:27:28 +00:00
//$shortPath = str_replace(ROOT, null, $path);
//$shortPath = str_replace('../', '', $shortPath);
//$shortPath = str_replace('//', '/', $shortPath);
$shortPath = $path ;
2006-07-23 18:59:52 +00:00
echo " \n Creating file $shortPath\n " ;
$path = str_replace ( '//' , '/' , $path );
2006-05-26 05:29:17 +00:00
if ( is_file ( $path ) && $this -> interactive === true ) {
fwrite ( $this -> stdout , " File { $shortPath } exists, overwrite? (y/n/q): " );
$key = trim ( fgets ( $this -> stdin ));
if ( $key == 'q' ) {
fwrite ( $this -> stdout , " Quitting. \n " );
exit ;
} elseif ( $key == 'a' ) {
$this -> dont_ask = true ;
} elseif ( $key == 'y' ) {
} else {
fwrite ( $this -> stdout , " Skip { $shortPath } \n " );
return false ;
}
}
if ( $f = fopen ( $path , 'w' )) {
fwrite ( $f , $contents );
fclose ( $f );
fwrite ( $this -> stdout , " Wrote { $shortPath } \n " );
return true ;
} else {
fwrite ( $this -> stderr , " Error! Couldn't open { $shortPath } for writing. \n " );
return false ;
}
}
/**
2006-07-18 11:11:44 +00:00
* Takes an array of database fields , and generates an HTML form for a View .
2006-07-23 18:59:52 +00:00
* This is an extraction from the Scaffold functionality .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param array $fields
* @ param boolean $readOnly
* @ return Generated HTML and PHP .
2006-05-26 05:29:17 +00:00
*/
function generateFields ( $fields , $readOnly = false ) {
$strFormFields = '' ;
2006-10-09 20:27:28 +00:00
foreach ( $fields as $field ) {
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
if ( isset ( $field [ 'type' ])) {
if ( ! isset ( $field [ 'required' ])) {
$field [ 'required' ] = false ;
}
if ( ! isset ( $field [ 'errorMsg' ])) {
$field [ 'errorMsg' ] = null ;
}
if ( ! isset ( $field [ 'htmlOptions' ])) {
$field [ 'htmlOptions' ] = array ();
}
if ( $readOnly ) {
$field [ 'htmlOptions' ][ 'READONLY' ] = " readonly " ;
}
switch ( $field [ 'type' ] ) {
2006-07-27 16:52:36 +00:00
case " input " :
2006-07-23 18:59:52 +00:00
if ( ! isset ( $field [ 'size' ])) {
$field [ 'size' ] = 60 ;
2006-05-26 05:29:17 +00:00
}
$strFormFields = $strFormFields . $this -> generateInputDiv ( $field [ 'tagName' ], $field [ 'prompt' ], $field [ 'required' ], $field [ 'errorMsg' ], $field [ 'size' ], $field [ 'htmlOptions' ] );
break ;
case " checkbox " :
$strFormFields = $strFormFields . $this -> generateCheckboxDiv ( $field [ 'tagName' ], $field [ 'prompt' ], $field [ 'required' ], $field [ 'errorMsg' ], $field [ 'htmlOptions' ] );
break ;
case " select " ;
case " selectMultiple " ;
if ( " selectMultiple " == $field [ 'type' ] ) {
$field [ 'selectAttr' ][ 'multiple' ] = 'multiple' ;
$field [ 'selectAttr' ][ 'class' ] = 'selectMultiple' ;
}
if ( ! isset ( $field [ 'selected' ])) {
$field [ 'selected' ] = null ;
}
if ( ! isset ( $field [ 'selectAttr' ])) {
$field [ 'selectAttr' ] = null ;
}
if ( ! isset ( $field [ 'optionsAttr' ])) {
$field [ 'optionsAttr' ] = null ;
}
if ( $readOnly ) {
$field [ 'selectAttr' ][ 'DISABLED' ] = true ;
}
if ( ! isset ( $field [ 'options' ])) {
$field [ 'options' ] = null ;
}
2006-10-13 07:54:27 +00:00
$this -> __modelAlias = null ;
2006-10-09 20:27:28 +00:00
if ( isset ( $field [ 'foreignKey' ])) {
2006-10-13 08:52:26 +00:00
$modelKey = Inflector :: underscore ( $this -> __modelClass );
2006-10-10 18:24:25 +00:00
$modelObj =& ClassRegistry :: getObject ( $modelKey );
2006-10-13 08:52:26 +00:00
foreach ( $modelObj -> belongsTo as $associationName => $value ) {
if ( $field [ 'model' ] == $value [ 'className' ]) {
2006-10-10 18:24:25 +00:00
$this -> __modelAlias = $this -> __modelName ( $associationName );
2006-10-13 08:52:26 +00:00
break ;
2006-10-10 18:24:25 +00:00
}
2006-10-09 20:27:28 +00:00
}
}
2006-05-26 05:29:17 +00:00
$strFormFields = $strFormFields . $this -> generateSelectDiv ( $field [ 'tagName' ], $field [ 'prompt' ], $field [ 'options' ], $field [ 'selected' ], $field [ 'selectAttr' ], $field [ 'optionsAttr' ], $field [ 'required' ], $field [ 'errorMsg' ] );
break ;
case " area " ;
if ( ! isset ( $field [ 'rows' ])) {
$field [ 'rows' ] = 10 ;
}
if ( ! isset ( $field [ 'cols' ])) {
$field [ 'cols' ] = 60 ;
}
$strFormFields = $strFormFields . $this -> generateAreaDiv ( $field [ 'tagName' ], $field [ 'prompt' ], $field [ 'required' ], $field [ 'errorMsg' ], $field [ 'cols' ], $field [ 'rows' ], $field [ 'htmlOptions' ] );
break ;
case " fieldset " ;
$strFieldsetFields = $this -> generateFields ( $field [ 'fields' ] );
$strFieldSet = sprintf ( '
< fieldset >< legend >% s </ legend >< div class = " notes " >< h4 >% s </ h4 >< p class = " last " >% s </ p ></ div >% s </ fieldset > ' ,
$field [ 'legend' ], $field [ 'noteHeading' ], $field [ 'note' ], $strFieldsetFields );
$strFormFields = $strFormFields . $strFieldSet ;
break ;
case " hidden " ;
2006-10-13 08:52:26 +00:00
$currentModelName = $field [ 'model' ];
2006-05-26 05:29:17 +00:00
//$strFormFields = $strFormFields . $this->Html->hiddenTag( $field['tagName']);
break ;
case " date " :
2006-09-15 20:19:03 +00:00
if ( ! isset ( $field [ 'selected' ])) {
2006-05-26 05:29:17 +00:00
$field [ 'selected' ] = null ;
}
2006-09-15 20:19:03 +00:00
$strFormFields = $strFormFields . $this -> generateDate ( $field [ 'tagName' ], $field [ 'prompt' ], $field [ 'required' ], $field [ 'errorMsg' ], null , $field [ 'htmlOptions' ], $field [ 'selected' ]);
2006-05-26 05:29:17 +00:00
break ;
case " datetime " :
2006-09-15 20:19:03 +00:00
if ( ! isset ( $field [ 'selected' ])) {
2006-05-26 05:29:17 +00:00
$field [ 'selected' ] = null ;
}
2006-09-15 20:19:03 +00:00
$strFormFields = $strFormFields . $this -> generateDateTime ( $field [ 'tagName' ], $field [ 'prompt' ], $field [ 'required' ], $field [ 'errorMsg' ], null , $field [ 'htmlOptions' ], $field [ 'selected' ]);
2006-05-26 05:29:17 +00:00
break ;
2006-07-15 03:36:53 +00:00
case " time " :
2006-09-15 20:19:03 +00:00
if ( ! isset ( $field [ 'selected' ])) {
2006-07-15 03:36:53 +00:00
$field [ 'selected' ] = null ;
}
2006-09-15 20:19:03 +00:00
$strFormFields = $strFormFields . $this -> generateTime ( $field [ 'tagName' ], $field [ 'prompt' ], $field [ 'required' ], $field [ 'errorMsg' ], null , $field [ 'htmlOptions' ], $field [ 'selected' ]);
2006-07-15 03:36:53 +00:00
break ;
2006-05-26 05:29:17 +00:00
default :
break ;
}
}
}
return $strFormFields ;
}
/**
2006-07-18 11:11:44 +00:00
* Generates PHP code for a View file that makes a textarea .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $tagName
* @ param string $prompt
* @ param boolean $required
* @ param string $errorMsg
* @ param integer $cols
* @ param integer $rows
* @ param array $htmlOptions
* @ return Generated HTML and PHP .
2006-05-26 05:29:17 +00:00
*/
function generateAreaDiv ( $tagName , $prompt , $required = false , $errorMsg = null , $cols = 60 , $rows = 10 , $htmlOptions = null ) {
$htmlAttributes = $htmlOptions ;
$htmlAttributes [ 'cols' ] = $cols ;
$htmlAttributes [ 'rows' ] = $rows ;
2006-07-29 05:58:31 +00:00
$str = " \t <?php echo \$ html->textarea(' { $tagName } ', " . $this -> attributesToArray ( $htmlAttributes ) . " );?> \n " ;
2006-09-07 19:23:27 +00:00
$str .= " \t <?php echo \$ html->tagErrorMsg(' { $tagName } ', 'Please enter the { $prompt } .');?> \n " ;
2006-07-29 05:58:31 +00:00
$strLabel = " \n \t <?php echo \$ form->label( ' { $tagName } ', ' { $prompt } ' );?> \n " ;
2006-05-26 05:29:17 +00:00
$divClass = " optional " ;
if ( $required ) {
$divClass = " required " ;
}
$strError = " " ; // initialize the error to empty.
$divTagInside = sprintf ( " %s %s %s " , $strError , $strLabel , $str );
return $this -> divTag ( $divClass , $divTagInside );
}
/**
2006-07-18 11:11:44 +00:00
* Generates PHP code for a View file that makes a checkbox , wrapped in a DIV .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $tagName
* @ param string $prompt
* @ param boolean $required
* @ param string $errorMsg
* @ param array $htmlOptions
* @ return Generated HTML and PHP .
2006-05-26 05:29:17 +00:00
*/
function generateCheckboxDiv ( $tagName , $prompt , $required = false , $errorMsg = null , $htmlOptions = null ) {
$htmlOptions [ 'class' ] = " inputCheckbox " ;
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
$strLabel = " \n \t <?php echo \$ html->checkbox(' { $tagName } ', null, " . $this -> attributesToArray ( $htmlAttributes ) . " );?> \n " ;
$strLabel .= " \t <?php echo \$ form->label(' { $tagName } ', ' { $prompt } ');?> \n " ;
$str = " \t <?php echo \$ html->tagErrorMsg(' { $tagName } ', 'Please check the { $prompt } .');?> \n " ;
2006-05-26 05:29:17 +00:00
$divClass = " optional " ;
if ( $required ) {
$divClass = " required " ;
}
$strError = " " ; // initialize the error to empty.
2006-10-10 18:24:25 +00:00
$divTagInside = sprintf ( " %s %s %s " , $strError , $strLabel , $str );
2006-05-26 05:29:17 +00:00
return $this -> divTag ( $divClass , $divTagInside );
}
/**
2006-07-18 11:11:44 +00:00
* Generates PHP code for a View file that makes a date - picker , wrapped in a DIV .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $tagName
* @ param string $prompt
* @ param boolean $required
* @ param string $errorMsg
* @ param integer $size
* @ param array $htmlOptions
* @ param string $selected
* @ return Generated HTML and PHP .
2006-05-26 05:29:17 +00:00
*/
function generateDate ( $tagName , $prompt , $required = false , $errorMsg = null , $size = 20 , $htmlOptions = null , $selected = null ) {
2006-07-29 05:58:31 +00:00
$str = " \t <?php echo \$ html->dateTimeOptionTag(' { $tagName } ', 'MDY' , 'NONE', \$ html->tagValue(' { $tagName } '), " . $this -> attributesToArray ( $htmlOptions ) . " );?> \n " ;
2006-09-07 19:23:27 +00:00
$str .= " \t <?php echo \$ html->tagErrorMsg(' { $tagName } ', 'Please select the { $prompt } .');?> \n " ;
2006-07-29 05:58:31 +00:00
$strLabel = " \n \t <?php echo \$ form->label(' { $tagName } ', ' { $prompt } ');?> \n " ;
2006-05-26 05:29:17 +00:00
$divClass = " optional " ;
if ( $required ) {
$divClass = " required " ;
}
$strError = " " ; // initialize the error to empty.
$divTagInside = sprintf ( " %s %s %s " , $strError , $strLabel , $str );
2006-07-29 05:58:31 +00:00
return $this -> divTag ( $divClass , $divTagInside );
2006-05-26 05:29:17 +00:00
}
2006-07-15 03:36:53 +00:00
/**
2006-07-18 11:11:44 +00:00
* Generates PHP code for a View file that makes a time - picker , wrapped in a DIV .
2006-07-15 03:36:53 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $tagName
* @ param string $prompt
* @ param boolean $required
* @ param string $errorMsg
* @ param integer $size
* @ param array $htmlOptions
* @ param string $selected
* @ return Generated HTML and PHP .
2006-07-15 03:36:53 +00:00
*/
function generateTime ( $tagName , $prompt , $required = false , $errorMsg = null , $size = 20 , $htmlOptions = null , $selected = null ) {
2006-09-15 20:19:03 +00:00
$str = " \n \t \ <?php echo \$ html->dateTimeOptionTag(' { $tagName } ', 'NONE', '24', \$ html->tagValue(' { $tagName } '), " . $this -> attributesToArray ( $htmlOptions ) . " );?> \n " ;
2006-07-29 05:58:31 +00:00
$strLabel = " \n \t <?php echo \$ form->label(' { $tagName } ', ' { $prompt } ');?> \n " ;
2006-07-15 03:36:53 +00:00
$divClass = " optional " ;
if ( $required ) {
$divClass = " required " ;
}
$strError = " " ;
$divTagInside = sprintf ( " %s %s %s " , $strError , $strLabel , $str );
2006-07-29 05:58:31 +00:00
return $this -> divTag ( $divClass , $divTagInside );
2006-07-15 03:36:53 +00:00
}
2006-05-26 05:29:17 +00:00
/**
2006-07-18 11:11:44 +00:00
* EGenerates PHP code for a View file that makes a datetime - picker , wrapped in a DIV .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $tagName
* @ param string $prompt
* @ param boolean $required
* @ param string $errorMsg
* @ param integer $size
* @ param array $htmlOptions
* @ param string $selected
* @ return Generated HTML and PHP .
2006-05-26 05:29:17 +00:00
*/
function generateDateTime ( $tagName , $prompt , $required = false , $errorMsg = null , $size = 20 , $htmlOptions = null , $selected = null ) {
2006-07-29 05:58:31 +00:00
$str = " \t <?php echo \$ html->dateTimeOptionTag(' { $tagName } ', 'MDY' , '12', \$ html->tagValue(' { $tagName } '), " . $this -> attributesToArray ( $htmlOptions ) . " );?> \n " ;
2006-09-07 19:23:27 +00:00
$str .= " \t <?php echo \$ html->tagErrorMsg(' { $tagName } ', 'Please select the { $prompt } .');?> \n " ;
2006-07-29 05:58:31 +00:00
$strLabel = " \n \t <?php echo \$ form->label(' { $tagName } ', ' { $prompt } ');?> \n " ;
2006-05-26 05:29:17 +00:00
$divClass = " optional " ;
if ( $required ) {
$divClass = " required " ;
}
$strError = " " ; // initialize the error to empty.
$divTagInside = sprintf ( " %s %s %s " , $strError , $strLabel , $str );
2006-07-29 05:58:31 +00:00
return $this -> divTag ( $divClass , $divTagInside );
2006-05-26 05:29:17 +00:00
}
/**
2006-07-18 11:11:44 +00:00
* Generates PHP code for a View file that makes an INPUT field , wrapped in a DIV .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $tagName
* @ param string $prompt
* @ param boolean $required
* @ param string $errorMsg
* @ param integer $size
* @ param array $htmlOptions
* @ return Generated HTML and PHP .
2006-05-26 05:29:17 +00:00
*/
function generateInputDiv ( $tagName , $prompt , $required = false , $errorMsg = null , $size = 20 , $htmlOptions = null ) {
$htmlAttributes = $htmlOptions ;
$htmlAttributes [ 'size' ] = $size ;
2006-07-29 05:58:31 +00:00
$str = " \t <?php echo \$ html->input(' { $tagName } ', " . $this -> attributesToArray ( $htmlAttributes ) . " );?> \n " ;
2006-09-07 19:23:27 +00:00
$str .= " \t <?php echo \$ html->tagErrorMsg(' { $tagName } ', 'Please enter the { $prompt } .');?> \n " ;
2006-07-29 05:58:31 +00:00
$strLabel = " \n \t <?php echo \$ form->label(' { $tagName } ', ' { $prompt } ');?> \n " ;
2006-05-26 05:29:17 +00:00
$divClass = " optional " ;
if ( $required ) {
$divClass = " required " ;
}
$strError = " " ; // initialize the error to empty.
$divTagInside = sprintf ( " %s %s %s " , $strError , $strLabel , $str );
return $this -> divTag ( $divClass , $divTagInside );
}
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
/**
2006-07-18 11:11:44 +00:00
* Generates PHP code for a View file that makes a SELECT box , wrapped in a DIV .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $tagName
* @ param string $prompt
* @ param array $options
* @ param string $selected
* @ param array $selectAttr
* @ param array $optionAttr
* @ param boolean $required
* @ param string $errorMsg
* @ return Generated HTML and PHP .
2006-05-26 05:29:17 +00:00
*/
function generateSelectDiv ( $tagName , $prompt , $options , $selected = null , $selectAttr = null , $optionAttr = null , $required = false , $errorMsg = null ) {
2006-10-14 18:07:52 +00:00
2006-10-10 18:24:25 +00:00
if ( $this -> __modelAlias ) {
$pluralName = $this -> __pluralName ( $this -> __modelAlias );
} else {
$tagArray = explode ( '/' , $tagName );
$pluralName = $this -> __pluralName ( $this -> __modelNameFromKey ( $tagArray [ 1 ]));
}
2006-10-14 18:07:52 +00:00
2006-05-26 05:29:17 +00:00
if ( $selectAttr [ 'multiple' ] != 'multiple' ) {
2006-10-09 20:27:28 +00:00
$str = " \t <?php echo \$ html->selectTag(' { $tagName } ', " . " \$ { $pluralName } , \$ html->tagValue(' { $tagName } '), " . $this -> attributesToArray ( $selectAttr ) . " );?> \n " ;
2006-09-07 19:23:27 +00:00
$str .= " \t <?php echo \$ html->tagErrorMsg(' { $tagName } ', 'Please select the { $prompt } .') ?> \n " ;
2006-05-26 05:29:17 +00:00
} else {
2006-10-10 20:00:35 +00:00
$str = " \t <?php echo \$ html->selectTag(' { $tagName } ', \$ { $pluralName } , \$ selected_ { $pluralName } , array('multiple' => 'multiple', 'class' => 'selectMultiple'));?> \n " ;
2006-09-07 19:23:27 +00:00
$str .= " \t <?php echo \$ html->tagErrorMsg(' { $tagName } ', 'Please select the { $prompt } .');?> \n " ;
2006-05-26 05:29:17 +00:00
}
2006-07-29 05:58:31 +00:00
$strLabel = " \n \t <?php echo \$ form->label(' { $tagName } ', ' { $prompt } ');?> \n " ;
2006-05-26 05:29:17 +00:00
$divClass = " optional " ;
if ( $required ) {
$divClass = " required " ;
}
$strError = " " ; // initialize the error to empty.
$divTagInside = sprintf ( " %s %s %s " , $strError , $strLabel , $str );
return $this -> divTag ( $divClass , $divTagInside );
}
/**
2006-07-18 11:11:44 +00:00
* Generates PHP code for a View file that makes a submit button , wrapped in a DIV .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $displayText
* @ param array $htmlOptions
* @ return Generated HTML .
2006-05-26 05:29:17 +00:00
*/
function generateSubmitDiv ( $displayText , $htmlOptions = null ) {
2006-07-29 05:58:31 +00:00
$str = " \n \t <?php echo \$ html->submit(' { $displayText } ');?> \n " ;
$divTagInside = sprintf ( " %s " , $str );
return $this -> divTag ( 'submit' , $divTagInside );
2006-05-26 05:29:17 +00:00
}
/**
2006-07-18 11:11:44 +00:00
* Returns the text wrapped in an HTML P tag , followed by a newline .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $class
* @ param string $text
* @ return Generated HTML .
2006-05-26 05:29:17 +00:00
*/
function pTag ( $class , $text ) {
return sprintf ( TAG_P_CLASS , $class , $text ) . " \n " ;
}
/**
2006-07-18 11:11:44 +00:00
* Returns the text wrapped in an HTML DIV , followed by a newline .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $class
* @ param string $text
* @ return Generated HTML .
2006-05-26 05:29:17 +00:00
*/
function divTag ( $class , $text ) {
return sprintf ( TAG_DIV , $class , $text ) . " \n " ;
}
/**
2006-07-18 11:11:44 +00:00
* Parses the HTML attributes array , which is a common data structure in View files .
* Returns PHP code for initializing this array in a View file .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param array $htmlAttributes
* @ return Generated PHP code .
2006-05-26 05:29:17 +00:00
*/
function attributesToArray ( $htmlAttributes ) {
if ( is_array ( $htmlAttributes )) {
$keys = array_keys ( $htmlAttributes );
$vals = array_values ( $htmlAttributes );
$out = " array( " ;
for ( $i = 0 ; $i < count ( $htmlAttributes ); $i ++ ) {
//don't put vars in quotes
if ( substr ( $vals [ $i ], 0 , 1 ) != '$' ) {
$out .= " ' { $keys [ $i ] } ' => ' { $vals [ $i ] } ', " ;
} else {
$out .= " ' { $keys [ $i ] } ' => { $vals [ $i ] } , " ;
}
}
//Chop off last comma
2006-07-29 05:58:31 +00:00
if ( substr ( $out , - 2 , 1 ) == ',' ) {
2006-05-26 05:29:17 +00:00
$out = substr ( $out , 0 , strlen ( $out ) - 2 );
}
$out .= " ) " ;
return $out ;
} else {
return 'array()' ;
}
}
/**
2006-07-18 11:11:44 +00:00
* Outputs usage text on the standard output .
2006-05-26 05:29:17 +00:00
*
*/
function help () {
$this -> stdout ( 'CakePHP Bake:' );
$this -> hr ();
$this -> stdout ( 'The Bake script generates controllers, views and models for your application.' );
$this -> stdout ( 'If run with no command line arguments, Bake guides the user through the class' );
2006-06-19 07:23:27 +00:00
$this -> stdout ( 'creation process. You can customize the generation process by telling Bake' );
2006-05-26 05:29:17 +00:00
$this -> stdout ( 'where different parts of your application are using command line arguments.' );
$this -> stdout ( '' );
$this -> hr ( '' );
$this -> stdout ( 'usage: php bake.php [command] [path...]' );
$this -> stdout ( '' );
$this -> stdout ( 'commands:' );
$this -> stdout ( ' -app [path...] Absolute path to Cake\'s app Folder.' );
$this -> stdout ( ' -core [path...] Absolute path to Cake\'s cake Folder.' );
$this -> stdout ( ' -help Shows this help message.' );
$this -> stdout ( ' -project [path...] Generates a new app folder in the path supplied.' );
$this -> stdout ( ' -root [path...] Absolute path to Cake\'s \app\webroot Folder.' );
$this -> stdout ( '' );
}
/**
2006-07-23 18:59:52 +00:00
* Checks that given project path does not already exist , and
2006-07-18 11:11:44 +00:00
* finds the app directory in it . Then it calls __buildDirLayout () with that information .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $projectPath
2006-05-26 05:29:17 +00:00
*/
2006-10-10 22:05:41 +00:00
function project ( $projectPath = null ) {
2006-05-26 05:29:17 +00:00
if ( $projectPath != '' ) {
while ( $this -> __checkPath ( $projectPath ) === true ) {
$projectPath = $this -> getInput ( 'Directory exists please choose another name:' );
2006-10-10 22:05:41 +00:00
$this -> __buildDirLayout ( null , null );
2006-05-26 05:29:17 +00:00
exit ();
}
} else {
while ( $projectPath == '' ) {
$projectPath = $this -> getInput ( " What is the full path for this app including the app directory name? \n Example: " . ROOT . " myapp " , null , ROOT . 'myapp' );
if ( $projectPath == '' ) {
$this -> stdout ( 'The directory path you supplied was empty. Please try again.' );
}
}
}
while ( $this -> __checkPath ( $projectPath ) === true || $projectPath == '' ) {
2006-10-13 03:46:47 +00:00
$projectPath = $this -> getInput ( 'Directory path exists please choose another:' );
2006-05-26 05:29:17 +00:00
while ( $projectPath == '' ) {
$projectPath = $this -> getInput ( 'The directory path you supplied was empty. Please try again.' );
}
}
$parentPath = explode ( DS , $projectPath );
$count = count ( $parentPath );
$appName = $parentPath [ $count - 1 ];
$this -> __buildDirLayout ( $projectPath , $appName );
exit ();
}
/**
2006-07-18 11:11:44 +00:00
* Returns true if given path is a directory .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $projectPath
* @ return True if given path is a directory .
2006-05-26 05:29:17 +00:00
*/
function __checkPath ( $projectPath ) {
if ( is_dir ( $projectPath )) {
return true ;
} else {
return false ;
}
}
/**
2006-07-18 11:11:44 +00:00
* Looks for a skeleton template of a Cake application ,
* and if not found asks the user for a path . When there is a path
* this method will make a deep copy of the skeleton to the project directory .
* A default home page will be added , and the tmp file storage will be chmod ' ed to 0777.
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $projectPath
* @ param string $appName
2006-05-26 05:29:17 +00:00
*/
function __buildDirLayout ( $projectPath , $appName ) {
$skel = '' ;
2006-10-09 20:27:28 +00:00
if ( $this -> __checkPath ( CAKE_CORE_INCLUDE_PATH . DS . 'cake' . DS . 'scripts' . DS . 'templates' . DS . 'skel' ) === true ) {
$skel = CAKE_CORE_INCLUDE_PATH . DS . 'cake' . DS . 'scripts' . DS . 'templates' . DS . 'skel' ;
2006-05-26 05:29:17 +00:00
} else {
while ( $skel == '' ) {
2006-10-09 20:27:28 +00:00
$skel = $this -> getInput ( " What is the full path for the cake install app directory? \n Example: " , null , ROOT . 'myapp' . DS );
2006-05-26 05:29:17 +00:00
if ( $skel == '' ) {
$this -> stdout ( 'The directory path you supplied was empty. Please try again.' );
} else {
while ( $this -> __checkPath ( $skel ) === false ) {
$skel = $this -> getInput ( 'Directory path does not exist please choose another:' );
}
}
}
}
$this -> stdout ( '' );
$this -> hr ();
$this -> stdout ( " Skel Directory: $skel " );
$this -> stdout ( " Will be copied to: " );
2006-09-15 20:19:03 +00:00
$this -> stdout ( " New App Directory: $projectPath " );
2006-05-26 05:29:17 +00:00
$this -> hr ();
$looksGood = $this -> getInput ( 'Look okay?' , array ( 'y' , 'n' , 'q' ), 'y' );
if ( strtolower ( $looksGood ) == 'y' || strtolower ( $looksGood ) == 'yes' ) {
$verboseOuptut = $this -> getInput ( 'Do you want verbose output?' , array ( 'y' , 'n' ), 'n' );
$verbose = false ;
if ( strtolower ( $verboseOuptut ) == 'y' || strtolower ( $verboseOuptut ) == 'yes' ) {
$verbose = true ;
}
$this -> copydirr ( $skel , $projectPath , 0755 , $verbose );
$this -> hr ();
$this -> stdout ( 'Created: ' . $projectPath );
$this -> hr ();
$this -> stdout ( 'Creating welcome page' );
$this -> hr ();
$this -> __defaultHome ( $projectPath , $appName );
$this -> stdout ( 'Welcome page created' );
if ( chmodr ( $projectPath . DS . 'tmp' , 0777 ) === false ) {
$this -> stdout ( 'Could not set permissions on ' . $projectPath . DS . 'tmp' . DS . '*' );
$this -> stdout ( 'You must manually check that these directories can be wrote to by the server' );
}
return ;
} elseif ( strtolower ( $looksGood ) == 'q' || strtolower ( $looksGood ) == 'quit' ) {
$this -> stdout ( 'Bake Aborted.' );
} else {
2006-10-10 22:05:41 +00:00
$this -> project ();
2006-05-26 05:29:17 +00:00
}
}
/**
2006-07-18 11:11:44 +00:00
* Recursive directory copy .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $fromDir
* @ param string $toDir
* @ param octal $chmod
* @ param boolean $verbose
* @ return Success .
2006-05-26 05:29:17 +00:00
*/
function copydirr ( $fromDir , $toDir , $chmod = 0755 , $verbose = false ) {
$errors = array ();
$messages = array ();
if ( ! is_dir ( $toDir )) {
2006-06-14 18:02:37 +00:00
uses ( 'folder' );
$folder = new Folder ();
$folder -> mkdirr ( $toDir , 0755 );
2006-05-26 05:29:17 +00:00
}
if ( ! is_writable ( $toDir )) {
$errors [] = 'target ' . $toDir . ' is not writable' ;
}
if ( ! is_dir ( $fromDir )) {
$errors [] = 'source ' . $fromDir . ' is not a directory' ;
}
if ( ! empty ( $errors )) {
if ( $verbose ) {
foreach ( $errors as $err ) {
$this -> stdout ( 'Error: ' . $err );
}
}
return false ;
}
2006-06-19 15:00:17 +00:00
$exceptions = array ( '.' , '..' , '.svn' );
2006-05-26 05:29:17 +00:00
$handle = opendir ( $fromDir );
while ( false !== ( $item = readdir ( $handle ))) {
if ( ! in_array ( $item , $exceptions )) {
$from = str_replace ( '//' , '/' , $fromDir . '/' . $item );
$to = str_replace ( '//' , '/' , $toDir . '/' . $item );
if ( is_file ( $from )) {
if ( @ copy ( $from , $to )) {
chmod ( $to , $chmod );
touch ( $to , filemtime ( $from ));
$messages [] = 'File copied from ' . $from . ' to ' . $to ;
} else {
$errors [] = 'cannot copy file from ' . $from . ' to ' . $to ;
}
}
if ( is_dir ( $from )) {
if ( @ mkdir ( $to )) {
chmod ( $to , $chmod );
$messages [] = 'Directory created: ' . $to ;
} else {
$errors [] = 'cannot create directory ' . $to ;
}
$this -> copydirr ( $from , $to , $chmod , $verbose );
}
}
}
closedir ( $handle );
if ( $verbose ) {
foreach ( $errors as $err ) {
$this -> stdout ( 'Error: ' . $err );
}
foreach ( $messages as $msg ) {
$this -> stdout ( $msg );
}
}
return true ;
}
2006-10-14 18:07:52 +00:00
function __addAdminRoute ( $name ){
$file = file_get_contents ( CONFIGS . 'core.php' );
if ( preg_match ( '%([/\\t\\x20]*define\\(\'CAKE_ADMIN\',[\\t\\x20\'a-z]*\\);)%' , $file , $match )) {
$result = str_replace ( $match [ 0 ], 'define(\'CAKE_ADMIN\', \'' . $name . '\');' , $file );
if ( file_put_contents ( CONFIGS . 'core.php' , $result )){
return true ;
} else {
return false ;
}
} else {
return false ;
2006-10-14 18:45:00 +00:00
}
2006-10-14 18:07:52 +00:00
}
2006-05-26 05:29:17 +00:00
/**
2006-07-18 11:11:44 +00:00
* Outputs an ASCII art banner to standard output .
2006-05-26 05:29:17 +00:00
*
*/
2006-06-14 18:02:37 +00:00
function welcome ()
{
2006-05-26 05:29:17 +00:00
$this -> stdout ( '' );
2006-06-14 18:02:37 +00:00
$this -> stdout ( ' ___ __ _ _ ___ __ _ _ __ __ __ _ _ ___ ' );
$this -> stdout ( '| |__| |_/ |__ |__] |__| |__] |__] |__| |_/ |__ ' );
$this -> stdout ( '|___ | | | \_ |___ | | | | |__] | | | \_ |___ ' );
2006-05-26 05:29:17 +00:00
$this -> hr ();
$this -> stdout ( '' );
}
/**
2006-07-18 11:11:44 +00:00
* Writes a file with a default home page to the project .
2006-05-26 05:29:17 +00:00
*
2006-07-18 11:11:44 +00:00
* @ param string $dir
* @ param string $app
2006-05-26 05:29:17 +00:00
*/
function __defaultHome ( $dir , $app ) {
$path = $dir . DS . 'views' . DS . 'pages' . DS ;
2006-10-09 20:27:28 +00:00
include ( CAKE_CORE_INCLUDE_PATH . DS . 'cake' . DS . 'scripts' . DS . 'templates' . DS . 'views' . DS . 'home.thtml' );
2006-05-26 05:29:17 +00:00
$this -> createFile ( $path . 'home.thtml' , $output );
}
2006-10-09 20:27:28 +00:00
/**
2006-10-10 18:24:25 +00:00
* creates the proper pluralize controller for the url
2006-10-09 20:27:28 +00:00
*
* @ param string $name
* @ return string $name
2006-10-14 18:07:52 +00:00
*/
2006-10-10 18:24:25 +00:00
function __controllerPath ( $name ) {
2006-10-09 20:27:28 +00:00
return low ( Inflector :: tableize ( $name ));
}
/**
* creates the proper pluralize controller class name .
*
* @ param string $name
* @ return string $name
*/
function __controllerName ( $name ) {
return Inflector :: pluralize ( Inflector :: camelize ( $name ));
}
/**
* creates the proper singular model name .
*
* @ param string $name
* @ return string $name
2006-10-14 18:07:52 +00:00
*/
2006-10-09 20:27:28 +00:00
function __modelName ( $name ) {
return Inflector :: camelize ( Inflector :: singularize ( $name ));
}
/**
* creates the proper singular model key for associations .
*
* @ param string $name
* @ return string $name
2006-10-14 18:07:52 +00:00
*/
2006-10-09 20:27:28 +00:00
function __modelKey ( $name ) {
return Inflector :: underscore ( Inflector :: singularize ( $name )) . '_id' ;
}
/**
* creates the proper model name from a foreign key .
*
* @ param string $key
* @ return string $name
2006-10-14 18:07:52 +00:00
*/
2006-10-09 20:27:28 +00:00
function __modelNameFromKey ( $key ) {
$name = str_replace ( '_id' , '' , $key );
return $this -> __modelName ( $name );
}
/**
* creates the singular name for use in views .
*
* @ param string $name
* @ return string $name
2006-10-14 18:07:52 +00:00
*/
2006-10-09 20:27:28 +00:00
function __singularName ( $name ) {
return low ( Inflector :: underscore ( Inflector :: singularize ( $name )));
}
/**
* creates the plural name for views .
*
* @ param string $name
* @ return string $name
*/
function __pluralName ( $name ) {
return low ( Inflector :: underscore ( Inflector :: pluralize ( $name )));
}
/**
* creates the singular human name used in views
*
* @ param string $name
* @ return string $name
*/
function __singularHumanName ( $name ) {
return Inflector :: humanize ( Inflector :: underscore ( Inflector :: singularize ( $name )));
}
/**
* creates the plural humna name used in views
*
* @ param string $name
* @ return string $name
*/
function __pluralHumanName ( $name ) {
return Inflector :: humanize ( Inflector :: underscore ( Inflector :: pluralize ( $name )));
}
2006-10-14 18:07:52 +00:00
2006-05-09 02:15:47 +00:00
}
2006-09-15 20:19:03 +00:00
?>