protected function updateTableFields()
 {
     if (array_key_exists('saveFields', $this->dirty)) {
         if ($this->dirty['saveFields'] == true) {
             $this->saveFields();
         }
     }
     $dataLink = $this->application->dataLink;
     $insertStrings = array();
     $indexStrings = array();
     foreach ($this->addedFieldIds as $id) {
         $referenceField = new bmReferenceField($this->application, array('identifier' => $id));
         $tableFieldName = $referenceField->dataType == BM_VT_OBJECT ? $referenceField->fieldName . 'Id' : $referenceField->fieldName;
         $insertStrings[] = 'ADD COLUMN `' . $tableFieldName . '` ' . $dataLink->ffTypeToNativeType($referenceField->dataType, $referenceField->defaultValue);
         $key = $this->searchItem($id, 'referenceFieldId', $this->properties['fieldIds']);
         $typeMigrate = 4;
         if ($key !== false) {
             $item = $this->properties['fieldIds'][$key];
             $typeMigrate = $item->type;
             if (in_array($item->type, array(1, 2))) {
                 $indexStrings[] = 'ADD INDEX `' . $tableFieldName . '` (`' . $tableFieldName . '`)';
             }
         }
         if ($this->migration) {
             $this->migration->addSql("\n\t\t\t\t\tinsert ignore into\n\t\t\t\t\t\treferenceField\n\t\t\t\t\t\t(`propertyName`, `fieldName`, `dataType`, `localName`, `defaultValue`)\n\t\t\t\t\tvalues\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->propertyName) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->fieldName) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->dataType) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->localName) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->defaultValue) . "\n\t\t\t\t\t\t)");
             $this->migration->addSql("\n\t\t\t\t\t\tINSERT IGNORE INTO\n\t\t\t\t\t\t\t`link_referenceMap_referenceField`\n\t\t\t\t\t\t\tselect p1.referenceMapId, p2.referenceFieldId, {$typeMigrate} as referenceFieldType from\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tselect id as referenceMapId from `referenceMap` where name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t\t\t\t\t) p1,\n\t\t\t\t\t\t\t\t( select max(id) as referenceFieldId from referenceField ) p2\n\n\n\t\t\t\t");
             if ($typeMigrate !== 4 && array_key_exists('referencedObjectIdMigrate', $this->properties) && array_key_exists($referenceField->fieldName, $this->properties['referencedObjectIdMigrate'])) {
                 $this->migration->addField($this->properties['name'], $referenceField->fieldName . "Id");
                 $this->migration->addCommit("Добавление поля `{$referenceField->fieldName}Id` в связь `{$this->properties['name']}`");
                 $typeText = "дополнительным";
                 if ($typeMigrate === 1) {
                     $typeText = 'главным';
                 } elseif ($typeMigrate === 2) {
                     $typeText = 'зависемое';
                 }
                 $dataObjectMap = new bmDataObjectMap($this->application, ['identifier' => $this->properties['referencedObjectIdMigrate'][$referenceField->fieldName]], null);
                 $this->migration->addCommit("Поле `{$referenceField->fieldName}` {$typeText} в связи `{$this->properties['name']}` для объекта `{$dataObjectMap->name}`");
                 $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\t\t\tINSERT IGNORE INTO\n\t\t\t\t\t\t\t\t\t\t\t\t\t`link_referenceField_dataObjectMap`\n\t\t\t\t\t\t\t\t\t\t\t\tselect p.dataObjectMapId, p1.referenceFieldId from\n\t\t\t\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselect id as dataObjectMapId from dataObjectMap where name = " . $dataLink->quoteSmart($dataObjectMap->name) . "\n\t\t\t\t\t\t\t) p,\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tselect\n\t\t\t\t\t\t\t\t\tdof.id as referenceFieldId\n\t\t\t\t\t\t\t\tfrom\n\t\t\t\t\t\t\t\t\treferenceField dof\n\t\t\t\t\t\t\t\t\tinner join link_referenceMap_referenceField ldd on ldd.referenceFieldId = dof.id\n\t\t\t\t\t\t\t\t\tinner join referenceMap dom on dom.id = ldd.referenceMapId\n\t\t\t\t\t\t\t\twhere\n\t\t\t\t\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($referenceField->properties['fieldName']) . "\n\t\t\t\t\t\t\t\t\tand dom.name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t\t\t\t) p1\n\t\t\t\t\t");
             } else {
                 $this->migration->addField($this->properties['name'], $referenceField->fieldName);
                 $this->migration->addCommit("Добавление поля `{$referenceField->fieldName}` в связь `{$this->properties['name']}`");
             }
         }
     }
     if (count($insertStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStrings) . ";";
         $dataLink->query($sql);
         if ($this->migration) {
             $this->migration->addSql($sql);
         }
         $this->application->log->add($sql);
     }
     if (count($indexStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $indexStrings) . ";";
         $dataLink->query($sql);
         if ($this->migration) {
             $this->migration->addSql($sql);
         }
         $this->application->log->add($sql);
     }
     $insertStrings = array();
     foreach ($this->droppedFields as $id => $droppedFieldName) {
         $insertStrings[] = 'DROP COLUMN `' . $droppedFieldName . '`';
         if ($this->migration) {
             $this->migration->addCommit("Удаление поля `{$droppedFieldName}` в связи `{$this->properties['name']}`");
             $this->migration->addSql("\n\t\t\t\t\t\tset @idData = (\n\t\t\t\t\t\t\t\t\tselect dof.id from\n\t\t\t\t\t\t\t\t\t\treferenceField dof\n\t\t\t\t\t\t\t\t\t\tinner join link_referenceMap_referenceField ldd on ldd.referenceFieldId = dof.id\n\t\t\t\t\t\t\t\t\t\tinner join referenceMap dom on dom.id = ldd.referenceMapId\n\t\t\t\t\t\t\t\t\twhere\n\t\t\t\t\t\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($droppedFieldName) . "\n\t\t\t\t\t\t\t\t\t\tand dom.name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t\t\t)");
             $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\tDELETE FROM\n\t\t\t\t\t\t\t\t\t\t\t\t\t`link_referenceField_dataObjectMap`\n\t\t\t\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t\t\t\t`referenceFieldId` = @idData\n\t\t\t\t\t\t\t\t\t\t");
             $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\tdelete from\n\t\t\t\t\t\t\t\t\t\t\t`referenceField`\n\t\t\t\t\t\t\t\t\t\twhere\n\t\t\t\t\t\t\t\t\t\t\t`id` = @idData\n\t\t\t\t\t\t\t\t\t\t\t");
             $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\t\t\tDELETE FROM\n\t\t\t\t\t\t\t\t\t\t\t\t\t`link_referenceMap_referenceField`\n\t\t\t\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t\t\t\t`referenceMapId` = (select id as referenceMapId from `referenceField` where name = " . $dataLink->quoteSmart($this->properties['name']) . ")\n\t\t\t\t\t\t\t\tand `referenceFieldId` = @idData\n\t\t\t\t\t\t");
         }
     }
     if (count($insertStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStrings) . ";";
         $dataLink->query($sql);
         if ($this->migration) {
             $this->migration->addSql($sql);
         }
         $this->application->log->add($sql);
     }
     $insertStrings = $insertStringsMigrate = array();
     foreach ($this->renamedFields as $item) {
         $referenceField = new bmReferenceField($this->application, array('identifier' => $item->fieldId));
         $tableFieldName = $referenceField->dataType == BM_VT_OBJECT ? $referenceField->fieldName . 'Id' : $referenceField->fieldName;
         if (property_exists($item, 'oldFieldName')) {
             $oldTableFieldName = $referenceField->dataType == BM_VT_OBJECT ? $item->oldFieldName . 'Id' : $item->oldFieldName;
         } else {
             $oldTableFieldName = $tableFieldName;
         }
         $insertStrings[] = ' CHANGE `' . $oldTableFieldName . '` `' . $tableFieldName . '` ' . $dataLink->ffTypeToNativeType($referenceField->dataType, $referenceField->defaultValue);
         if ($this->migration && array_key_exists('oldReferenceField', $this->properties) && array_key_exists($oldTableFieldName, $this->properties['oldReferenceField']) && !$referenceField->compere($this->properties['oldReferenceField'][$oldTableFieldName])) {
             $insertStringsMigrate[] = ' CHANGE `' . $oldTableFieldName . '` `' . $tableFieldName . '` ' . $dataLink->ffTypeToNativeType($referenceField->dataType, $referenceField->defaultValue);
             $this->migration->addCommit("Переименование поля `{$oldTableFieldName}` в `{$referenceField->fieldName}`, в связи `{$this->properties['name']}`");
             $this->migration->addSql("\n\t\t\t\t\tupdate\n\t\t\t\t\t\treferenceField dof\n\t\t\t\t\t\tinner join link_referenceMap_referenceField ldd on ldd.referenceFieldId = dof.id\n\t\t\t\t\t\tinner join referenceMap dom on dom.id = ldd.referenceMapId\n\t\t\t\t\tset\n\t\t\t\t\t\tdof.propertyName = " . $dataLink->quoteSmart($referenceField->propertyName) . ",\n\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($referenceField->fieldName) . ",\n\t\t\t\t\tdof.dataType = " . $dataLink->quoteSmart($referenceField->dataType) . ",\n\t\t\t\t\tdof.localName = " . $dataLink->quoteSmart($referenceField->localName) . ",\n\t\t\t\t\tdof.defaultValue = " . $dataLink->quoteSmart($referenceField->defaultValue) . "\n\t\t\t\twhere\n\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($oldTableFieldName) . "\n\t\t\t\t\tand dom.name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t");
         }
     }
     if (count($insertStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStrings) . ";";
         $dataLink->query($sql);
         $this->application->log->add($sql);
     }
     if ($this->migration && count($insertStringsMigrate) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStringsMigrate) . ";";
         $this->migration->addSql($sql);
     }
     $this->addedFieldIds = array();
     $this->droppedFieldIds = array();
     $this->renamedFields = array();
     $this->dirty['updateTableFields'] = false;
 }
