Mercurial > hg > Members > shoshi > webvirt
comparison cake/console/libs/tasks/plugin.php @ 0:261e66bd5a0c
hg init
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 24 Jul 2011 21:08:31 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:261e66bd5a0c |
---|---|
1 <?php | |
2 /** | |
3 * The Plugin Task handles creating an empty plugin, ready to be used | |
4 * | |
5 * PHP versions 4 and 5 | |
6 * | |
7 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) | |
8 * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
9 * | |
10 * Licensed under The MIT License | |
11 * Redistributions of files must retain the above copyright notice. | |
12 * | |
13 * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
14 * @link http://cakephp.org CakePHP(tm) Project | |
15 * @package cake | |
16 * @subpackage cake.cake.console.libs.tasks | |
17 * @since CakePHP(tm) v 1.2 | |
18 * @license MIT License (http://www.opensource.org/licenses/mit-license.php) | |
19 */ | |
20 | |
21 /** | |
22 * Task class for creating a plugin | |
23 * | |
24 * @package cake | |
25 * @subpackage cake.cake.console.libs.tasks | |
26 */ | |
27 class PluginTask extends Shell { | |
28 | |
29 /** | |
30 * Tasks | |
31 * | |
32 */ | |
33 var $tasks = array('Model', 'Controller', 'View'); | |
34 | |
35 /** | |
36 * path to CONTROLLERS directory | |
37 * | |
38 * @var array | |
39 * @access public | |
40 */ | |
41 var $path = null; | |
42 | |
43 /** | |
44 * initialize | |
45 * | |
46 * @return void | |
47 */ | |
48 function initialize() { | |
49 $this->path = APP . 'plugins' . DS; | |
50 } | |
51 | |
52 /** | |
53 * Execution method always used for tasks | |
54 * | |
55 * @return void | |
56 */ | |
57 function execute() { | |
58 if (empty($this->params['skel'])) { | |
59 $this->params['skel'] = ''; | |
60 if (is_dir(CAKE_CORE_INCLUDE_PATH . DS . CAKE . 'console' . DS . 'templates' . DS . 'skel') === true) { | |
61 $this->params['skel'] = CAKE_CORE_INCLUDE_PATH . DS . CAKE . 'console' . DS . 'templates' . DS . 'skel'; | |
62 } | |
63 } | |
64 $plugin = null; | |
65 | |
66 if (isset($this->args[0])) { | |
67 $plugin = Inflector::camelize($this->args[0]); | |
68 $pluginPath = $this->_pluginPath($plugin); | |
69 $this->Dispatch->shiftArgs(); | |
70 if (is_dir($pluginPath)) { | |
71 $this->out(sprintf(__('Plugin: %s', true), $plugin)); | |
72 $this->out(sprintf(__('Path: %s', true), $pluginPath)); | |
73 } elseif (isset($this->args[0])) { | |
74 $this->err(sprintf(__('%s in path %s not found.', true), $plugin, $pluginPath)); | |
75 $this->_stop(); | |
76 } else { | |
77 $this->__interactive($plugin); | |
78 } | |
79 } else { | |
80 return $this->__interactive(); | |
81 } | |
82 | |
83 if (isset($this->args[0])) { | |
84 $task = Inflector::classify($this->args[0]); | |
85 $this->Dispatch->shiftArgs(); | |
86 if (in_array($task, $this->tasks)) { | |
87 $this->{$task}->plugin = $plugin; | |
88 $this->{$task}->path = $pluginPath . Inflector::underscore(Inflector::pluralize($task)) . DS; | |
89 | |
90 if (!is_dir($this->{$task}->path)) { | |
91 $this->err(sprintf(__("%s directory could not be found.\nBe sure you have created %s", true), $task, $this->{$task}->path)); | |
92 } | |
93 $this->{$task}->loadTasks(); | |
94 return $this->{$task}->execute(); | |
95 } | |
96 } | |
97 } | |
98 | |
99 /** | |
100 * Interactive interface | |
101 * | |
102 * @access private | |
103 * @return void | |
104 */ | |
105 function __interactive($plugin = null) { | |
106 while ($plugin === null) { | |
107 $plugin = $this->in(__('Enter the name of the plugin in CamelCase format', true)); | |
108 } | |
109 | |
110 if (!$this->bake($plugin)) { | |
111 $this->err(sprintf(__("An error occured trying to bake: %s in %s", true), $plugin, $this->path . Inflector::underscore($pluginPath))); | |
112 } | |
113 } | |
114 | |
115 /** | |
116 * Bake the plugin, create directories and files | |
117 * | |
118 * @params $plugin name of the plugin in CamelCased format | |
119 * @access public | |
120 * @return bool | |
121 */ | |
122 function bake($plugin) { | |
123 $pluginPath = Inflector::underscore($plugin); | |
124 | |
125 $pathOptions = App::path('plugins'); | |
126 if (count($pathOptions) > 1) { | |
127 $this->findPath($pathOptions); | |
128 } | |
129 $this->hr(); | |
130 $this->out(sprintf(__("Plugin Name: %s", true), $plugin)); | |
131 $this->out(sprintf(__("Plugin Directory: %s", true), $this->path . $pluginPath)); | |
132 $this->hr(); | |
133 | |
134 $looksGood = $this->in(__('Look okay?', true), array('y', 'n', 'q'), 'y'); | |
135 | |
136 if (strtolower($looksGood) == 'y') { | |
137 $verbose = $this->in(__('Do you want verbose output?', true), array('y', 'n'), 'n'); | |
138 | |
139 $Folder =& new Folder($this->path . $pluginPath); | |
140 $directories = array( | |
141 'config' . DS . 'schema', | |
142 'models' . DS . 'behaviors', | |
143 'models' . DS . 'datasources', | |
144 'controllers' . DS . 'components', | |
145 'libs', | |
146 'views' . DS . 'helpers', | |
147 'tests' . DS . 'cases' . DS . 'components', | |
148 'tests' . DS . 'cases' . DS . 'helpers', | |
149 'tests' . DS . 'cases' . DS . 'behaviors', | |
150 'tests' . DS . 'cases' . DS . 'controllers', | |
151 'tests' . DS . 'cases' . DS . 'models', | |
152 'tests' . DS . 'groups', | |
153 'tests' . DS . 'fixtures', | |
154 'vendors', | |
155 'vendors' . DS . 'shells' . DS . 'tasks', | |
156 'webroot' | |
157 ); | |
158 | |
159 foreach ($directories as $directory) { | |
160 $dirPath = $this->path . $pluginPath . DS . $directory; | |
161 $Folder->create($dirPath); | |
162 $File =& new File($dirPath . DS . 'empty', true); | |
163 } | |
164 | |
165 if (strtolower($verbose) == 'y') { | |
166 foreach ($Folder->messages() as $message) { | |
167 $this->out($message); | |
168 } | |
169 } | |
170 | |
171 $errors = $Folder->errors(); | |
172 if (!empty($errors)) { | |
173 return false; | |
174 } | |
175 | |
176 $controllerFileName = $pluginPath . '_app_controller.php'; | |
177 | |
178 $out = "<?php\n\n"; | |
179 $out .= "class {$plugin}AppController extends AppController {\n\n"; | |
180 $out .= "}\n\n"; | |
181 $out .= "?>"; | |
182 $this->createFile($this->path . $pluginPath. DS . $controllerFileName, $out); | |
183 | |
184 $modelFileName = $pluginPath . '_app_model.php'; | |
185 | |
186 $out = "<?php\n\n"; | |
187 $out .= "class {$plugin}AppModel extends AppModel {\n\n"; | |
188 $out .= "}\n\n"; | |
189 $out .= "?>"; | |
190 $this->createFile($this->path . $pluginPath . DS . $modelFileName, $out); | |
191 | |
192 $this->hr(); | |
193 $this->out(sprintf(__("Created: %s in %s", true), $plugin, $this->path . $pluginPath)); | |
194 $this->hr(); | |
195 } | |
196 | |
197 return true; | |
198 } | |
199 | |
200 /** | |
201 * find and change $this->path to the user selection | |
202 * | |
203 * @return void | |
204 */ | |
205 function findPath($pathOptions) { | |
206 $valid = false; | |
207 $max = count($pathOptions); | |
208 while (!$valid) { | |
209 foreach ($pathOptions as $i => $option) { | |
210 $this->out($i + 1 .'. ' . $option); | |
211 } | |
212 $prompt = __('Choose a plugin path from the paths above.', true); | |
213 $choice = $this->in($prompt); | |
214 if (intval($choice) > 0 && intval($choice) <= $max) { | |
215 $valid = true; | |
216 } | |
217 } | |
218 $this->path = $pathOptions[$choice - 1]; | |
219 } | |
220 | |
221 /** | |
222 * Help | |
223 * | |
224 * @return void | |
225 * @access public | |
226 */ | |
227 function help() { | |
228 $this->hr(); | |
229 $this->out("Usage: cake bake plugin <arg1> <arg2>..."); | |
230 $this->hr(); | |
231 $this->out('Commands:'); | |
232 $this->out(); | |
233 $this->out("plugin <name>"); | |
234 $this->out("\tbakes plugin directory structure"); | |
235 $this->out(); | |
236 $this->out("plugin <name> model"); | |
237 $this->out("\tbakes model. Run 'cake bake model help' for more info."); | |
238 $this->out(); | |
239 $this->out("plugin <name> controller"); | |
240 $this->out("\tbakes controller. Run 'cake bake controller help' for more info."); | |
241 $this->out(); | |
242 $this->out("plugin <name> view"); | |
243 $this->out("\tbakes view. Run 'cake bake view help' for more info."); | |
244 $this->out(); | |
245 $this->_stop(); | |
246 } | |
247 } |