Mercurial > hg > Members > shoshi > webvirt
comparison cake/console/libs/tasks/template.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 * Template Task can generate templated output Used in other Tasks | |
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.console.libs.tasks | |
17 * @since CakePHP(tm) v 1.3 | |
18 * @license MIT License (http://www.opensource.org/licenses/mit-license.php) | |
19 */ | |
20 class TemplateTask extends Shell { | |
21 | |
22 /** | |
23 * variables to add to template scope | |
24 * | |
25 * @var array | |
26 */ | |
27 var $templateVars = array(); | |
28 | |
29 /** | |
30 * Paths to look for templates on. | |
31 * Contains a list of $theme => $path | |
32 * | |
33 * @var array | |
34 */ | |
35 var $templatePaths = array(); | |
36 | |
37 /** | |
38 * Initialize callback. Setup paths for the template task. | |
39 * | |
40 * @access public | |
41 * @return void | |
42 */ | |
43 function initialize() { | |
44 $this->templatePaths = $this->_findThemes(); | |
45 } | |
46 | |
47 /** | |
48 * Find the paths to all the installed shell themes in the app. | |
49 * | |
50 * Bake themes are directories not named `skel` inside a `vendors/shells/templates` path. | |
51 * | |
52 * @return array Array of bake themes that are installed. | |
53 */ | |
54 function _findThemes() { | |
55 $paths = App::path('shells'); | |
56 $core = array_pop($paths); | |
57 $separator = DS === '/' ? '/' : '\\\\'; | |
58 $core = preg_replace('#libs' . $separator . '$#', '', $core); | |
59 | |
60 $Folder =& new Folder($core . 'templates' . DS . 'default'); | |
61 $contents = $Folder->read(); | |
62 $themeFolders = $contents[0]; | |
63 | |
64 $plugins = App::objects('plugin'); | |
65 foreach ($plugins as $plugin) { | |
66 $paths[] = $this->_pluginPath($plugin) . 'vendors' . DS . 'shells' . DS; | |
67 } | |
68 $paths[] = $core; | |
69 | |
70 // TEMPORARY TODO remove when all paths are DS terminated | |
71 foreach ($paths as $i => $path) { | |
72 $paths[$i] = rtrim($path, DS) . DS; | |
73 } | |
74 | |
75 $themes = array(); | |
76 foreach ($paths as $path) { | |
77 $Folder =& new Folder($path . 'templates', false); | |
78 $contents = $Folder->read(); | |
79 $subDirs = $contents[0]; | |
80 foreach ($subDirs as $dir) { | |
81 if (empty($dir) || preg_match('@^skel$|_skel$@', $dir)) { | |
82 continue; | |
83 } | |
84 $Folder =& new Folder($path . 'templates' . DS . $dir); | |
85 $contents = $Folder->read(); | |
86 $subDirs = $contents[0]; | |
87 if (array_intersect($contents[0], $themeFolders)) { | |
88 $templateDir = $path . 'templates' . DS . $dir . DS; | |
89 $themes[$dir] = $templateDir; | |
90 } | |
91 } | |
92 } | |
93 return $themes; | |
94 } | |
95 | |
96 /** | |
97 * Set variable values to the template scope | |
98 * | |
99 * @param mixed $one A string or an array of data. | |
100 * @param mixed $two Value in case $one is a string (which then works as the key). | |
101 * Unused if $one is an associative array, otherwise serves as the values to $one's keys. | |
102 * @return void | |
103 */ | |
104 function set($one, $two = null) { | |
105 $data = null; | |
106 if (is_array($one)) { | |
107 if (is_array($two)) { | |
108 $data = array_combine($one, $two); | |
109 } else { | |
110 $data = $one; | |
111 } | |
112 } else { | |
113 $data = array($one => $two); | |
114 } | |
115 | |
116 if ($data == null) { | |
117 return false; | |
118 } | |
119 $this->templateVars = $data + $this->templateVars; | |
120 } | |
121 | |
122 /** | |
123 * Runs the template | |
124 * | |
125 * @param string $directory directory / type of thing you want | |
126 * @param string $filename template name | |
127 * @param string $vars Additional vars to set to template scope. | |
128 * @access public | |
129 * @return contents of generated code template | |
130 */ | |
131 function generate($directory, $filename, $vars = null) { | |
132 if ($vars !== null) { | |
133 $this->set($vars); | |
134 } | |
135 if (empty($this->templatePaths)) { | |
136 $this->initialize(); | |
137 } | |
138 $themePath = $this->getThemePath(); | |
139 $templateFile = $this->_findTemplate($themePath, $directory, $filename); | |
140 if ($templateFile) { | |
141 extract($this->templateVars); | |
142 ob_start(); | |
143 ob_implicit_flush(0); | |
144 include($templateFile); | |
145 $content = ob_get_clean(); | |
146 return $content; | |
147 } | |
148 return ''; | |
149 } | |
150 | |
151 /** | |
152 * Find the theme name for the current operation. | |
153 * If there is only one theme in $templatePaths it will be used. | |
154 * If there is a -theme param in the cli args, it will be used. | |
155 * If there is more than one installed theme user interaction will happen | |
156 * | |
157 * @return string returns the path to the selected theme. | |
158 */ | |
159 function getThemePath() { | |
160 if (count($this->templatePaths) == 1) { | |
161 $paths = array_values($this->templatePaths); | |
162 return $paths[0]; | |
163 } | |
164 if (!empty($this->params['theme']) && isset($this->templatePaths[$this->params['theme']])) { | |
165 return $this->templatePaths[$this->params['theme']]; | |
166 } | |
167 | |
168 $this->hr(); | |
169 $this->out(__('You have more than one set of templates installed.', true)); | |
170 $this->out(__('Please choose the template set you wish to use:', true)); | |
171 $this->hr(); | |
172 | |
173 $i = 1; | |
174 $indexedPaths = array(); | |
175 foreach ($this->templatePaths as $key => $path) { | |
176 $this->out($i . '. ' . $key); | |
177 $indexedPaths[$i] = $path; | |
178 $i++; | |
179 } | |
180 $index = $this->in(__('Which bake theme would you like to use?', true), range(1, $i - 1), 1); | |
181 $themeNames = array_keys($this->templatePaths); | |
182 $this->Dispatch->params['theme'] = $themeNames[$index - 1]; | |
183 return $indexedPaths[$index]; | |
184 } | |
185 | |
186 /** | |
187 * Find a template inside a directory inside a path. | |
188 * Will scan all other theme dirs if the template is not found in the first directory. | |
189 * | |
190 * @param string $path The initial path to look for the file on. If it is not found fallbacks will be used. | |
191 * @param string $directory Subdirectory to look for ie. 'views', 'objects' | |
192 * @param string $filename lower_case_underscored filename you want. | |
193 * @access public | |
194 * @return string filename will exit program if template is not found. | |
195 */ | |
196 function _findTemplate($path, $directory, $filename) { | |
197 $themeFile = $path . $directory . DS . $filename . '.ctp'; | |
198 if (file_exists($themeFile)) { | |
199 return $themeFile; | |
200 } | |
201 foreach ($this->templatePaths as $path) { | |
202 $templatePath = $path . $directory . DS . $filename . '.ctp'; | |
203 if (file_exists($templatePath)) { | |
204 return $templatePath; | |
205 } | |
206 } | |
207 $this->err(sprintf(__('Could not find template for %s', true), $filename)); | |
208 return false; | |
209 } | |
210 } |