Ejemplo n.º 1
0
 /**
  * Get field values for a model object
  *
  * @param  mixed $model
  * @param  int   $id
  * @param  array $filters
  * @return mixed
  */
 public static function getModelObjectValues($model, $id = null, array $filters = [])
 {
     if (is_string($model)) {
         $class = $model;
     } else {
         $class = get_class($model);
         if (isset($model->id)) {
             $id = $model->id;
         }
     }
     $fieldValues = [];
     $sql = Table\Fields::sql();
     $sql->select()->where('models LIKE :models');
     $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%' . $class . '%' : '%' . addslashes($class) . '%';
     $fields = Table\Fields::execute((string) $sql, ['models' => $value]);
     if (null !== $id && $fields->count() > 0) {
         foreach ($fields->rows() as $field) {
             $fValue = '';
             if ($field->storage == 'eav') {
                 $fv = Table\FieldValues::findById([$field->id, $id, $class]);
                 if (isset($fv->field_id)) {
                     $fValue = json_decode($fv->value);
                     foreach ($filters as $filter => $params) {
                         if (null !== $params && count($params) > 0) {
                             $params = array_merge([$fValue], $params);
                         } else {
                             $params = [$fValue];
                         }
                         $fValue = call_user_func_array($filter, $params);
                     }
                     if ($field->encrypt) {
                         if (is_array($fValue)) {
                             foreach ($fValue as $k => $fv) {
                                 $fValue = (new Mcrypt())->decrypt($fValue);
                             }
                         } else {
                             $fValue = (new Mcrypt())->decrypt($fValue);
                         }
                     }
                 }
             } else {
                 $fv = new Record();
                 $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name);
                 $fv->findRecordsBy(['model_id' => $id, 'model' => $class, 'revision' => 0]);
                 if ($fv->hasRows()) {
                     if ($fv->count() > 1) {
                         $fValue = [];
                         foreach ($fv->rows() as $f) {
                             $fValue[] = $field->encrypt ? (new Mcrypt())->decrypt($f->value) : $f->value;
                         }
                     } else {
                         $fValue = $field->encrypt ? (new Mcrypt())->decrypt($fv->value) : $fv->value;
                     }
                 }
             }
             if (is_object($model)) {
                 $model->{$field->name} = self::parse($fValue);
             } else {
                 $fieldValues[$field->name] = self::parse($fValue);
             }
         }
     }
     return is_object($model) ? $model : $fieldValues;
 }
