/** * 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; }
/** * 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(); } } } }
/** * 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(); }
/** * 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']); }
/** * 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); } } } } } }