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; }
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(); }