예제 #1
0
 /**
  * Check the current Fields and make the sync in the table of the module.
  *
  * @param array  $newFields Array with all the data per new field.
  * @param string $tableName Name of the module Table.
  * @param array  $tableData Array with the table data definition per new field.
  *
  * @return boolean True on a sucessful sync.
  */
 public function syncTable($newFields, $tableName, $tableData)
 {
     $systemFields = array('id', 'owner_id', 'project_id');
     $tableManager = new Phprojekt_Table(Phprojekt::getInstance()->getDb());
     // Clean the metadata cache
     if (null !== $this->_model) {
         $info = $this->_model->info();
         $dbConfig = Phprojekt::getInstance()->getDb()->getConfig();
         // Define the cache identifier where the metadata are saved
         $cacheId = md5((isset($dbConfig['options']['port']) ? ':' . $dbConfig['options']['port'] : null) . (isset($dbConfig['options']['host']) ? ':' . $dbConfig['options']['host'] : null) . '/' . $dbConfig['dbname'] . ':' . $info['schema'] . '.' . $info['name']);
         Zend_Db_Table_Abstract::getDefaultMetadataCache()->remove($cacheId);
     }
     $oldFields = $this->getDataDefinition();
     $tableDataForCreate['id'] = array('type' => 'auto_increment', 'length' => 11);
     $tableDataForCreate['owner_id'] = array('type' => 'int', 'length' => 11);
     if (!isset($tableDataForCreate['project_id'])) {
         $tableDataForCreate['project_id'] = array('type' => 'int', 'length' => 11);
     }
     array_merge($tableDataForCreate, $tableData);
     $tableName = strtolower(self::convertTableField($tableName));
     $tableFields = $tableManager->getTableFields($tableName, $tableDataForCreate);
     // Search for Modify and Delete
     $return = true;
     foreach ($oldFields as $oldValues) {
         $found = false;
         foreach ($newFields as $newValues) {
             if ($oldValues['id'] == $newValues['id']) {
                 $newValues['tableField'] = self::convertTableField($newValues['tableField']);
                 $fieldDefinition = $tableData[$newValues['tableField']];
                 $fieldDefinition['name'] = $newValues['tableField'];
                 if (!in_array($fieldDefinition['name'], $systemFields)) {
                     if ($oldValues['tableField'] == $newValues['tableField']) {
                         if (!$tableManager->modifyField($tableName, $fieldDefinition)) {
                             $return = false;
                         }
                     } else {
                         $fieldDefinition['oldName'] = $oldValues['tableField'];
                         if (!$tableManager->changeField($tableName, $fieldDefinition)) {
                             $return = false;
                         }
                     }
                 }
                 $found = true;
                 break;
             }
         }
         if (!$found) {
             $fieldDefinition = array();
             $fieldDefinition['name'] = $oldValues['tableField'];
             if (!in_array($fieldDefinition['name'], $systemFields)) {
                 if (!$tableManager->deleteField($tableName, $fieldDefinition)) {
                     $return = false;
                 }
             }
         }
     }
     // Search for Add
     foreach ($newFields as $newValues) {
         if ($newValues['id'] == 0) {
             $newValues['tableField'] = self::convertTableField($newValues['tableField']);
             $fieldDefinition = $tableData[$newValues['tableField']];
             $fieldDefinition['name'] = $newValues['tableField'];
             if (!in_array($fieldDefinition['name'], $systemFields)) {
                 if (!$tableManager->addField($tableName, $fieldDefinition)) {
                     $return = false;
                 }
             }
         }
     }
     return $return;
 }