Example #2
0
 public function execute()
 {
     $dataLink = $this->application->dataLink;
     if ($this->referenceId != 0) {
         $referenceMap = new bmReferenceMap($this->application, array('identifier' => $this->referenceId));
         foreach ($this->dataFields as &$item) {
             if (!in_array('delete', $item->actions)) {
                 $inflectionNames = array('nominative', 'genitive', 'dative', 'accusive', 'creative', 'prepositional');
                 if ($item->localName != '') {
                     $inflections = file_get_contents('http://export.yandex.ru/inflect.xml?name=' . urlencode($item->localName));
                     $xml = simplexml_load_string($inflections);
                     $inflections = array();
                     if (count($xml->inflection) == 6) {
                         $i = 0;
                         foreach ($xml->inflection as $inflection) {
                             $inflections[$inflectionNames[$i]] = (string) $inflection;
                             $i++;
                         }
                     } else {
                         foreach ($inflectionNames as $i => $inflection) {
                             $inflections[$inflectionNames[$i]] = (string) $xml->inflection;
                         }
                     }
                 } else {
                     $inflections = array();
                     foreach ($inflectionNames as $i => $inflection) {
                         $inflections[$inflectionNames[$i]] = $item->propertyName;
                     }
                 }
                 $item->localName = serialize($inflections);
                 if ($item->dataType == BM_VT_DATETIME) {
                     if (!preg_match('/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/', $item->defaultValue)) {
                         $item->defaultValue = '0000-01-01 00:00:00';
                     }
                 }
                 $referenceField = new bmReferenceField($this->application, array('identifier' => $item->identifier));
                 $referenceField->propertyName = $item->propertyName;
                 $referenceField->fieldName = $item->fieldName;
                 $referenceField->dataType = $item->dataType;
                 $referenceField->defaultValue = $item->defaultValue;
                 $referenceField->localName = $item->localName;
                 if ($item->referencedObjectId != 0) {
                     $referenceField->setReferencedObject($item->referencedObjectId);
                 }
                 $referenceField->store();
                 $item->identifier = $referenceField->identifier;
             }
             $referenceMap->beginUpdate();
             foreach ($item->actions as $action) {
                 switch ($action) {
                     case 'add':
                         $referenceMap->addField($item->identifier, $item->referencedObjectType);
                         break;
                     case 'delete':
                         $referenceMap->removeField($item->identifier);
                         break;
                     case 'change':
                         $referenceMap->renameField($item->identifier, $item->oldFieldName);
                         break;
                     case 'changeType':
                         $referenceMap->changeFieldType($item->identifier, $item->referencedObjectType);
                         break;
                 }
             }
             $referenceMap->endUpdate();
         }
     }
     $referenceMap->save();
     // $referenceMap->generateFiles(C_ADMIN_ANCESTOR_PAGE);
     // unset($referenceMap);
     parent::execute();
 }