/**
  * Perform low level saving of the current model in a DC.
  * NOTE: the model will get populated with the new values within this function.
  * Therefore the current submitted data will be stored within the model but only on
  * success also be saved into the DB.
  *
  * @return bool|InterfaceGeneralModel Model if the save operation was successful or unnecessary, false otherwise.
  */
 protected function doSave()
 {
     $objDBModel = $this->getDC()->getCurrentModel();
     // Check if table is closed
     if ($this->getDC()->arrDCA['config']['closed'] && !$objDBModel->getID()) {
         // TODO show alarm message
         $this->redirect($this->getReferer());
     }
     // if we may not store the value, we keep the changes
     // in the current model and return (DO NOT SAVE!).
     if ($this->getDC()->isNoReload() == true) {
         return false;
     }
     // Callback
     $this->getDC()->getCallbackClass()->onsubmitCallback();
     // Refresh timestamp
     if ($this->getDC()->getDataProvider()->fieldExists("tstamp") == true) {
         $objDBModel->setProperty("tstamp", time());
     }
     // Callback
     $this->getDC()->getCallbackClass()->onsaveCallback($objDBModel);
     // Check if we have a field with eval->alwaysSave
     foreach ($this->objDC->getFieldList() as $arrFieldSettings) {
         if ($arrFieldSettings['eval']['alwaysSave'] == true) {
             $objDBModel->setMeta(DCGE::MODEL_IS_CHANGED, true);
             break;
         }
     }
     //        $this->getNewPosition($objDBModel, 'create', null, false);
     // everything went ok, now save the new record
     if (!$objDBModel->getMeta(DCGE::MODEL_IS_CHANGED) && $objDBModel->getID()) {
         return $objDBModel;
     }
     $this->getDC()->getDataProvider()->save($objDBModel);
     // Check if versioning is enabled
     if (isset($this->getDC()->arrDCA['config']['enableVersioning']) && $this->getDC()->arrDCA['config']['enableVersioning'] == true) {
         // Compare version and current record
         $mixCurrentVersion = $this->getDC()->getDataProvider()->getActiveVersion($objDBModel->getID());
         if ($mixCurrentVersion != null) {
             $mixCurrentVersion = $this->getDC()->getDataProvider()->getVersion($objDBModel->getID(), $mixCurrentVersion);
             if ($this->getDC()->getDataProvider()->sameModels($objDBModel, $mixCurrentVersion) == false) {
                 // TODO: FE|BE switch
                 $this->import('BackendUser', 'User');
                 $this->getDC()->getDataProvider()->saveVersion($objDBModel, $this->User->username);
             }
         } else {
             // TODO: FE|BE switch
             $this->import('BackendUser', 'User');
             $this->getDC()->getDataProvider()->saveVersion($objDBModel, $this->User->username);
         }
     }
     // Return the current model
     return $objDBModel;
 }
 /**
  * Create a variant of the model currently loaded.
  *
  * @param DC_General $objDC The data container holding the current model.
  *
  * @return void
  */
 public function createvariant(DC_General $objDC)
 {
     // Check if table is editable.
     if (!$objDC->isEditable()) {
         $this->log('Table ' . $objDC->getTable() . ' is not editable', 'DC_General - Controller - edit()', TL_ERROR);
         $this->redirect('contao/main.php?act=error');
     }
     // Load fields.
     $objDC->loadEditableFields();
     $objDC->setWidgetID($objDC->getId());
     // Check if we have fields.
     if (!$objDC->hasEditableFields()) {
         $this->redirect($this->getReferer());
     }
     // Load rich text editor.
     $objDC->preloadTinyMce();
     // Set buttons.
     $objDC->addButton('save');
     $objDC->addButton('saveNclose');
     // Load record from data provider.
     $objDBModel = $objDC->getDataProvider()->createVariant($objDC->getDataProvider()->getEmptyConfig()->setId($objDC->getId()));
     if ($objDBModel == null) {
         $objDBModel = $objDC->getDataProvider()->getEmptyModel();
     }
     $objDC->setCurrentModel($objDBModel);
     // Check if we have a auto submit.
     if ($objDC->isAutoSubmitted()) {
         // Process input and update changed properties.
         foreach (array_keys($objDC->getFieldList()) as $key) {
             $varNewValue = $objDC->processInput($key);
             if ($objDBModel->getProperty($key) != $varNewValue) {
                 $objDBModel->setProperty($key, $varNewValue);
             }
         }
         $objDC->setCurrentModel($objDBModel);
     }
     // Check submit.
     if ($objDC->isSubmitted() == true) {
         // @codingStandardsIgnoreStart - we know that access to $_POST is discouraged.
         if (isset($_POST['save'])) {
             $this->getDC()->updateModelFromPOST();
             // Process input and update changed properties.
             if ($this->doSave($objDC) !== false) {
                 // Call the on create callbacks.
                 $objDC->getCallbackClass()->oncreateCallback($objDBModel->getID(), $objDBModel->getPropertiesAsArray());
                 // Log the creation.
                 $this->log(sprintf('A new entry in table "%s" has been created (ID: %s)', $objDC->getTable(), $objDBModel->getID()), 'DC_General - Controller - createvariant()', TL_GENERAL);
                 // Redirect to edit mode.
                 $this->redirect($this->addToUrl('id=' . $objDBModel->getID() . '&act=edit'));
             }
         } elseif (isset($_POST['saveNclose'])) {
             $this->getDC()->updateModelFromPOST();
             // Process input and update changed properties.
             if ($this->doSave($objDC) !== false) {
                 setcookie('BE_PAGE_OFFSET', 0, 0, '/');
                 // @codingStandardsIgnoreStart - we know that access to $_SESSION is discouraged.
                 $_SESSION['TL_INFO'] = array();
                 $_SESSION['TL_ERROR'] = array();
                 $_SESSION['TL_CONFIRM'] = array();
                 // @codingStandardsIgnoreEnd
                 $this->redirect($this->getReferer());
             }
         }
         // Maybe Callbacks?
     }
 }