コード例 #1
0
ファイル: CrudTProvider.php プロジェクト: rtsantos/mais
 /**
  *
  * @param string $table
  * @param string $adapter
  * @param string $module 
  * @return void
  * @throws Zend_Tool_Project_Exception
  * @throws Exception 
  */
 public function config($table, $adapter, $module = null, $name = null, $env = null, $schema = null)
 {
     if (!$schema) {
         $schema = $adapter;
     }
     $this->_print(' Criando arquivo de configuracao ');
     $this->_print(' table: ' . $table . ' | adapter : ' . $adapter . ' | module: ' . $module);
     $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION);
     $table = strtolower($table);
     $module = strtolower($module);
     if ($name !== null) {
         $controllerName = strtolower(str_replace('_', '-', $name));
     } else {
         $controllerName = strtolower(str_replace('_', '-', $table));
     }
     $path = $this->_loadedProfile->getAttribute('projectDirectory');
     $this->_configModule($path, $module);
     $dirModules = $path . '/application/configs/modules';
     if (!is_dir($dirModules)) {
         mkdir($dirModules);
     }
     $dirModule = $dirModules . '/' . $module;
     if (!is_dir($dirModule)) {
         mkdir($dirModule);
     }
     $fileName = $dirModule . '/' . $table . '.php';
     /**
      * 
      */
     $config = array();
     if (!file_exists($fileName)) {
         $config['table']['name'] = $table;
         if ($name != null || $name) {
             $config['table']['modelName'] = $name;
         } else {
             $config['table']['modelName'] = $table;
         }
         $config['table']['schema'] = $adapter;
         $config['table']['sequenceName'] = 'sid_' . $table;
         $config['table']['moduleName'] = $module;
         $config['table']['objectName'] = str_replace("_Crud", "", ZendT_Lib::convertTableNameToObjectName($module, $config['table']['modelName']));
         $config['table']['controllerName'] = str_replace("Model_", "", $config['table']['objectName']) || 'Controller';
         $config['table']['seeker']['field']['search'] = '';
         $config['table']['seeker']['field']['display'] = '';
         $config['table']['seeker']['search']['css-width'] = '270px';
         $config['table']['seeker']['display']['css-width'] = '0px';
         $config['table']['seeker']['url']['grid'] = "/{$module}/{$controllerName}/grid";
         $config['table']['seeker']['url']['search'] = "/{$module}/{$controllerName}/seeker-search";
         $config['table']['seeker']['url']['retrieve'] = "/{$module}/{$controllerName}/retrieve";
         $config['table']['seeker']['modal']['width'] = 800;
         $config['table']['seeker']['modal']['height'] = 450;
     } else {
         $config = (require $fileName);
     }
     $config['table']['seeker']['field']['id'] = array();
     $this->_connect($this->_loadedProfile, $adapter, $env);
     $describeModel = $this->_dbAdapter->describeTable($table, $schema);
     if (count($describeModel) <= 0) {
         $this->_print('Erro ao localizar as colunas da Tabela, certifique a conexao e nome da tabela');
         exit;
     } else {
         /**
          * 
          */
         /* if (!isset($config['table']['columns'])) {
            $config['table']['columns'] = array();
            } */
         /**
          * Força para manter a ordem das colunas
          */
         foreach ($describeModel as $columnName => $column) {
             if (!isset($config['table']['columns'][$columnName])) {
                 if (!$config['table']['columns'][strtolower($columnName)]['label']) {
                     $config['table']['columns'][strtolower($columnName)]['label'] = $columnName;
                 }
             }
         }
     }
     //print_r($describeModel);
     //$describeModel['PRECISION'] = (int) $describeModel['PRECISION'];
     if (!isset($config['table']['dependentTables'])) {
         $config['table']['dependentTables'] = array();
     }
     if (!isset($config['table']['referenceMaps'])) {
         $config['table']['referenceMaps'] = array();
     }
     if (isset($describeModel['REFERENCE_MAP'])) {
         $_referenceMaps = array();
         foreach ($describeModel['REFERENCE_MAP'] as &$reference) {
             $modelName = ZendT_Tool_Crud::getModelName($this->_loadedProfile->getAttribute('projectDirectory'), $reference['TABLE_NAME_REFERENCE'], $reference['SCHEMA_NAME_REFERENCE']);
             if ($modelName) {
                 $data = array();
                 $data['columnName'] = $reference['COLUMN_NAME'];
                 $data['objectNameReference'] = $modelName;
                 $data['tableNameReference'] = strtolower($reference['TABLE_NAME_REFERENCE']);
                 $data['schemaNameReference'] = strtolower($reference['SCHEMA_NAME_REFERENCE']);
                 $data['columnReference'] = $reference['COLUMN_NAME_REFERENCE'];
                 $_referenceMaps[] = $data;
             } else {
                 $data = array();
                 $data['columnName'] = $reference['COLUMN_NAME'];
                 if (strtolower($reference['TABLE_NAME_REFERENCE']) == strtolower($table)) {
                     $data['objectNameReference'] = $config['table']['objectName'];
                 } else {
                     $data['objectNameReference'] = str_replace("_Crud", "", ZendT_Lib::convertTableNameToObjectName($module, $reference['TABLE_NAME_REFERENCE']));
                 }
                 $data['tableNameReference'] = strtolower($reference['TABLE_NAME_REFERENCE']);
                 $data['schemaNameReference'] = strtolower($reference['SCHEMA_NAME_REFERENCE']);
                 $data['columnReference'] = $reference['COLUMN_NAME_REFERENCE'];
                 $_referenceMaps[] = $data;
             }
             $config['table']['columns'][strtolower($reference['COLUMN_NAME'])]['referenceMap'] = true;
         }
         $config['table']['referenceMaps'] = $_referenceMaps;
     }
     if (isset($describeModel['DEPENDENT_TABLES'])) {
         $_dependentTables = array();
         foreach ($describeModel['DEPENDENT_TABLES'] as &$dependentTable) {
             $modelName = ZendT_Tool_Crud::getModelName($this->_loadedProfile->getAttribute('projectDirectory'), $dependentTable['TABLE_NAME'], $dependentTable['SCHEMA_NAME'], true);
             if ($modelName) {
                 $_dependentTables[] = $modelName['table']['objectName'];
                 $tab['description'] = $modelName['table']['description'];
                 $tab['url'] = str_replace('/grid', '/form/grid/1', $modelName['table']['seeker']['url']['grid']);
                 $tab['column'] = strtolower($dependentTable['COLUMN_NAME']);
                 $tab['message'] = 'Necessário seleção ' . $config['table']['description'];
                 if (!isset($config['table']['tabs'][$modelName['table']['name']])) {
                     $config['table']['tabs'][$modelName['table']['name']] = $tab;
                 }
             } else {
                 $_dependentTables[] = str_replace("_Crud", "", ZendT_Lib::convertTableNameToObjectName($module, $dependentTable['TABLE_NAME']));
                 /*$tab['description'] = $dependentTable['TABLE_NAME'];
                   $tab['url'] = '/' . strtolower($module).'/' . strtolower(str_replace('_', '-', $dependentTable['TABLE_NAME'])) . '/form/grid/1';
                   $tab['column'] = 'ID_' . strtoupper($config['table']['name']);
                   $tab['message'] = 'Necessário seleção ' . $config['table']['description'];*/
             }
         }
         $config['table']['dependentTables'] = $_dependentTables;
         //$config['table']['tabs'] = $_tabs;
     }
     if (!isset($config['table']['form'])) {
         $config['table']['form']['url']['retrieve'] = "/{$module}/{$controllerName}/retrieve";
         $config['table']['form']['url']['insert'] = "/{$module}/{$controllerName}/insert";
         $config['table']['form']['url']['update'] = "/{$module}/{$controllerName}/update";
         $config['table']['form']['url']['delete'] = "/{$module}/{$controllerName}/delete";
     }
     unset($describeModel['REFERENCE_MAP']);
     unset($describeModel['DEPENDENT_TABLES']);
     $primary = array();
     foreach ($describeModel as $columnName => $column) {
         $columnName = strtolower($columnName);
         if ($column['PRECISION']) {
             $column['LENGTH'] = (int) $column['PRECISION'];
         }
         if ($column['SCALE']) {
             $column['LENGTH'] -= (int) $column['SCALE'];
             $column['LENGTH'] .= '.' . $column['SCALE'];
         }
         /* if (!isset($config['table']['columns'])) {
            $config['table']['columns'] = array();
            } */
         /* if (!isset($config['table']['columns'][$columnName])) {
            $config['table']['columns'][$columnName] = array();
            } */
         /* if (!isset($config['table']['columns'][$columnName]['object'])) {
            $config['table']['columns'][$columnName]['object'] = array();
            } */
         //$this->_print('Coluna '.$columnName.' => Label: '.$config['table']['columns'][$columnName]['label']);
         if ($config['table']['columns'][$columnName]['label'] == '') {
             $config['table']['columns'][$columnName]['label'] = $columnName;
         }
         //$this->_print('Coluna '.$columnName.' => Label: '.$config['table']['columns'][$columnName]['label']);
         #$config['table']['columns'][$columnName]['label'] = $config['table']['columns'][$columnName]['label'];
         if (!isset($config['table']['columns'][$columnName]['multiple'])) {
             $config['table']['columns'][$columnName]['multiple'] = 0;
         }
         if (!isset($config['table']['columns'][$columnName]['type'])) {
             $config['table']['columns'][$columnName]['type'] = 'String';
         }
         if (!isset($config['table']['columns'][$columnName]['object']['mask'])) {
             $config['table']['columns'][$columnName]['object']['mask'] = null;
         }
         if (!isset($config['table']['columns'][$columnName]['object']['charMask'])) {
             $config['table']['columns'][$columnName]['object']['charMask'] = '@';
         }
         if (!isset($config['table']['columns'][$columnName]['object']['filter'])) {
             $config['table']['columns'][$columnName]['object']['filter'][] = 'trim';
             $config['table']['columns'][$columnName]['object']['filter'][] = 'strtoupper';
             $config['table']['columns'][$columnName]['object']['filter'][] = 'removeAccent';
         }
         if (!isset($config['table']['columns'][$columnName]['object']['filterDb'])) {
             $config['table']['columns'][$columnName]['object']['filterDb'][] = '';
         }
         if (!isset($config['table']['columns'][$columnName]['object']['validators'])) {
             $config['table']['columns'][$columnName]['object']['validators'] = array();
         }
         if (!isset($config['table']['columns'][$columnName]['object']['listOptions'])) {
             $config['table']['columns'][$columnName]['object']['listOptions'] = array();
         }
         $config['table']['columns'][$columnName]['object']['listOptions'] = $config['table']['columns'][$columnName]['object']['listOptions'];
         $config['table']['columns'][$columnName]['type'] = $column['DATA_TYPE'];
         $config['table']['columns'][$columnName]['length'] = $column['LENGTH'];
         $config['table']['columns'][$columnName]['nullable'] = $column['NULLABLE'];
         if (!isset($config['table']['primary'])) {
             $config['table']['primary'] = array();
         }
         $column['DATA_TYPE'] = strtoupper($column['DATA_TYPE']);
         if ($column['PRIMARY']) {
             /**
              * @todo pensar em uma forma de tratar os casos de chave composta
              */
             $config['table']['seeker']['field']['id'] = $columnName;
             $primary[] = $columnName;
             $config['table']['columns'][$columnName]['type'] = 'Integer';
             $config['table']['columns'][$columnName]['object']['type'] = 'Text';
             $config['table']['columns'][$columnName]['object']['text']['css-width'] = $column['LENGTH'] * 8.75;
             if ($config['table']['columns'][$columnName]['object']['text']['css-width'] > 300) {
                 $config['table']['columns'][$columnName]['object']['text']['css-width'] = '300px';
             } else {
                 if ($config['table']['columns'][$columnName]['object']['text']['css-width'] < 100) {
                     $config['table']['columns'][$columnName]['object']['text']['css-width'] = '100px';
                 } else {
                     $config['table']['columns'][$columnName]['object']['text']['css-width'] .= 'px';
                 }
             }
             $config['table']['columns'][$columnName]['object']['text']['maxlength'] = $column['LENGTH'];
             $config['table']['columns'][$columnName]['object']['text']['id'] = null;
         } elseif (isset($config['table']['columns'][$columnName]['referenceMap'])) {
             //substr(strtolower($columnName),0,2) == 'id' || is_numeric(strpos($columnName, '_id'))) {
             $config['table']['columns'][$columnName]['type'] = 'Integer';
             $config['table']['columns'][$columnName]['object']['type'] = 'Seeker';
             $load = false;
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $load = true;
             } elseif (!in_array($config['table']['columns'][$columnName]['object']['type'], array('Seeker'))) {
                 $load = true;
             }
             if (!isset($config['table']['columns'][$columnName]['object']['seeker'])) {
                 $configSeeker = ZendT_Tool_Crud::getConfigSeeker($this->_loadedProfile->getAttribute('projectDirectory'), $config, $columnName);
                 $config['table']['columns'][$columnName]['object']['seeker'] = array();
                 $config['table']['columns'][$columnName]['object']['seeker'] = $configSeeker;
             }
         } elseif (in_array($column['DATA_TYPE'], array('VARCHAR2', 'VARCHAR', 'CHAR'))) {
             $load = false;
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $load = true;
             } elseif (!in_array($config['table']['columns'][$columnName]['object']['type'], array('Text', 'Select'))) {
                 $load = true;
             }
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $config['table']['columns'][$columnName]['object']['type'] = 'Text';
             }
             if (!isset($config['table']['columns'][$columnName]['object']['text'])) {
                 $config['table']['columns'][$columnName]['object']['text'] = array();
             }
             if ($config['table']['seeker']['field']['search'] == '') {
                 $config['table']['seeker']['field']['search'] = $columnName;
             }
             $config['table']['columns'][$columnName]['object']['text']['maxlength'] = $column['LENGTH'];
             $validatorNew = array('name' => 'Zend_Validate_StringLength', 'param' => array('max' => (int) $column['LENGTH']));
             foreach ($config['table']['columns'][$columnName]['object']['validators'] as &$validator) {
                 if ($validator['name'] == 'Zend_Validate_StringLength') {
                     $validator = $validatorNew;
                     $validatorNew = null;
                 }
             }
             if ($validatorNew !== null) {
                 $config['table']['columns'][$columnName]['object']['validators'][] = $validatorNew;
             }
             if ($load) {
                 $config['table']['columns'][$columnName]['object']['text']['css-width'] = $column['LENGTH'] * 8.75;
                 if ($config['table']['columns'][$columnName]['object']['text']['css-width'] > 200) {
                     $config['table']['columns'][$columnName]['object']['text']['css-width'] = '200px';
                 } else {
                     if ($config['table']['columns'][$columnName]['object']['text']['css-width'] < 100) {
                         $config['table']['columns'][$columnName]['object']['text']['css-width'] = '100px';
                     } else {
                         $config['table']['columns'][$columnName]['object']['text']['css-width'] .= 'px';
                     }
                 }
                 $config['table']['columns'][$columnName]['object']['text']['id'] = null;
                 $config['table']['columns'][$columnName]['object']['mask'] = null;
             }
             $config['table']['columns'][$columnName]['type'] = 'String';
         } elseif (in_array($column['DATA_TYPE'], array('CLOB'))) {
             $load = false;
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $load = true;
             } elseif (!in_array($config['table']['columns'][$columnName]['object']['type'], array('Text', 'Select'))) {
                 $load = true;
             }
             $config['table']['columns'][$columnName]['object']['type'] = 'Textare';
             if (!isset($config['table']['columns'][$columnName]['object']['textare'])) {
                 $config['table']['columns'][$columnName]['object']['textare'] = array();
             }
             if ($load) {
                 $config['table']['columns'][$columnName]['object']['textare']['id'] = null;
                 $config['table']['columns'][$columnName]['object']['textare']['html'] = false;
                 $config['table']['columns'][$columnName]['object']['textare']['cols'] = 50;
                 $config['table']['columns'][$columnName]['object']['textare']['rows'] = 10;
             }
             $config['table']['columns'][$columnName]['type'] = 'StringLong';
         } elseif (in_array($column['DATA_TYPE'], array('BLOB'))) {
             $load = false;
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $load = true;
             }
             $config['table']['columns'][$columnName]['object']['type'] = 'File';
             if ($load) {
                 $config['table']['columns'][$columnName]['object']['file']['id'] = null;
             }
             $config['table']['columns'][$columnName]['type'] = 'BinaryLong';
         } elseif (in_array($column['DATA_TYPE'], array('DATE'))) {
             $load = false;
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $load = true;
             } elseif (!in_array($config['table']['columns'][$columnName]['object']['type'], array('DateTime', 'Date'))) {
                 $load = true;
             }
             if ($load) {
                 unset($config['table']['columns'][$columnName]['object'][strtolower($config['table']['columns'][$columnName]['object']['type'])]);
                 if (!isset($config['table']['columns'][$columnName]['object']['date'])) {
                     $config['table']['columns'][$columnName]['object']['date'] = array();
                 }
                 if (is_numeric(strpos(strtoupper($columnName), 'DH_'))) {
                     $config['table']['columns'][$columnName]['object']['type'] = 'DateTime';
                     $config['table']['columns'][$columnName]['object']['date']['css-width'] = '87.5px';
                     $config['table']['columns'][$columnName]['object']['date']['maxlength'] = 10;
                     $config['table']['columns'][$columnName]['object']['time']['css-width'] = '43.75px;';
                     $config['table']['columns'][$columnName]['object']['time']['maxlength'] = 5;
                     $config['table']['columns'][$columnName]['type'] = 'DateTime';
                 } else {
                     $config['table']['columns'][$columnName]['object']['type'] = 'Date';
                     $config['table']['columns'][$columnName]['object']['date']['css-width'] = '87.5px';
                     $config['table']['columns'][$columnName]['object']['date']['maxlength'] = 10;
                     $config['table']['columns'][$columnName]['object']['date']['id'] = null;
                     $config['table']['columns'][$columnName]['type'] = 'Date';
                 }
             }
         } elseif (in_array($column['DATA_TYPE'], array('DATETIME'))) {
             $load = false;
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $load = true;
             } elseif (!in_array($config['table']['columns'][$columnName]['object']['type'], array('DateTime'))) {
                 $load = true;
             }
             if ($load) {
                 if (!isset($config['table']['columns'][$columnName]['object']['datetime'])) {
                     $config['table']['columns'][$columnName]['object']['datetime'] = array();
                 }
                 unset($config['table']['columns'][$columnName]['object'][strtolower($config['table']['columns'][$columnName]['object']['type'])]);
                 $config['table']['columns'][$columnName]['object']['type'] = 'DateTime';
                 $config['table']['columns'][$columnName]['object']['date']['css-width'] = '87.5px';
                 $config['table']['columns'][$columnName]['object']['date']['maxlength'] = 10;
                 $config['table']['columns'][$columnName]['object']['date']['id'] = null;
                 $config['table']['columns'][$columnName]['object']['time']['css-width'] = '43.75px';
                 $config['table']['columns'][$columnName]['object']['time']['maxlength'] = 5;
                 $config['table']['columns'][$columnName]['object']['time']['id'] = null;
             }
             $config['table']['columns'][$columnName]['type'] = 'DateTime';
         } elseif (in_array($column['DATA_TYPE'], array('TIME'))) {
             $load = false;
             if (!isset($config['table']['columns'][$columnName]['object']['type'])) {
                 $load = true;
             } elseif (!in_array($config['table']['columns'][$columnName]['object']['type'], array('Time'))) {
                 $load = true;
             }
             if ($load) {
                 if (!isset($config['table']['columns'][$columnName]['object']['time'])) {
                     $config['table']['columns'][$columnName]['object']['time'] = array();
                 }
                 unset($config['table']['columns'][$columnName]['object'][strtolower($config['table']['columns'][$columnName]['object']['type'])]);
                 $config['table']['columns'][$columnName]['object']['type'] = 'Time';
                 $config['table']['columns'][$columnName]['object']['time']['css-width'] = '43.75px';
                 $config['table']['columns'][$columnName]['object']['time']['maxlength'] = 5;
                 $config['table']['columns'][$columnName]['object']['time']['id'] = null;
             }
             $config['table']['columns'][$columnName]['type'] = 'Time';
         } elseif (in_array($column['DATA_TYPE'], array('NUMBER', 'INTEGER', 'DECIMAL', 'INT'))) {
             if (!isset($config['table']['columns'][$columnName]['object']['numeric'])) {
                 $config['table']['columns'][$columnName]['object']['numeric'] = array();
             }
             $config['table']['columns'][$columnName]['object']['type'] = 'Numeric';
             $aux = explode('.', $column['LENGTH']);
             $config['table']['columns'][$columnName]['object']['numeric']['numDecimal'] = $aux[1];
             $config['table']['columns'][$columnName]['object']['numeric']['numInteger'] = $aux[0];
             $config['table']['columns'][$columnName]['object']['numeric']['id'] = null;
             unset($aux);
             $config['table']['columns'][$columnName]['type'] = 'Number';
         }
         if ($column['NULLABLE']) {
             $config['table']['columns'][$columnName]['object']['required'] = false;
         } else {
             $config['table']['columns'][$columnName]['object']['required'] = true;
         }
     }
     if (count($primary) > 0) {
         $config['table']['primary'] = $primary;
     }
     if (count($config['table']['primary']) > 1) {
         unset($config['table']['sequenceName']);
     }
     foreach ($config['table']['columns'] as $columnName => $prop) {
         if (!isset($describeModel[strtoupper($columnName)])) {
             unset($config['table']['columns'][$columnName]);
         }
     }
     if (!isset($config['table']['unique'])) {
         $config['table']['unique'] = array();
     }
     if (!isset($config['table']['description'])) {
         $config['table']['description'] = $config['table']['name'];
         /* $nameResponse = $this->_registry
            ->getClient()
            ->promptInteractiveInput("[ZendT] Informe a descricao da tabela?");
            $description = $nameResponse->getContent();
            $config['table']['description'] = utf8_encode($description); */
     }
     $content = "<?php\nreturn " . var_export($config, true) . "\n?>";
     file_put_contents($fileName, $content);
     $this->_print('Gerado o arquivo ' . $fileName);
 }