Ejemplo n.º 2
0
 /**
  * Save dynamic field values to the EAV table
  *
  * @param  Application        $application
  * @param  Table\Fields       $field
  * @param  mixed              $value
  * @param  string             $model
  * @param  int                $modelId
  * @param  string             $uploadFolder
  * @param  string             $mediaLibrary
  * @return void
  */
 public static function save(Application $application, $field, $value, $model, $modelId, $uploadFolder = null, $mediaLibrary = null)
 {
     $dynamicFieldIds = [];
     $fieldId = $field->id;
     $key = 'field_' . $fieldId;
     if ($field->dynamic) {
         $dynamicFieldIds[] = $field->id;
     }
     $fv = Table\FieldValues::findById([$fieldId, $modelId, $model]);
     if ($field->type == 'file' && isset($_FILES[$key]) && !empty($_FILES[$key]['tmp_name']) && !empty($_FILES[$key]['name'])) {
         if (isset($fv->field_id)) {
             $oldFile = json_decode($fv->value);
             if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $oldFile)) {
                 unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $oldFile);
             }
         }
         if (null !== $mediaLibrary && $application->isRegistered('phire-media')) {
             $library = new \Phire\Media\Model\MediaLibrary();
             $library->getByFolder($mediaLibrary);
             if (isset($library->id)) {
                 $settings = $library->getSettings();
                 $mediaUpload = new Upload($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/' . $library->folder, $settings['max_filesize'], $settings['disallowed_types'], $settings['allowed_types']);
                 if ($mediaUpload->test($_FILES[$key])) {
                     $media = new \Phire\Media\Model\Media();
                     $media->save($_FILES[$key], ['library_id' => $library->id]);
                     $value = $media->file;
                     copy($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/' . $library->folder . '/' . $media->file, $_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $media->file);
                 }
             }
         } else {
             $upload = new Upload($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/', $application->module('phire-fields')->config()['max_size'], $application->module('phire-fields')->config()['disallowed_types'], $application->module('phire-fields')->config()['allowed_types']);
             $value = $upload->upload($_FILES[$key]);
         }
     }
     if (!empty($value) && $value != ' ') {
         if ($field->encrypt && !is_array($value)) {
             $value = (new Mcrypt())->create($value);
         }
     }
     if (isset($fv->field_id)) {
         $oldValue = json_decode($fv->value, true);
         if (!empty($value) && $value != ' ') {
             if (strpos($field->type, '-history') !== false) {
                 if ($value != $oldValue) {
                     $ts = null !== $fv->timestamp ? $fv->timestamp : time() - 180;
                     if (null !== $fv->history) {
                         $history = json_decode($fv->history, true);
                         $history[$ts] = $oldValue;
                         if (count($history) > $application->module('phire-fields')->config()['history']) {
                             $history = array_slice($history, 1, $application->module('phire-fields')->config()['history'], true);
                         }
                         $fv->history = json_encode($history);
                     } else {
                         $fv->history = json_encode([$ts => $oldValue]);
                     }
                 }
             }
             if ($field->dynamic && is_array($oldValue) && isset($oldValue[0])) {
                 $oldValue[0] = $value;
                 $newValue = json_encode($oldValue);
             } else {
                 $newValue = json_encode($value);
             }
             $fv->value = $newValue;
             $fv->timestamp = time();
             $fv->save();
         } else {
             if (!$field->dynamic && $field->type != 'file') {
                 $fv->delete();
             } else {
                 if ($field->dynamic && $field->type != 'file' && is_array($oldValue) && isset($oldValue[0])) {
                     $oldValue[0] = '';
                     $newValue = json_encode($oldValue);
                     $fv->value = $newValue;
                     $fv->timestamp = time();
                     $fv->save();
                 }
             }
         }
     } else {
         if (!empty($value) && $value != ' ') {
             $fv = new Table\FieldValues(['field_id' => $fieldId, 'model_id' => $modelId, 'model' => $model, 'value' => $field->dynamic ? json_encode([$value]) : json_encode($value), 'timestamp' => time()]);
             $fv->save();
         }
     }
     foreach ($dynamicFieldIds as $fieldId) {
         $i = 1;
         $offset = 0;
         $fv = Table\FieldValues::findById([$fieldId, $modelId, $model]);
         $checkValue = json_decode($fv->value, true);
         if (is_array($checkValue) && isset($checkValue[0]) && is_array($checkValue[0])) {
             foreach ($checkValue as $k => $v) {
                 $fieldToCheck = $k > 0 ? 'field_' . $fieldId . '_' . $k : 'field_' . $fieldId;
                 if (!isset($_POST[$fieldToCheck])) {
                     unset($checkValue[$k]);
                 }
             }
             $checkValue = array_values($checkValue);
             $fv->value = json_encode($checkValue);
             $fv->timestamp = time();
             $fv->save();
         }
         while (isset($_POST['field_' . $fieldId . '_' . $i])) {
             if (!empty($_POST['field_' . $fieldId . '_' . $i]) && $_POST['field_' . $fieldId . '_' . $i] != ' ') {
                 $postValue = $_POST['field_' . $fieldId . '_' . $i];
                 if (isset($fv->field_id)) {
                     $value = json_decode($fv->value, true);
                     if (isset($value[$i - $offset])) {
                         $value[$i - $offset] = $postValue;
                     } else {
                         $value[] = $postValue;
                     }
                     $fv->value = json_encode($value);
                     $fv->timestamp = time();
                     $fv->save();
                 } else {
                     $fv = new Table\FieldValues(['field_id' => $fieldId, 'model_id' => $modelId, 'model' => $model, 'value' => json_encode([$postValue]), 'timestamp' => time()]);
                     $fv->save();
                 }
             } else {
                 if (isset($fv->field_id)) {
                     $value = json_decode($fv->value, true);
                     if (isset($value[$i])) {
                         unset($value[$i]);
                         $value = array_values($value);
                         $offset++;
                     }
                     $fv->value = json_encode($value);
                     $fv->timestamp = time();
                     $fv->save();
                 }
             }
             $i++;
         }
     }
     foreach ($dynamicFieldIds as $fieldId) {
         $i = 1;
         $offset = 0;
         $fv = Table\FieldValues::findById([$fieldId, $modelId, $model]);
         while (isset($_FILES['field_' . $fieldId . '_' . $i])) {
             if (!empty($_FILES['field_' . $fieldId . '_' . $i]['tmp_name'])) {
                 if (null !== $mediaLibrary && $application->isRegistered('phire-media')) {
                     $library = new \Phire\Media\Model\MediaLibrary();
                     $library->getByFolder($mediaLibrary);
                     if (isset($library->id)) {
                         $settings = $library->getSettings();
                         $mediaUpload = new Upload($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/' . $library->folder, $settings['max_filesize'], $settings['disallowed_types'], $settings['allowed_types']);
                         if ($mediaUpload->test($_FILES['field_' . $fieldId . '_' . $i])) {
                             $media = new \Phire\Media\Model\Media();
                             $media->save($_FILES['field_' . $fieldId . '_' . $i], ['library_id' => $library->id]);
                             $postValue = $media->file;
                             copy($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/' . $library->folder . '/' . $media->file, $_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $media->file);
                         }
                     }
                 } else {
                     $upload = new Upload($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/', $application->module('phire-fields')->config()['max_size'], $application->module('phire-fields')->config()['allowed_types']);
                     $postValue = $upload->upload($_FILES['field_' . $fieldId . '_' . $i]);
                 }
                 if (isset($fv->field_id)) {
                     $value = json_decode($fv->value, true);
                     if (isset($value[$i - $offset])) {
                         $value[$i - $offset] = $postValue;
                     } else {
                         $value[] = $postValue;
                     }
                     $fv->value = json_encode($value);
                     $fv->timestamp = time();
                     $fv->save();
                 } else {
                     $fv = new Table\FieldValues(['field_id' => $fieldId, 'model_id' => $modelId, 'model' => $model, 'value' => json_encode([$postValue]), 'timestamp' => time()]);
                     $fv->save();
                 }
             }
             $i++;
         }
     }
     foreach ($dynamicFieldIds as $fieldId) {
         $fv = Table\FieldValues::findById([$fieldId, $modelId, $model]);
         if (isset($fv->field_id)) {
             $value = json_decode($fv->value, true);
             if (is_array($value) && isset($value[0]) && is_array($value[0])) {
                 foreach ($value as $key => $val) {
                     if (is_array($val) && isset($val[0]) && (empty($val[0]) || $val[0] == ' ')) {
                         unset($val[0]);
                         $value[$key] = array_values($val);
                         if (count($value[$key]) == 0) {
                             unset($value[$key]);
                         }
                     }
                 }
                 $value = array_values($value);
             } else {
                 if (is_array($value) && isset($value[0]) && (empty($value[0]) || $value[0] == ' ')) {
                     unset($value[0]);
                     $value = array_values($value);
                 }
             }
             if (count($value) == 0) {
                 $fv->delete();
             } else {
                 $fv->value = json_encode($value);
                 $fv->save();
             }
         }
     }
 }
Ejemplo n.º 3
0
 /**
  * Process and save seo config
  *
  * @param  array $exclude
  * @return void
  */
 public function saveAnalysis(array $exclude = [])
 {
     $config = Table\Config::findById('seo_config');
     $cfg = isset($config->value) && !empty($config->value) && $config->value != '' ? unserialize($config->value) : [];
     $analysis = ['tracking' => false, 'sitemap' => false, 'robots' => false, 'caching' => false, 'site-verify' => false, 'content' => ['good' => [], 'bad' => []]];
     if (!empty($cfg['tracking']) && $cfg['tracking'] != '') {
         $analysis['tracking'] = true;
     }
     $sitemap = \Phire\Table\Modules::findBy(['name' => 'phire-sitemap']);
     if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . '/sitemap.xml') || isset($sitemap->id) && $sitemap->active) {
         $analysis['sitemap'] = true;
     }
     if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . '/robots.txt') || isset($cfg['robots']) && !empty($cfg['robots']) && $cfg['robots'] != '') {
         $analysis['robots'] = true;
     }
     $cacheDetect = false;
     $curl = new Curl('http://' . $_SERVER['HTTP_HOST'] . BASE_PATH);
     if ($curl->getCode() == 200 && null !== $curl->getHeader('Cache-Control') && null !== $curl->getHeader('Expires') && null !== $curl->getHeader('Last-Modified') && null !== $curl->getHeader('Etag')) {
         $cacheDetect = true;
     }
     $cache = \Phire\Table\Modules::findBy(['name' => 'phire-cache']);
     if ($cacheDetect || isset($cache->id) && $cache->active) {
         $analysis['caching'] = true;
     }
     $dir = new Dir($_SERVER['DOCUMENT_ROOT'] . BASE_PATH, ['relative' => true, 'filesOnly' => true]);
     $googleFileDetect = false;
     foreach ($dir->getFiles() as $file) {
         if (substr($file, 0, 6) == 'google' && strpos(file_get_contents($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . '/' . $file), 'google-site-verification') !== false) {
             $googleFileDetect = true;
         }
     }
     $googleMetaDetect = false;
     if (isset($cfg['meta'])) {
         foreach ($cfg['meta'] as $meta) {
             if ($meta['name'] == 'google-site-verification') {
                 $googleMetaDetect = true;
             }
         }
     }
     if ($googleFileDetect || $googleMetaDetect) {
         $analysis['site-verify'] = true;
     } else {
         if (function_exists('dns_get_record') && $_SERVER['HTTP_HOST'] != 'localhost') {
             $dns = dns_get_record($_SERVER['HTTP_HOST'], DNS_TXT);
             if (count($dns) > 0) {
                 foreach ($dns as $record) {
                     if (isset($record['txt']) && strpos($record['txt'], 'google-site-verification') !== false) {
                         $analysis['site-verify'] = true;
                     }
                 }
             }
         }
     }
     $fields = ['seo_title' => '', 'description' => '', 'keywords' => ''];
     $seoTitle = \Phire\Fields\Table\Fields::findBy(['name' => 'seo_title']);
     $description = \Phire\Fields\Table\Fields::findBy(['name' => 'description']);
     $keywords = \Phire\Fields\Table\Fields::findBy(['name' => 'keywords']);
     if (isset($seoTitle->id)) {
         $fields['seo_title'] = $seoTitle->id;
     }
     if (isset($description->id)) {
         $fields['description'] = $description->id;
     }
     if (isset($keywords->id)) {
         $fields['keywords'] = $keywords->id;
     }
     $content = \Phire\Content\Table\Content::findAll();
     foreach ($content->rows() as $c) {
         if (!in_array($c->type_id, $exclude)) {
             $seoTitle = '';
             $metaDesc = '';
             $metaKeys = '';
             if ($fields['seo_title'] != '') {
                 $seoTitleField = \Phire\Fields\Table\FieldValues::findById([$fields['seo_title'], $c->id, "Phire\\Content\\Model\\Content"]);
                 if (isset($seoTitleField->field_id)) {
                     $seoTitle = json_decode($seoTitleField->value);
                 }
             }
             if ($fields['description'] != '') {
                 $descriptionField = \Phire\Fields\Table\FieldValues::findById([$fields['description'], $c->id, "Phire\\Content\\Model\\Content"]);
                 if (isset($descriptionField->field_id)) {
                     $metaDesc = json_decode($descriptionField->value);
                 }
             }
             if ($fields['keywords'] != '') {
                 $keywordsField = \Phire\Fields\Table\FieldValues::findById([$fields['keywords'], $c->id, "Phire\\Content\\Model\\Content"]);
                 if (isset($keywordsField->field_id)) {
                     $metaKeys = json_decode($keywordsField->value);
                 }
             }
             if (strlen($seoTitle) > 0 && strlen($seoTitle) <= 60 && strlen($metaDesc) > 0 && strlen($metaDesc) <= 160 && strlen($metaKeys) > 0 && strlen($metaKeys) <= 255) {
                 $analysis['content']['good'][$c->id] = ['title' => $c->title, 'uri' => $c->uri];
             } else {
                 $analysis['content']['bad'][$c->id] = ['title' => $c->title, 'type_id' => $c->type_id, 'uri' => $c->uri, 'issues' => []];
                 if (strlen($seoTitle) == 0) {
                     $analysis['content']['bad'][$c->id]['issues'][] = 'No SEO Title';
                 } else {
                     if (strlen($seoTitle) > 60) {
                         $analysis['content']['bad'][$c->id]['issues'][] = 'SEO Title is too long';
                     }
                 }
                 if (strlen($metaDesc) == 0) {
                     $analysis['content']['bad'][$c->id]['issues'][] = 'No description meta tag';
                 } else {
                     if (strlen($metaDesc) > 160) {
                         $analysis['content']['bad'][$c->id]['issues'][] = 'Description meta tag is too long';
                     }
                 }
                 if (strlen($metaKeys) == 0) {
                     $analysis['content']['bad'][$c->id]['issues'][] = 'No keywords meta tag';
                 } else {
                     if (strlen($metaKeys) > 255) {
                         $analysis['content']['bad'][$c->id]['issues'][] = 'Keywords meta tag is too long';
                     }
                 }
             }
         }
     }
     $config = Table\Config::findById('seo_analysis');
     $config->value = serialize($analysis);
     $config->save();
 }
