13 * to license@zend.com so we can send you a copy immediately. |
13 * to license@zend.com so we can send you a copy immediately. |
14 * |
14 * |
15 * @category Zend |
15 * @category Zend |
16 * @package Zend_Tool |
16 * @package Zend_Tool |
17 * @subpackage Framework |
17 * @subpackage Framework |
18 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) |
18 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) |
19 * @license http://framework.zend.com/license/new-bsd New BSD License |
19 * @license http://framework.zend.com/license/new-bsd New BSD License |
20 * @version $Id: DbTable.php 20851 2010-02-02 21:45:51Z ralph $ |
20 * @version $Id: DbTable.php 24593 2012-01-05 20:35:02Z matthew $ |
21 */ |
21 */ |
22 |
22 |
23 /** |
23 /** |
24 * @category Zend |
24 * @category Zend |
25 * @package Zend_Tool |
25 * @package Zend_Tool |
26 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) |
26 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) |
27 * @license http://framework.zend.com/license/new-bsd New BSD License |
27 * @license http://framework.zend.com/license/new-bsd New BSD License |
28 */ |
28 */ |
29 class Zend_Tool_Project_Provider_DbTable |
29 class Zend_Tool_Project_Provider_DbTable |
30 extends Zend_Tool_Project_Provider_Abstract |
30 extends Zend_Tool_Project_Provider_Abstract |
31 implements Zend_Tool_Framework_Provider_Pretendable |
31 implements Zend_Tool_Framework_Provider_Pretendable |
32 { |
32 { |
33 |
33 |
34 protected $_specialties = array('FromDatabase'); |
34 protected $_specialties = array('FromDatabase'); |
35 |
35 |
36 /** |
36 /** |
37 * @var Zend_Filter |
37 * @var Zend_Filter |
38 */ |
38 */ |
39 protected $_nameFilter = null; |
39 protected $_nameFilter = null; |
40 |
40 |
41 public static function createResource(Zend_Tool_Project_Profile $profile, $dbTableName, $actualTableName, $moduleName = null) |
41 public static function createResource(Zend_Tool_Project_Profile $profile, $dbTableName, $actualTableName, $moduleName = null) |
42 { |
42 { |
43 $profileSearchParams = array(); |
43 $profileSearchParams = array(); |
44 |
44 |
45 if ($moduleName != null && is_string($moduleName)) { |
45 if ($moduleName != null && is_string($moduleName)) { |
46 $profileSearchParams = array('modulesDirectory', 'moduleDirectory' => array('moduleName' => $moduleName)); |
46 $profileSearchParams = array('modulesDirectory', 'moduleDirectory' => array('moduleName' => $moduleName)); |
47 } |
47 } |
48 |
48 |
49 $profileSearchParams[] = 'modelsDirectory'; |
49 $profileSearchParams[] = 'modelsDirectory'; |
50 |
50 |
51 $modelsDirectory = $profile->search($profileSearchParams); |
51 $modelsDirectory = $profile->search($profileSearchParams); |
52 |
52 |
53 if (!($modelsDirectory instanceof Zend_Tool_Project_Profile_Resource)) { |
53 if (!($modelsDirectory instanceof Zend_Tool_Project_Profile_Resource)) { |
54 throw new Zend_Tool_Project_Provider_Exception( |
54 throw new Zend_Tool_Project_Provider_Exception( |
55 'A models directory was not found' . |
55 'A models directory was not found' . |
56 (($moduleName) ? ' for module ' . $moduleName . '.' : '.') |
56 (($moduleName) ? ' for module ' . $moduleName . '.' : '.') |
57 ); |
57 ); |
58 } |
58 } |
59 |
59 |
60 if (!($dbTableDirectory = $modelsDirectory->search('DbTableDirectory'))) { |
60 if (!($dbTableDirectory = $modelsDirectory->search('DbTableDirectory'))) { |
61 $dbTableDirectory = $modelsDirectory->createResource('DbTableDirectory'); |
61 $dbTableDirectory = $modelsDirectory->createResource('DbTableDirectory'); |
62 } |
62 } |
63 |
63 |
64 $dbTableFile = $dbTableDirectory->createResource('DbTableFile', array('dbTableName' => $dbTableName, 'actualTableName' => $actualTableName)); |
64 $dbTableFile = $dbTableDirectory->createResource('DbTableFile', array('dbTableName' => $dbTableName, 'actualTableName' => $actualTableName)); |
65 |
65 |
66 return $dbTableFile; |
66 return $dbTableFile; |
67 } |
67 } |
68 |
68 |
69 public static function hasResource(Zend_Tool_Project_Profile $profile, $dbTableName, $moduleName = null) |
69 public static function hasResource(Zend_Tool_Project_Profile $profile, $dbTableName, $moduleName = null) |
70 { |
70 { |
71 $profileSearchParams = array(); |
71 $profileSearchParams = array(); |
72 |
72 |
73 if ($moduleName != null && is_string($moduleName)) { |
73 if ($moduleName != null && is_string($moduleName)) { |
74 $profileSearchParams = array('modulesDirectory', 'moduleDirectory' => array('moduleName' => $moduleName)); |
74 $profileSearchParams = array('modulesDirectory', 'moduleDirectory' => array('moduleName' => $moduleName)); |
75 } |
75 } |
76 |
76 |
77 $profileSearchParams[] = 'modelsDirectory'; |
77 $profileSearchParams[] = 'modelsDirectory'; |
78 |
78 |
79 $modelsDirectory = $profile->search($profileSearchParams); |
79 $modelsDirectory = $profile->search($profileSearchParams); |
80 |
80 |
81 if (!($modelsDirectory instanceof Zend_Tool_Project_Profile_Resource) |
81 if (!($modelsDirectory instanceof Zend_Tool_Project_Profile_Resource) |
82 || !($dbTableDirectory = $modelsDirectory->search('DbTableDirectory'))) { |
82 || !($dbTableDirectory = $modelsDirectory->search('DbTableDirectory'))) { |
83 return false; |
83 return false; |
84 } |
84 } |
85 |
85 |
86 $dbTableFile = $dbTableDirectory->search(array('DbTableFile' => array('dbTableName' => $dbTableName))); |
86 $dbTableFile = $dbTableDirectory->search(array('DbTableFile' => array('dbTableName' => $dbTableName))); |
87 |
87 |
88 return ($dbTableFile instanceof Zend_Tool_Project_Profile_Resource) ? true : false; |
88 return ($dbTableFile instanceof Zend_Tool_Project_Profile_Resource) ? true : false; |
89 } |
89 } |
90 |
90 |
91 |
91 |
92 public function create($name, $actualTableName, $module = null, $forceOverwrite = false) |
92 public function create($name, $actualTableName, $module = null, $forceOverwrite = false) |
93 { |
93 { |
94 $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); |
94 $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); |
95 |
95 |
96 // Check that there is not a dash or underscore, return if doesnt match regex |
96 // Check that there is not a dash or underscore, return if doesnt match regex |
97 if (preg_match('#[_-]#', $name)) { |
97 if (preg_match('#[_-]#', $name)) { |
98 throw new Zend_Tool_Project_Provider_Exception('DbTable names should be camel cased.'); |
98 throw new Zend_Tool_Project_Provider_Exception('DbTable names should be camel cased.'); |
99 } |
99 } |
100 |
100 |
101 $originalName = $name; |
101 $originalName = $name; |
102 $name = ucfirst($name); |
102 $name = ucfirst($name); |
103 |
103 |
104 if ($actualTableName == '') { |
104 if ($actualTableName == '') { |
105 throw new Zend_Tool_Project_Provider_Exception('You must provide both the DbTable name as well as the actual db table\'s name.'); |
105 throw new Zend_Tool_Project_Provider_Exception('You must provide both the DbTable name as well as the actual db table\'s name.'); |
106 } |
106 } |
107 |
107 |
108 if (self::hasResource($this->_loadedProfile, $name, $module)) { |
108 if (self::hasResource($this->_loadedProfile, $name, $module)) { |
109 throw new Zend_Tool_Project_Provider_Exception('This project already has a DbTable named ' . $name); |
109 throw new Zend_Tool_Project_Provider_Exception('This project already has a DbTable named ' . $name); |
110 } |
110 } |
111 |
111 |
112 // get request/response object |
112 // get request/response object |
113 $request = $this->_registry->getRequest(); |
113 $request = $this->_registry->getRequest(); |
114 $response = $this->_registry->getResponse(); |
114 $response = $this->_registry->getResponse(); |
115 |
115 |
116 // alert the user about inline converted names |
116 // alert the user about inline converted names |
117 $tense = (($request->isPretend()) ? 'would be' : 'is'); |
117 $tense = (($request->isPretend()) ? 'would be' : 'is'); |
118 |
118 |
119 if ($name !== $originalName) { |
119 if ($name !== $originalName) { |
120 $response->appendContent( |
120 $response->appendContent( |
121 'Note: The canonical model name that ' . $tense |
121 'Note: The canonical model name that ' . $tense |
122 . ' used with other providers is "' . $name . '";' |
122 . ' used with other providers is "' . $name . '";' |
123 . ' not "' . $originalName . '" as supplied', |
123 . ' not "' . $originalName . '" as supplied', |
124 array('color' => array('yellow')) |
124 array('color' => array('yellow')) |
125 ); |
125 ); |
126 } |
126 } |
127 |
127 |
128 try { |
128 try { |
129 $tableResource = self::createResource($this->_loadedProfile, $name, $actualTableName, $module); |
129 $tableResource = self::createResource($this->_loadedProfile, $name, $actualTableName, $module); |
130 } catch (Exception $e) { |
130 } catch (Exception $e) { |
131 $response = $this->_registry->getResponse(); |
131 $response = $this->_registry->getResponse(); |
132 $response->setException($e); |
132 $response->setException($e); |
140 $response->appendContent('Creating a DbTable at ' . $tableResource->getContext()->getPath()); |
140 $response->appendContent('Creating a DbTable at ' . $tableResource->getContext()->getPath()); |
141 $tableResource->create(); |
141 $tableResource->create(); |
142 $this->_storeProfile(); |
142 $this->_storeProfile(); |
143 } |
143 } |
144 } |
144 } |
145 |
145 |
|
146 /** |
|
147 * @param string $module Module name action should be applied to. |
|
148 * @param bool $forceOverwrite Whether should force overwriting previous classes generated |
|
149 * @return void |
|
150 */ |
146 public function createFromDatabase($module = null, $forceOverwrite = false) |
151 public function createFromDatabase($module = null, $forceOverwrite = false) |
147 { |
152 { |
148 $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); |
153 $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); |
149 |
154 |
150 $bootstrapResource = $this->_loadedProfile->search('BootstrapFile'); |
155 $bootstrapResource = $this->_loadedProfile->search('BootstrapFile'); |
151 |
156 |
152 /* @var $zendApp Zend_Application */ |
157 /* @var $zendApp Zend_Application */ |
153 $zendApp = $bootstrapResource->getApplicationInstance(); |
158 $zendApp = $bootstrapResource->getApplicationInstance(); |
154 |
159 |
155 try { |
160 try { |
156 $zendApp->bootstrap('db'); |
161 $zendApp->bootstrap('db'); |
157 } catch (Zend_Application_Exception $e) { |
162 } catch (Zend_Application_Exception $e) { |
158 throw new Zend_Tool_Project_Provider_Exception('Db resource not available, you might need to configure a DbAdapter.'); |
163 throw new Zend_Tool_Project_Provider_Exception('Db resource not available, you might need to configure a DbAdapter.'); |
159 return; |
164 return; |
160 } |
165 } |
161 |
166 |
162 /* @var $db Zend_Db_Adapter_Abstract */ |
167 /* @var $db Zend_Db_Adapter_Abstract */ |
163 $db = $zendApp->getBootstrap()->getResource('db'); |
168 $db = $zendApp->getBootstrap()->getResource('db'); |
164 |
169 |
165 $tableResources = array(); |
170 $tableResources = array(); |
166 foreach ($db->listTables() as $actualTableName) { |
171 foreach ($db->listTables() as $actualTableName) { |
167 |
172 |
168 $dbTableName = $this->_convertTableNameToClassName($actualTableName); |
173 $dbTableName = $this->_convertTableNameToClassName($actualTableName); |
169 |
174 |
170 if (!$forceOverwrite && self::hasResource($this->_loadedProfile, $dbTableName, $module)) { |
175 if (!$forceOverwrite && self::hasResource($this->_loadedProfile, $dbTableName, $module)) { |
171 throw new Zend_Tool_Project_Provider_Exception( |
176 throw new Zend_Tool_Project_Provider_Exception( |
172 'This DbTable resource already exists, if you wish to overwrite it, ' |
177 'This DbTable resource already exists, if you wish to overwrite it, ' |
173 . 'pass the "forceOverwrite" flag to this provider.' |
178 . 'pass the "forceOverwrite" flag to this provider.' |
174 ); |
179 ); |
175 } |
180 } |
176 |
181 |
177 $tableResources[] = self::createResource( |
182 $tableResources[] = self::createResource( |
178 $this->_loadedProfile, |
183 $this->_loadedProfile, |
179 $dbTableName, |
184 $dbTableName, |
180 $actualTableName, |
185 $actualTableName, |
181 $module |
186 $module |
182 ); |
187 ); |
183 } |
188 } |
184 |
189 |
185 if (count($tableResources) == 0) { |
190 if (count($tableResources) == 0) { |
186 $this->_registry->getResponse()->appendContent('There are no tables in the selected database to write.'); |
191 $this->_registry->getResponse()->appendContent('There are no tables in the selected database to write.'); |
187 } |
192 } |
188 |
193 |
189 // do the creation |
194 // do the creation |
190 if ($this->_registry->getRequest()->isPretend()) { |
195 if ($this->_registry->getRequest()->isPretend()) { |
191 |
196 |
192 foreach ($tableResources as $tableResource) { |
197 foreach ($tableResources as $tableResource) { |
193 $this->_registry->getResponse()->appendContent('Would create a DbTable at ' . $tableResource->getContext()->getPath()); |
198 $this->_registry->getResponse()->appendContent('Would create a DbTable at ' . $tableResource->getContext()->getPath()); |