2008-05-30 11:40:08 +00:00
< ? php
/**
* The View Tasks handles creating and updating view files .
*
2010-10-03 16:38:58 +00:00
* PHP 5
2008-05-30 11:40:08 +00:00
*
2009-11-06 06:46:59 +00:00
* CakePHP ( tm ) : Rapid Development Framework ( http :// cakephp . org )
2010-01-26 19:18:20 +00:00
* Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
*
2010-01-26 19:18:20 +00:00
* @ copyright Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2009-11-06 06:00:11 +00:00
* @ link http :// cakephp . org CakePHP ( tm ) Project
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . cake . console . libs . tasks
* @ since CakePHP ( tm ) v 1.2
2009-11-06 06:51:51 +00:00
* @ license MIT License ( http :// www . opensource . org / licenses / mit - license . php )
2008-05-30 11:40:08 +00:00
*/
2009-07-30 22:01:22 +00:00
App :: import ( 'Controller' , 'Controller' , false );
2010-03-05 01:52:25 +00:00
include_once dirname ( __FILE__ ) . DS . 'bake.php' ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Task class for creating and updating view files .
*
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . cake . console . libs . tasks
2008-05-30 11:40:08 +00:00
*/
2010-03-05 01:52:25 +00:00
class ViewTask extends BakeTask {
2008-05-30 11:40:08 +00:00
/**
* Tasks to be loaded by this Task
*
* @ var array
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $tasks = array ( 'Project' , 'Controller' , 'DbConfig' , 'Template' );
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* path to VIEWS directory
*
* @ var array
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $path = VIEWS ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Name of the controller being used
*
* @ var string
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $controllerName = null ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Path to controller to put views
*
* @ var string
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $controllerPath = null ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* The template file to use
*
* @ var string
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $template = null ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Actions to use for scaffolding
*
* @ var array
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $scaffoldActions = array ( 'index' , 'view' , 'add' , 'edit' );
2009-07-24 19:18:37 +00:00
2010-02-13 22:51:49 +00:00
/**
* An array of action names that don ' t require templates . These
* actions will not emit errors when doing bakeActions ()
*
* @ var array
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $noTemplateActions = array ( 'delete' );
2010-02-13 22:51:49 +00:00
2008-05-30 11:40:08 +00:00
/**
* Override initialize
*
*/
2010-04-05 03:19:38 +00:00
public function initialize () {
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Execution method always used for tasks
*
*/
2010-04-05 03:19:38 +00:00
public function execute () {
2010-10-19 03:09:23 +00:00
parent :: execute ();
2008-05-30 11:40:08 +00:00
if ( empty ( $this -> args )) {
2010-04-24 01:57:59 +00:00
$this -> _interactive ();
2008-05-30 11:40:08 +00:00
}
2009-07-28 21:49:04 +00:00
if ( empty ( $this -> args [ 0 ])) {
return ;
}
if ( ! isset ( $this -> connection )) {
$this -> connection = 'default' ;
}
$controller = $action = $alias = null ;
2010-03-06 02:30:58 +00:00
$this -> controllerName = $this -> _controllerName ( $this -> args [ 0 ]);
$this -> controllerPath = $this -> _controllerPath ( $this -> controllerName );
2008-05-30 11:40:08 +00:00
2009-11-11 14:56:35 +00:00
$this -> Project -> interactive = false ;
2009-07-28 21:49:04 +00:00
if ( strtolower ( $this -> args [ 0 ]) == 'all' ) {
return $this -> all ();
}
2008-05-30 11:40:08 +00:00
2009-07-28 21:49:04 +00:00
if ( isset ( $this -> args [ 1 ])) {
$this -> template = $this -> args [ 1 ];
}
if ( isset ( $this -> args [ 2 ])) {
$action = $this -> args [ 2 ];
}
if ( ! $action ) {
$action = $this -> template ;
}
if ( $action ) {
return $this -> bake ( $action , true );
}
2009-06-04 03:18:14 +00:00
2009-07-28 21:49:04 +00:00
$vars = $this -> __loadController ();
$methods = $this -> _methodsToBake ();
2008-05-30 11:40:08 +00:00
2009-07-28 21:49:04 +00:00
foreach ( $methods as $method ) {
$content = $this -> getContent ( $method , $vars );
if ( $content ) {
$this -> bake ( $method , $content );
2008-05-30 11:40:08 +00:00
}
}
}
2009-07-24 19:18:37 +00:00
2009-07-17 03:12:47 +00:00
/**
* Get a list of actions that can / should have views baked for them .
*
* @ return array Array of action names that should be baked
2009-11-14 12:19:25 +00:00
*/
2010-04-24 01:57:59 +00:00
protected function _methodsToBake () {
2009-07-17 03:12:47 +00:00
$methods = array_diff (
array_map ( 'strtolower' , get_class_methods ( $this -> controllerName . 'Controller' )),
array_map ( 'strtolower' , get_class_methods ( 'appcontroller' ))
);
2009-07-28 21:49:04 +00:00
$scaffoldActions = false ;
2009-07-17 03:12:47 +00:00
if ( empty ( $methods )) {
2009-07-28 21:49:04 +00:00
$scaffoldActions = true ;
2009-07-17 03:12:47 +00:00
$methods = $this -> scaffoldActions ;
}
2009-10-07 05:35:29 +00:00
$adminRoute = $this -> Project -> getPrefix ();
2009-07-17 03:12:47 +00:00
foreach ( $methods as $i => $method ) {
2009-07-28 21:49:04 +00:00
if ( $adminRoute && isset ( $this -> params [ 'admin' ])) {
if ( $scaffoldActions ) {
2009-10-07 05:35:29 +00:00
$methods [ $i ] = $adminRoute . $method ;
2009-07-28 21:49:04 +00:00
continue ;
2009-10-07 05:35:29 +00:00
} elseif ( strpos ( $method , $adminRoute ) === false ) {
2009-07-28 21:49:04 +00:00
unset ( $methods [ $i ]);
}
2009-07-17 03:12:47 +00:00
}
2009-08-02 22:17:31 +00:00
if ( $method [ 0 ] === '_' || $method == strtolower ( $this -> controllerName . 'Controller' )) {
2009-07-17 03:12:47 +00:00
unset ( $methods [ $i ]);
}
}
return $methods ;
}
2009-07-24 19:18:37 +00:00
2009-04-28 03:55:34 +00:00
/**
* Bake All views for All controllers .
*
* @ return void
2009-11-14 12:19:25 +00:00
*/
2010-04-24 01:57:59 +00:00
public function all () {
2009-06-05 03:42:06 +00:00
$this -> Controller -> interactive = false ;
2009-06-04 03:18:14 +00:00
$tables = $this -> Controller -> listAll ( $this -> connection , false );
2009-07-29 10:48:31 +00:00
2010-02-10 02:13:20 +00:00
$actions = null ;
if ( isset ( $this -> args [ 1 ])) {
$actions = array ( $this -> args [ 1 ]);
}
2009-04-28 03:58:36 +00:00
$this -> interactive = false ;
2009-04-28 03:55:34 +00:00
foreach ( $tables as $table ) {
$model = $this -> _modelName ( $table );
$this -> controllerName = $this -> _controllerName ( $model );
$this -> controllerPath = Inflector :: underscore ( $this -> controllerName );
if ( App :: import ( 'Model' , $model )) {
$vars = $this -> __loadController ();
2010-02-10 02:13:20 +00:00
if ( ! $actions ) {
$actions = $this -> _methodsToBake ();
}
2009-06-05 03:42:06 +00:00
$this -> bakeActions ( $actions , $vars );
2010-05-02 23:28:18 +00:00
$actions = null ;
2009-04-28 03:55:34 +00:00
}
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Handles interactive baking
*
*/
2010-04-24 01:57:59 +00:00
protected function _interactive () {
2008-05-30 11:40:08 +00:00
$this -> hr ();
$this -> out ( sprintf ( " Bake View \n Path: %s " , $this -> path ));
$this -> hr ();
2009-06-04 01:59:46 +00:00
2010-03-09 02:18:53 +00:00
$this -> DbConfig -> interactive = $this -> Controller -> interactive = $this -> interactive = true ;
2009-06-04 03:18:14 +00:00
if ( empty ( $this -> connection )) {
$this -> connection = $this -> DbConfig -> getConfig ();
}
$this -> Controller -> connection = $this -> connection ;
2008-05-30 11:40:08 +00:00
$this -> controllerName = $this -> Controller -> getName ();
2009-05-30 04:34:45 +00:00
$this -> controllerPath = strtolower ( Inflector :: underscore ( $this -> controllerName ));
2008-05-30 11:40:08 +00:00
2010-04-15 15:43:39 +00:00
$prompt = sprintf ( __ ( " Would you like bake to build your views interactively? \n Warning: Choosing no will overwrite %s views if it exist. " ), $this -> controllerName );
2009-06-04 03:18:14 +00:00
$interactive = $this -> in ( $prompt , array ( 'y' , 'n' ), 'n' );
2008-05-30 11:40:08 +00:00
2009-06-04 03:18:14 +00:00
if ( strtolower ( $interactive ) == 'n' ) {
$this -> interactive = false ;
2008-05-30 11:40:08 +00:00
}
2010-04-15 15:43:39 +00:00
$prompt = __ ( " Would you like to create some CRUD views \n (index, add, view, edit) for this controller? \n NOTE: Before doing so, you'll need to create your controller \n and model classes (including associated models). " );
2009-06-05 03:35:36 +00:00
$wannaDoScaffold = $this -> in ( $prompt , array ( 'y' , 'n' ), 'y' );
2009-06-04 03:18:14 +00:00
2010-04-15 15:43:39 +00:00
$wannaDoAdmin = $this -> in ( __ ( " Would you like to create the views for admin routing? " ), array ( 'y' , 'n' ), 'n' );
2008-05-30 11:40:08 +00:00
2009-06-05 03:35:36 +00:00
if ( strtolower ( $wannaDoScaffold ) == 'y' || strtolower ( $wannaDoAdmin ) == 'y' ) {
2008-05-30 11:40:08 +00:00
$vars = $this -> __loadController ();
2009-06-05 03:35:36 +00:00
if ( strtolower ( $wannaDoScaffold ) == 'y' ) {
$actions = $this -> scaffoldActions ;
2009-06-04 02:03:57 +00:00
$this -> bakeActions ( $actions , $vars );
2008-05-30 11:40:08 +00:00
}
2009-06-05 03:35:36 +00:00
if ( strtolower ( $wannaDoAdmin ) == 'y' ) {
2009-10-07 04:46:13 +00:00
$admin = $this -> Project -> getPrefix ();
2009-06-05 03:35:36 +00:00
$regularActions = $this -> scaffoldActions ;
$adminActions = array ();
foreach ( $regularActions as $action ) {
$adminActions [] = $admin . $action ;
}
$this -> bakeActions ( $adminActions , $vars );
}
2008-05-30 11:40:08 +00:00
$this -> hr ();
2009-09-26 21:08:37 +00:00
$this -> out ();
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( " View Scaffolding Complete. \n " ));
2008-05-30 11:40:08 +00:00
} else {
2009-06-04 03:18:14 +00:00
$this -> customAction ();
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Loads Controller and sets variables for the template
* Available template variables
* 'modelClass' , 'primaryKey' , 'displayField' , 'singularVar' , 'pluralVar' ,
* 'singularHumanName' , 'pluralHumanName' , 'fields' , 'foreignKeys' ,
* 'belongsTo' , 'hasOne' , 'hasMany' , 'hasAndBelongsToMany'
*
* @ return array Returns an variables to be made available to a view template
* @ access private
*/
2010-04-24 01:57:59 +00:00
private function __loadController () {
2008-05-30 11:40:08 +00:00
if ( ! $this -> controllerName ) {
2010-04-15 15:43:39 +00:00
$this -> err ( __ ( 'Controller not found' ));
2008-05-30 11:40:08 +00:00
}
$import = $this -> controllerName ;
if ( $this -> plugin ) {
$import = $this -> plugin . '.' . $this -> controllerName ;
}
if ( ! App :: import ( 'Controller' , $import )) {
$file = $this -> controllerPath . '_controller.php' ;
2010-04-15 15:43:39 +00:00
$this -> err ( sprintf ( __ ( " The file '%s' could not be found. \n In order to bake a view, you'll need to first create the controller. " ), $file ));
2008-06-04 19:04:58 +00:00
$this -> _stop ();
2008-05-30 11:40:08 +00:00
}
$controllerClassName = $this -> controllerName . 'Controller' ;
2010-11-13 04:05:44 +00:00
$controllerObj = new $controllerClassName ();
2010-02-28 01:28:04 +00:00
$controllerObj -> plugin = $this -> plugin ;
2008-05-30 11:40:08 +00:00
$controllerObj -> constructClasses ();
$modelClass = $controllerObj -> modelClass ;
2010-11-13 04:05:44 +00:00
$modelObj = $controllerObj -> { $controllerObj -> modelClass };
2008-05-30 11:40:08 +00:00
if ( $modelObj ) {
$primaryKey = $modelObj -> primaryKey ;
$displayField = $modelObj -> displayField ;
$singularVar = Inflector :: variable ( $modelClass );
2010-05-07 01:38:14 +00:00
$singularHumanName = $this -> _singularHumanName ( $this -> controllerName );
2009-12-30 03:23:52 +00:00
$schema = $modelObj -> schema ( true );
2008-05-30 11:40:08 +00:00
$fields = array_keys ( $schema );
$associations = $this -> __associations ( $modelObj );
} else {
2010-02-28 01:28:04 +00:00
$primaryKey = $displayField = null ;
2008-05-30 11:40:08 +00:00
$singularVar = Inflector :: variable ( Inflector :: singularize ( $this -> controllerName ));
2009-08-18 08:29:54 +00:00
$singularHumanName = $this -> _singularHumanName ( $this -> controllerName );
2010-02-28 01:28:04 +00:00
$fields = $schema = $associations = array ();
2008-05-30 11:40:08 +00:00
}
2009-08-18 08:29:54 +00:00
$pluralVar = Inflector :: variable ( $this -> controllerName );
$pluralHumanName = $this -> _pluralHumanName ( $this -> controllerName );
2008-05-30 11:40:08 +00:00
return compact ( 'modelClass' , 'schema' , 'primaryKey' , 'displayField' , 'singularVar' , 'pluralVar' ,
'singularHumanName' , 'pluralHumanName' , 'fields' , 'associations' );
}
2009-07-24 19:18:37 +00:00
2009-06-04 01:59:46 +00:00
/**
* Bake a view file for each of the supplied actions
*
* @ param array $actions Array of actions to make files for .
* @ return void
2009-11-14 12:19:25 +00:00
*/
2010-04-24 01:57:59 +00:00
public function bakeActions ( $actions , $vars ) {
2009-06-04 01:59:46 +00:00
foreach ( $actions as $action ) {
$content = $this -> getContent ( $action , $vars );
$this -> bake ( $action , $content );
}
}
2009-07-24 19:18:37 +00:00
2009-06-04 03:18:14 +00:00
/**
* handle creation of baking a custom action view file
*
* @ return void
2009-11-14 12:19:25 +00:00
*/
2010-04-24 01:57:59 +00:00
public function customAction () {
2009-06-04 03:18:14 +00:00
$action = '' ;
while ( $action == '' ) {
2010-04-15 15:43:39 +00:00
$action = $this -> in ( __ ( 'Action Name? (use lowercase_underscored function name)' ));
2009-06-04 03:18:14 +00:00
if ( $action == '' ) {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'The action name you supplied was empty. Please try again.' ));
2009-06-04 03:18:14 +00:00
}
}
2009-09-26 21:08:37 +00:00
$this -> out ();
2009-06-04 03:18:14 +00:00
$this -> hr ();
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'The following view will be created:' ));
2009-06-04 03:18:14 +00:00
$this -> hr ();
2010-04-15 15:43:39 +00:00
$this -> out ( sprintf ( __ ( 'Controller Name: %s' ), $this -> controllerName ));
$this -> out ( sprintf ( __ ( 'Action Name: %s' ), $action ));
$this -> out ( sprintf ( __ ( 'Path: %s' ), $this -> params [ 'app' ] . DS . $this -> controllerPath . DS . Inflector :: underscore ( $action ) . " .ctp " ));
2009-06-04 03:18:14 +00:00
$this -> hr ();
2010-04-15 15:43:39 +00:00
$looksGood = $this -> in ( __ ( 'Look okay?' ), array ( 'y' , 'n' ), 'y' );
2009-06-04 03:18:14 +00:00
if ( strtolower ( $looksGood ) == 'y' ) {
2010-09-21 03:42:35 +00:00
$this -> bake ( $action , ' ' );
2009-06-04 03:18:14 +00:00
$this -> _stop ();
} else {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Bake Aborted.' ));
2009-06-04 03:18:14 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Assembles and writes bakes the view file .
*
* @ param string $action Action to bake
* @ param string $content Content to write
* @ return boolean Success
*/
2010-04-05 03:19:38 +00:00
public function bake ( $action , $content = '' ) {
2008-05-30 11:40:08 +00:00
if ( $content === true ) {
2009-06-05 03:35:36 +00:00
$content = $this -> getContent ( $action );
2008-05-30 11:40:08 +00:00
}
2010-08-24 01:49:30 +00:00
if ( empty ( $content )) {
return false ;
}
2010-11-21 17:47:49 +00:00
$this -> out ( " \n Baking ` $action ` view file... " , 1 , Shell :: QUIET );
2010-03-05 01:52:25 +00:00
$path = $this -> getPath ();
2009-06-07 01:18:34 +00:00
$filename = $path . $this -> controllerPath . DS . Inflector :: underscore ( $action ) . '.ctp' ;
return $this -> createFile ( $filename , $content );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Builds content from template and variables
*
2009-09-23 15:16:18 +00:00
* @ param string $action name to generate content to
2008-05-30 11:40:08 +00:00
* @ param array $vars passed for use in templates
* @ return string content from template
*/
2010-04-05 03:19:38 +00:00
public function getContent ( $action , $vars = null ) {
2008-05-30 11:40:08 +00:00
if ( ! $vars ) {
$vars = $this -> __loadController ();
}
2009-05-30 04:32:57 +00:00
2009-06-04 02:03:57 +00:00
$this -> Template -> set ( 'action' , $action );
$this -> Template -> set ( 'plugin' , $this -> plugin );
2009-05-30 04:32:57 +00:00
$this -> Template -> set ( $vars );
2010-02-13 22:51:49 +00:00
$template = $this -> getTemplate ( $action );
if ( $template ) {
return $this -> Template -> generate ( 'views' , $template );
2008-05-30 11:40:08 +00:00
}
return false ;
}
2009-09-23 17:27:47 +00:00
2009-09-23 15:16:18 +00:00
/**
* Gets the template name based on the action name
*
* @ param string $action name
* @ return string template name
*/
2010-04-05 03:19:38 +00:00
public function getTemplate ( $action ) {
2010-02-13 22:51:49 +00:00
if ( $action != $this -> template && in_array ( $action , $this -> noTemplateActions )) {
return false ;
}
2009-09-23 15:16:18 +00:00
if ( ! empty ( $this -> template ) && $action != $this -> template ) {
return $this -> template ;
}
$template = $action ;
2009-10-07 05:35:29 +00:00
$prefixes = Configure :: read ( 'Routing.prefixes' );
foreach (( array ) $prefixes as $prefix ) {
if ( strpos ( $template , $prefix ) !== false ) {
$template = str_replace ( $prefix . '_' , '' , $template );
}
2009-09-23 15:16:18 +00:00
}
if ( in_array ( $template , array ( 'add' , 'edit' ))) {
$template = 'form' ;
} elseif ( preg_match ( '@(_add|_edit)$@' , $template )) {
$template = str_replace ( array ( '_add' , '_edit' ), '_form' , $template );
}
return $template ;
}
2009-07-24 19:18:37 +00:00
2010-10-13 02:36:51 +00:00
/**
* get the option parser for this task
*
* @ return ConsoleOptionParser
*/
public function getOptionParser () {
$parser = parent :: getOptionParser ();
return $parser -> description (
__ ( 'Bake views for a controller, using built-in or custom templates.' )
) -> addArgument ( 'controller' , array (
'help' => __ ( 'Name of the controller views to bake. Can be Plugin.name as a shortcut for plugin baking.' )
)) -> addArgument ( 'action' , array (
'help' => __ ( " Will bake a single action's file. core templates are (index, add, edit, view) " )
)) -> addArgument ( 'alias' , array (
'help' => __ ( 'Will bake the template in <action> but create the filename after <alias>.' )
)) -> addOption ( 'plugin' , array (
2010-10-13 03:06:07 +00:00
'short' => 'p' ,
2010-10-13 02:36:51 +00:00
'help' => __ ( 'Plugin to bake the view into.' )
)) -> addOption ( 'admin' , array (
'help' => __ ( 'Set to only bake views for a prefix in Routing.prefixes' ),
'boolean' => true
)) -> addOption ( 'connection' , array (
2010-10-13 03:06:07 +00:00
'short' => 'c' ,
2010-10-13 02:36:51 +00:00
'help' => __ ( 'The connection the connected model is on.' )
)) -> addSubcommand ( 'all' , array (
'help' => __ ( 'Bake all CRUD action views for all controllers. Requires models and controllers to exist.' )
)) -> epilog ( __ ( 'Omitting all arguments and options will enter into an interactive mode.' ));
}
2008-05-30 11:40:08 +00:00
/**
* Returns associations for controllers models .
*
* @ return array $associations
* @ access private
*/
2010-04-24 01:57:59 +00:00
private function __associations ( & $model ) {
2008-06-20 20:17:23 +00:00
$keys = array ( 'belongsTo' , 'hasOne' , 'hasMany' , 'hasAndBelongsToMany' );
$associations = array ();
2008-05-30 11:40:08 +00:00
2008-10-23 00:10:44 +00:00
foreach ( $keys as $key => $type ) {
2008-06-20 20:17:23 +00:00
foreach ( $model -> { $type } as $assocKey => $assocData ) {
$associations [ $type ][ $assocKey ][ 'primaryKey' ] = $model -> { $assocKey } -> primaryKey ;
$associations [ $type ][ $assocKey ][ 'displayField' ] = $model -> { $assocKey } -> displayField ;
$associations [ $type ][ $assocKey ][ 'foreignKey' ] = $assocData [ 'foreignKey' ];
$associations [ $type ][ $assocKey ][ 'controller' ] = Inflector :: pluralize ( Inflector :: underscore ( $assocData [ 'className' ]));
2009-12-30 03:23:52 +00:00
$associations [ $type ][ $assocKey ][ 'fields' ] = array_keys ( $model -> { $assocKey } -> schema ( true ));
2008-06-20 20:17:23 +00:00
}
}
return $associations ;
}
2008-05-30 11:40:08 +00:00
}