Ejemplo n.º 4
0
 /**
  * JSON models action method
  *
  * @param  mixed $model
  * @param  mixed $fid
  * @param  mixed $marked
  * @return void
  */
 public function json($model = null, $fid = null, $marked = null)
 {
     $json = [];
     // Get field validators and models
     if ($model == 0 && null !== $fid) {
         $field = Table\Fields::findById($fid);
         if (isset($field->id)) {
             $json['validators'] = null != $field->validators ? unserialize($field->validators) : [];
             $json['models'] = null != $field->models ? unserialize($field->models) : [];
         }
         // Get field values
     } else {
         if (null !== $fid && null == $marked && null !== $this->request->getQuery('model')) {
             $field = Table\Fields::findById($fid);
             if ($field->dynamic) {
                 if ($field->storage == 'eav') {
                     $fv = Table\FieldValues::findById([$fid, $model, $this->request->getQuery('model')]);
                     if (!empty($fv->value)) {
                         $values = json_decode($fv->value, true);
                         if (is_array($values)) {
                             array_shift($values);
                         }
                     } else {
                         $values = [];
                     }
                 } else {
                     $fv = new Record();
                     $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name);
                     $fv->findRecordsBy(['model_id' => $model, 'model' => $this->request->getQuery('model')], ['order' => 'id ASC']);
                     $values = [];
                     if ($fv->hasRows() && $fv->count() > 1) {
                         $rows = $fv->rows();
                         for ($i = 1; $i < count($rows); $i++) {
                             $values[] = $rows[$i]->value;
                         }
                     }
                 }
                 $json['values'] = $values;
             }
             // Get field history values
         } else {
             if (null !== $fid && null !== $marked && null !== $this->request->getQuery('model')) {
                 $field = Table\Fields::findById($fid);
                 $value = '';
                 if (isset($field->id)) {
                     if ($field->storage == 'eav') {
                         $fv = Table\FieldValues::findById([$fid, $model, $this->request->getQuery('model')]);
                         if (isset($fv->field_id) && null !== $fv->history) {
                             $history = json_decode($fv->history, true);
                             if (isset($history[$marked])) {
                                 $value = $history[$marked];
                                 $f = Table\Fields::findById($fid);
                                 if ($f->encrypt) {
                                     $value = (new \Pop\Crypt\Mcrypt())->decrypt($value);
                                 }
                             }
                         }
                         $json['fieldId'] = $fid;
                         $json['modelId'] = $model;
                         $json['model'] = $this->request->getQuery('model');
                         $json['value'] = $value;
                     } else {
                         $fv = new Record();
                         $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name);
                         $fv->findRecordsBy(['model_id' => $model, 'model' => $this->request->getQuery('model'), 'timestamp' => $marked], ['order' => 'id ASC']);
                         if (isset($fv->model_id)) {
                             $value = $fv->value;
                             if ($field->encrypt) {
                                 $value = (new \Pop\Crypt\Mcrypt())->decrypt($value);
                             }
                         }
                         $json['fieldId'] = $fid;
                         $json['modelId'] = $model;
                         $json['model'] = $this->request->getQuery('model');
                         $json['value'] = $value;
                     }
                 }
                 // Get field models
             } else {
                 $model = rawurldecode($model);
                 $models = $this->application->module('phire-fields')->config()['models'];
                 if (isset($models[$model])) {
                     $json = $models[$model];
                 }
             }
         }
     }
     $this->response->setBody(json_encode($json, JSON_PRETTY_PRINT));
     $this->send(200, ['Content-Type' => 'application/json']);
 }
