AntonLV 8 lat temu
rodzic
commit
8e837a4a8d

+ 27 - 7
studio/classes/BxDolStudioFormsField.php

@@ -94,26 +94,46 @@ class BxDolStudioFormsField extends BxDol
         return isset($this->aParams['table']) && !empty($this->aParams['table']);
     }
 
+    public function isField($sName)
+    {
+        if(!isset($this->aParams['table_alter']) || $this->aParams['table_alter'] !== true)
+            return false;
+
+        if(!isset($this->aParams['table']))
+            return false;
+
+        return $this->oDb->isFieldExists($this->aParams['table'], $sName);
+    }
+
     public function alterAdd($sName)
     {
-        if(!isset($this->aParams['table'], $this->aParams['table_alter'], $this->aParams['table_field_type']) || $this->aParams['table_alter'] !== true)
-            return '';
+        if(!isset($this->aParams['table_alter']) || $this->aParams['table_alter'] !== true)
+            return true;
+
+        if(!isset($this->aParams['table'], $this->aParams['table_field_type']))
+            return false;
 
         return $this->oDb->alterAdd($this->aParams['table'], $sName, $this->aParams['table_field_type']);
     }
 
-	public function alterChange($sNameOld, $sNameNew)
+    public function alterChange($sNameOld, $sNameNew)
     {
-        if(!isset($this->aParams['table'], $this->aParams['table_alter'], $this->aParams['table_field_type']) || $this->aParams['table_alter'] !== true)
-            return '';
+        if(!isset($this->aParams['table_alter']) || $this->aParams['table_alter'] !== true)
+            return true;
+
+        if(!isset($this->aParams['table'], $this->aParams['table_field_type']))
+            return false;
 
         return $this->oDb->alterChange($this->aParams['table'], $sNameOld, $sNameNew, $this->aParams['table_field_type']);
     }
 
     public function alterRemove($sName)
     {
-        if(!isset($this->aParams['table'], $this->aParams['table_alter']) || $this->aParams['table_alter'] !== true)
-            return '';
+        if(!isset($this->aParams['table_alter']) || $this->aParams['table_alter'] !== true)
+            return true;
+
+        if(!isset($this->aParams['table']))
+            return false;
 
         return $this->oDb->alterRemove($this->aParams['table'], $sName);
     }

+ 15 - 6
studio/classes/BxDolStudioFormsQuery.php

@@ -678,20 +678,29 @@ class BxDolStudioFormsQuery extends BxDolDb
 
     function alterAdd($sTable, $sField, $sType)
     {
-        $sSql = "ALTER TABLE `" . $sTable . "` ADD `" . $sField . "` " . $sType;
-        $this->query($sSql);
+        if($this->isFieldExists($sTable, $sField))
+            return true;
+
+        return (int)$this->query("ALTER TABLE `" . $sTable . "` ADD `" . $sField . "` " . $sType) > 0;
     }
 
     function alterChange($sTable, $sFieldOld, $sFieldNew, $sTypeNew)
     {
-        $sSql = "ALTER TABLE `" . $sTable . "` CHANGE `" . $sFieldOld . "` `" . $sFieldNew . "` " . $sTypeNew;
-        $this->query($sSql);
+        if(!$this->isFieldExists($sTable, $sFieldOld))
+            return false;
+
+        if(strcmp($sFieldOld, $sFieldNew) !== 0 && $this->isFieldExists($sTable, $sFieldNew))
+            return false;
+
+        return (int)$this->query("ALTER TABLE `" . $sTable . "` CHANGE `" . $sFieldOld . "` `" . $sFieldNew . "` " . $sTypeNew) > 0;
     }
 
     function alterRemove($sTable, $sField)
     {
-        $sSql = "ALTER TABLE `" . $sTable . "` DROP `" . $sField . "`";
-        $this->query($sSql);
+        if(!$this->isFieldExists($sTable, $sField))
+            return true;
+
+        return (int)$this->query("ALTER TABLE `" . $sTable . "` DROP `" . $sField . "`") > 0;
     }
 }
 

+ 14 - 11
studio/template/scripts/BxBaseStudioFormsField.php

@@ -111,21 +111,24 @@ class BxBaseStudioFormsField extends BxDolStudioFormsField
             //--- Process field name.
             $sInputName = $oForm->getCleanValue('name');
             if(empty($sInputName)) {
-            	$sInputObject = $oForm->getCleanValue('object');
+                $sInputObject = $oForm->getCleanValue('object');
 
-	            $sLanguage = BxDolStudioLanguagesUtils::getInstance()->getCurrentLangName(false);
-	            $sInputCaption = BxDolForm::getSubmittedValue('caption-' . $sLanguage, $aForm['form_attrs']['method']);
-	            if(empty($sInputCaption))
-	                $sInputCaption = BxDolForm::getSubmittedValue('caption_system-' . $sLanguage, $aForm['form_attrs']['method']);
+                $sLanguage = BxDolStudioLanguagesUtils::getInstance()->getCurrentLangName(false);
+                $sInputCaption = BxDolForm::getSubmittedValue('caption-' . $sLanguage, $aForm['form_attrs']['method']);
+                if(empty($sInputCaption))
+                    $sInputCaption = BxDolForm::getSubmittedValue('caption_system-' . $sLanguage, $aForm['form_attrs']['method']);
 
-	            $sInputName = $this->getFieldName($sInputObject, $sInputCaption);
-	            BxDolForm::setSubmittedValue('name', $sInputName, $oForm->aFormAttrs['method']);
+                $sInputName = $this->getFieldName($sInputObject, $sInputCaption);
+                BxDolForm::setSubmittedValue('name', $sInputName, $oForm->aFormAttrs['method']);
             }
 
             $sFieldName = strmaxtextlen($sInputName, $this->iFieldNameMaxLen, '');
             if(strcmp($sInputName, $sFieldName) !== 0)
             	BxDolForm::setSubmittedValue('name', $sFieldName, $oForm->aFormAttrs['method']);
 
+            if($this->isField($sFieldName))
+                return false;
+
             $this->onSubmitField($oForm);
             if(($iId = $oForm->insert()) === false)
                 return false;
@@ -155,7 +158,7 @@ class BxBaseStudioFormsField extends BxDolStudioFormsField
         if($oForm->isSubmittedAndValid()) {
             $sInputName = $oForm->getCleanValue('name');
 
-			$sFieldName = strmaxtextlen($sInputName, $this->iFieldNameMaxLen, '');
+            $sFieldName = strmaxtextlen($sInputName, $this->iFieldNameMaxLen, '');
             if(strcmp($sInputName, $sFieldName) !== 0)
             	BxDolForm::setSubmittedValue('name', $sFieldName, $oForm->aFormAttrs['method']);
 
@@ -163,9 +166,9 @@ class BxBaseStudioFormsField extends BxDolStudioFormsField
             if($oForm->update((int)$this->aField['id']) === false)
                 return false;
 
-			$sFieldNameOld = $this->aField['name'];
-			if($bAlter || strcmp($sFieldNameOld, $sFieldName) !== 0)
-				$this->alterChange($sFieldNameOld, $sFieldName);
+            $sFieldNameOld = $this->aField['name'];
+            if($bAlter || strcmp($sFieldNameOld, $sFieldName) !== 0)
+                $this->alterChange($sFieldNameOld, $sFieldName);
 
             return true;
         }