out('Code Completion Dump - customized for PHPDesigner'); $this->filename = APP . 'CodeCompletion.php'; # get classes $this->models(); $this->behaviors(); $this->controller(); $this->helpers(); $this->appFiles(); # write to file $this->_dump(); $this->out('...done'); } public function models() { $files = $this->_getFiles('Model'); $content = LF; $content .= '/*** model start ***/'.LF; $content .= 'class AppModel extends Model {'.LF; if (!empty($files)) { $content .= $this->_prepModels($files); } $content .= '}'.LF; $content .= '/*** model end ***/'.LF; $this->content .= $content; } public function behaviors() { $files = $this->_getFiles('Model/Behavior'); $content = LF; $content .= '/*** behavior start ***/'.LF; $content .= 'class AppModel extends Model {'.LF; if (!empty($files)) { $content .= $this->_prepBehaviors($files); } $content .= '}'.LF; $content .= '/*** behavior end ***/'.LF; $this->content .= $content; } /** * components + models */ public function controller() { $content = LF; $content .= '/*** component start ***/'.LF; $content .= 'class AppController extends Controller {'.LF; $files = $this->_getFiles('Controller/Component'); if (!empty($files)) { $content .= $this->_prepComponents($files); } $content .= LF.LF; $files = $this->_getFiles('Model'); if (!empty($files)) { $content .= $this->_prepModels($files); } $content .= '}'.LF; $content .= '/*** component end ***/'.LF; $this->content .= $content; } public function helpers() { $files = $this->_getFiles('View/Helper'); $content = LF; $content .= '/*** helper start ***/'.LF; $content .= 'class AppHelper extends Helper {'.LF; if (!empty($files)) { $content .= $this->_prepHelpers($files); } $content .= '}'.LF; $content .= '/*** helper end ***/'.LF; $this->content .= $content; } public function appFiles() { $files = $this->appFiles; $content = LF; $content .= '/*** plugin files start ***/'.LF; if (!empty($files)) { $content .= $this->_prepAppFiles($files); } $content .= '/*** plugin files end ***/'.LF; $this->content .= $content; } protected function _prepAppFiles($files) { $res = ''; foreach ($files as $name => $parent) { $res .= 'class ' . $name . ' extends '.$parent.' {}' . LF; } return $res; } protected function _prepModels($files) { $res = ''; foreach ($files as $name) { $res .= ' /** * '.$name.' * * @var '.$name.' */ public $'.$name.'; '.LF; } $res .= ' public function __construct() {'; foreach ($files as $name) { $res .= ' $this->'.$name.' = new '.$name.'();'; } $res .= LF.' }'.LF; return $res; } protected function _prepBehaviors($files) { $res = ''; foreach ($files as $name) { if (!($varName = $this->_varName($name, 'Behavior'))) { continue; } $res .= ' /** * '.$name.'Behavior * * @var '.$varName.' */ public $'.$varName.'; '.LF; } $res .= ' public function __construct() {'; foreach ($files as $name) { if (!($varName = $this->_varName($name, 'Behavior'))) { continue; } $res .= ' $this->'.$varName.' = new '.$name.'();'; } $res .= LF.' }'.LF; return $res; } /** * check on correctness to avoid duplicates */ protected function _varName($name, $type) { if (($pos = strrpos($name, $type)) === false) { return ''; //return $name; } return substr($name, 0, $pos); } protected function _prepComponents($files) { $res = ''; foreach ($files as $name) { if (!($varName = $this->_varName($name, 'Component'))) { continue; } $res .= ' /** * '.$name.' * * @var '.$varName.' */ public $'.$varName.'; '.LF; } $res .= ' public function __construct() {'; foreach ($files as $name) { if (!($varName = $this->_varName($name, 'Component'))) { continue; } $res .= ' $this->'.$varName.' = new '.$name.'();'; } $res .= LF.' }'.LF; return $res; } protected function _prepHelpers($files) { # new ones $res = ''; foreach ($files as $name) { if (!($varName = $this->_varName($name, 'Helper'))) { continue; } $res .= ' /** * '.$name.' * * @var '.$varName.' */ public $'.$varName.'; '.LF; } $res .= ' public function __construct() {'; foreach ($files as $name) { if (!($varName = $this->_varName($name, 'Helper'))) { continue; } $res .= ' $this->'.$varName.' = new '.$name.'();'; } $res .= LF.' }'.LF; return $res; } protected function _dump() { //$File = new File($this->filename, true); $content = 'content; //return $File->write($content); file_put_contents($this->filename, $content); } protected function _getFiles($type) { $files = App::objects($type, null, false); $corePath = App::core($type); $coreFiles = App::objects($type, $corePath, false); $files = array_merge($coreFiles, $files); //$paths = (array)App::path($type.'s'); //$libFiles = App::objects($type, $paths[0] . 'lib' . DS, false); $appIndex = array_search('AppModel', $files); if ($appIndex !== false) { unset($files[$appIndex]); } if (!isset($this->plugins)) { $this->plugins = App::objects('plugin'); } if (!empty($this->plugins)) { foreach ($this->plugins as $plugin) { $pluginType = $plugin.'.'.$type; $pluginFiles = App::objects($pluginType, null, false); if (!empty($pluginFiles)) { foreach ($pluginFiles as $file) { if (strpos($file, 'App'.$type) !== false) { //$this->appFiles[$file] = $plugin.'.'.$type; continue; } $files[] = $file; } } } } $files = array_unique($files); # no test/tmp files etc (helper.test.php or helper.OLD.php) foreach ($files as $key => $file) { if (strpos($file, '.') !== false || !preg_match('/^[\da-zA-Z_]+$/', $file)) { unset($files[$key]); } } return $files; } }