Ejemplo n.º 5
0
 /**
  * Save dynamic field values
  *
  * @param  AbstractController $controller
  * @param  Application        $application
  * @return void
  */
 public static function save(AbstractController $controller, Application $application)
 {
     if ($_POST && $controller->hasView() && null !== $controller->view()->id && null !== $controller->view()->form && $controller->view()->form !== false && $controller->view()->form instanceof \Pop\Form\Form) {
         $fields = $controller->view()->form->getFields();
         $modelId = $controller->view()->id;
         $model = str_replace('Form', 'Model', get_class($controller->view()->form));
         $uploadFolder = BASE_PATH . CONTENT_PATH . '/files';
         $mediaLibrary = $application->module('phire-fields')->config()['media_library'];
         // Remove any files
         foreach ($_POST as $key => $value) {
             if (substr($key, 0, 14) == 'rm_field_file_' && isset($value[0])) {
                 $fieldId = substr($key, 14);
                 if (strpos($fieldId, '_') !== false) {
                     $fieldId = substr($fieldId, 0, strpos($fieldId, '_'));
                 }
                 $field = Table\Fields::findById($fieldId);
                 if (isset($field->id)) {
                     if ($field->storage == 'eav') {
                         $fv = Table\FieldValues::findById([$fieldId, $modelId, $model]);
                         if (isset($fv->field_id)) {
                             $oldValue = json_decode($fv->value);
                             if (is_array($oldValue)) {
                                 if (array_search($value[0], $oldValue) !== false) {
                                     $k = array_search($value[0], $oldValue);
                                     if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $oldValue[$k])) {
                                         unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $oldValue[$k]);
                                         if (null !== $mediaLibrary && $application->isRegistered('phire-media')) {
                                             $media = new \Phire\Media\Model\Media();
                                             $media->getByFile($oldValue[$k]);
                                             if (isset($media->id) && $media->library_folder == $mediaLibrary) {
                                                 $media->remove(['rm_media' => [$media->id]]);
                                             }
                                         }
                                     }
                                     unset($oldValue[$k]);
                                 }
                                 if (count($oldValue) == 0) {
                                     $fv->delete();
                                 } else {
                                     $oldValue = array_values($oldValue);
                                     $fv->value = json_encode($oldValue);
                                     $fv->save();
                                 }
                             } else {
                                 if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $oldValue)) {
                                     unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $oldValue);
                                     if (null !== $mediaLibrary && $application->isRegistered('phire-media')) {
                                         $media = new \Phire\Media\Model\Media();
                                         $media->getByFile($oldValue);
                                         if (isset($media->id) && $media->library_folder == $mediaLibrary) {
                                             $media->remove(['rm_media' => [$media->id]]);
                                         }
                                     }
                                 }
                                 $fv->delete();
                             }
                         }
                     } else {
                         $fv = new Record();
                         $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name);
                         $fv->findRecordsBy(['model_id' => $modelId, 'model' => $model, 'value' => $value[0]]);
                         if (isset($fv->model_id)) {
                             if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $value[0])) {
                                 unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $value[0]);
                                 if (null !== $mediaLibrary && $application->isRegistered('phire-media')) {
                                     $media = new \Phire\Media\Model\Media();
                                     $media->getByFile($value[0]);
                                     if (isset($media->id) && $media->library_folder == $mediaLibrary) {
                                         $media->remove(['rm_media' => [$media->id]]);
                                     }
                                 }
                             }
                             $fv = new Record();
                             $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name);
                             $fv->delete(['model_id' => $modelId, 'model' => $model, 'value' => $value[0]]);
                         }
                     }
                 }
             }
         }
         // Save field values
         foreach ($fields as $key => $value) {
             if (substr($key, 0, 6) == 'field_' && substr_count($key, '_') == 1) {
                 $fieldId = (int) substr($key, 6);
                 $field = Table\Fields::findById($fieldId);
                 if (isset($field->id)) {
                     if ($field->storage == 'eav') {
                         Value\Eav::save($application, $field, $value, $model, $modelId, $uploadFolder, $mediaLibrary);
                     } else {
                         Value\Table::save($application, $field, $value, $model, $modelId, $uploadFolder, $mediaLibrary);
                     }
                 }
             }
         }
     }
 }