Example #1
0
 /**
  * Method to save the form data.
  *
  * @param   array  $data  The form data.
  *
  * @return  boolean  True on success.
  */
 public function save($data)
 {
     $translationTable = RedcoreHelpersTranslation::getTranslationTable();
     $contentElement = RTranslationHelper::getContentElement($translationTable->option, $translationTable->xml);
     $translation = JFactory::getApplication()->input->get('translation', array(), 'array');
     $original = JFactory::getApplication()->input->get('original', array(), 'array');
     $id = !empty($data['rctranslations_id']) ? (int) $data['rctranslations_id'] : 0;
     $data = array_merge($data, $translation);
     $fieldsXml = $contentElement->getTranslateFields();
     foreach ($fieldsXml as $field) {
         if ((string) $field['type'] == 'params' && (string) $field['translate'] == '1') {
             $fieldName = (string) $field['name'];
             $original[$fieldName] = $original['params_' . $fieldName];
             $paramsChanged = false;
             if (!empty($data[$fieldName])) {
                 $registry = new JRegistry();
                 $registry->loadString($original[$fieldName]);
                 $originalParams = $registry->toArray();
                 foreach ($data[$fieldName] as $paramKey => $paramValue) {
                     if (!isset($originalParams[$paramKey]) && $paramValue != '' || $originalParams[$paramKey] != $paramValue) {
                         $paramsChanged = true;
                         break;
                     }
                 }
                 if ($paramsChanged) {
                     $data[$fieldName] = json_encode($data[$fieldName]);
                 } else {
                     $data[$fieldName] = '';
                 }
             }
         }
     }
     $dispatcher = RFactory::getDispatcher();
     /** @var RedcoreTableTranslation $table */
     $table = $this->getTable();
     if (empty($id)) {
         $db = $this->getDbo();
         $query = $db->getQuery(true)->select('rctranslations_id')->from($db->qn(RTranslationTable::getTranslationsTableName($translationTable->table, '')))->where('rctranslations_language = ' . $db->q($data['rctranslations_language']));
         foreach ($translationTable->primaryKeys as $primaryKey) {
             if (!empty($data[$primaryKey])) {
                 $query->where($db->qn($primaryKey) . ' = ' . $db->q($data[$primaryKey]));
             }
         }
         $db->setQuery($query);
         $id = $db->loadResult();
     }
     foreach ($translationTable->primaryKeys as $primaryKey) {
         $original[$primaryKey] = $data[$primaryKey];
     }
     $isNew = true;
     // Load the row if saving an existing item.
     $table->load((int) $id);
     if ($table->rctranslations_modified) {
         $isNew = false;
     }
     $data['rctranslations_originals'] = RTranslationTable::createOriginalValueFromColumns($original, $translationTable->columns);
     // We run posthandler methods
     foreach ($fieldsXml as $field) {
         $postHandler = (string) $field['posthandler'];
         $fieldName = (string) $field['name'];
         if (!empty($postHandler) && (string) $field['translate'] == '1') {
             $postHandlerFunctions = explode(',', $postHandler);
             foreach ($postHandlerFunctions as $postHandlerFunction) {
                 $postHandlerFunctionArray = explode('::', $postHandlerFunction);
                 if (empty($postHandlerFunctionArray[1])) {
                     $postHandlerFunctionArray[1] = $postHandlerFunctionArray[0];
                     $postHandlerFunctionArray[0] = 'RTranslationContentHelper';
                     $postHandlerFunction = 'RTranslationContentHelper::' . $postHandlerFunction;
                 }
                 if (method_exists($postHandlerFunctionArray[0], $postHandlerFunctionArray[1])) {
                     call_user_func_array(array($postHandlerFunctionArray[0], $postHandlerFunctionArray[1]), array($field, &$data[$fieldName], &$data, $translationTable));
                 }
             }
         }
     }
     // Bind the data.
     if (!$table->bind($data)) {
         $this->setError($table->getError());
         return false;
     }
     // Prepare the row for saving
     $this->prepareTable($table);
     // Check the data.
     if (!$table->check()) {
         $this->setError($table->getError());
         return false;
     }
     // Trigger the onContentBeforeSave event.
     $result = $dispatcher->trigger($this->event_before_save, array($this->option . '.' . $this->name, &$table, $isNew));
     if (in_array(false, $result, true)) {
         $this->setError($table->getError());
         return false;
     }
     // Store the data.
     if (!$table->store()) {
         $this->setError($table->getError());
         return false;
     }
     // Trigger the onContentAfterSave event.
     $dispatcher->trigger($this->event_after_save, array($this->option . '.' . $this->name, &$table, $isNew));
     $this->setState($this->getName() . '.id', $table->rctranslations_id);
     // Clear the cache
     $this->cleanCache();
     return true;
 }