web/lib/Zend/Tool/Project/Provider/DbTable.php
changeset 807 877f952ae2bd
parent 207 621fa6caec0c
child 1230 68c69c656a2c
equal deleted inserted replaced
805:5e7a0fedabdf 807:877f952ae2bd
    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());
   200                 $tableResource->create();
   205                 $tableResource->create();
   201             }
   206             }
   202 
   207 
   203             $this->_storeProfile();
   208             $this->_storeProfile();
   204         }
   209         }
   205         
   210 
   206         
   211 
   207     }
   212     }
   208     
   213 
   209     protected function _convertTableNameToClassName($tableName)
   214     protected function _convertTableNameToClassName($tableName)
   210     {
   215     {
   211         if ($this->_nameFilter == null) {
   216         if ($this->_nameFilter == null) {
   212             $this->_nameFilter = new Zend_Filter();
   217             $this->_nameFilter = new Zend_Filter();
   213             $this->_nameFilter
   218             $this->_nameFilter
   214                 ->addFilter(new Zend_Filter_Word_UnderscoreToCamelCase());
   219                 ->addFilter(new Zend_Filter_Word_UnderscoreToCamelCase());
   215         }
   220         }
   216         
   221 
   217         return $this->_nameFilter->filter($tableName);
   222         return $this->_nameFilter->filter($tableName);
   218     }
   223     }
   219     
   224 
   220 }
   225 }