/** * 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 a field table * * @param Application $application * @param T\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) { $fieldId = $field->id; $key = 'field_' . $fieldId; switch ($field->storage) { case 'int': $value = (int) $value; break; case 'float': $value = (double) $value; break; case 'date': $value = date('Y-m-d', strtotime($value)); break; case 'time': $value = date('H:i:s', strtotime($value)); break; case 'datetime': $value = date('Y-m-d H:i:s', strtotime($value)); break; } $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->findRecordsBy(['model_id' => $modelId, 'model' => $model], ['order' => 'timestamp DESC']); if (isset($fv->model_id)) { if (strpos($field->type, '-history') !== false) { $historyAry = $fv->rows(); if ($historyAry[0]->value != $value) { if ($fv->count() == $application->module('phire-fields')->config()['history']) { $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->delete(['model_id' => $modelId, 'model' => $model, 'timestamp' => end($historyAry)->timestamp]); } $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->findRecordsBy(['model_id' => $modelId, 'model' => $model]); $fvRows = $fv->rows(); foreach ($fvRows as $f) { $fv->findRecordById($f->id); if (isset($fv)) { $fv->revision = 1; $fv->save(); } } $fv = new Record(['model_id' => $modelId, 'model' => $model, 'timestamp' => time(), 'revision' => 0, 'value' => $value]); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->save(); } } else { if ($field->type == 'file') { self::saveFiles($fieldId, $modelId, $model, $field->encrypt, $application, $uploadFolder, $mediaLibrary); } else { $fv->delete(); self::saveValues($fieldId, $modelId, $model, $value, $field->encrypt); } } } else { if ($field->type == 'file' && isset($_FILES[$key]) && !empty($_FILES[$key]['tmp_name']) && !empty($_FILES[$key]['name'])) { self::saveFiles($fieldId, $modelId, $model, $field->encrypt, $application, $uploadFolder, $mediaLibrary); } else { self::saveValues($fieldId, $modelId, $model, $value, $field->encrypt); } } }
/** * 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']); }
public function testSetValues() { $r = new Record(); $r->setValues(array('column' => 'value')); $this->assertEquals(1, $r->count()); $r->setValues(); $this->assertEquals(0, count($r->rows)); }
/** * Remove any media files * * @param Application $application * @return void */ public static function removeMedia(Application $application) { $uploadFolder = BASE_PATH . CONTENT_PATH . '/files'; $mediaLibrary = $application->module('phire-fields')->config()['media_library']; if ($_POST && isset($_POST['rm_media']) && null !== $mediaLibrary && $application->isRegistered('phire-media')) { $media = new \Phire\Media\Model\Media(); $fields = Table\Fields::findBy(['type' => 'file']); $fieldIds = []; foreach ($fields->rows() as $field) { $fieldIds[$field->id] = $field->name; } foreach ($_POST['rm_media'] as $mid) { $media->getById($mid); if (isset($media->id) && !empty($media->file)) { $sql = Table\FieldValues::sql(); $sql->select()->where('value LIKE :value'); $fv = Table\FieldValues::execute((string) $sql, ['value' => '%"' . $media->file . '"%']); // Remove field value media files from EAV field table if ($fv->count() > 0) { if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $media->file)) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $media->file); } foreach ($fv->rows() as $val) { $v = json_decode($val->value); if (is_array($v) && in_array($media->file, $v)) { $sql = Table\FieldValues::sql(); $sql->select()->where('field_id = :field_id')->where('model_id = :model_id')->where('value LIKE :value'); $f = Table\FieldValues::execute((string) $sql, ['field_id' => $val->field_id, 'model_id' => $val->model_id, 'value' => '%"' . $media->file . '"%']); if (isset($f->field_id)) { unset($v[array_search($media->file, $v)]); if (count($v) > 0) { $v = array_values($v); $f->value = json_encode($v); $f->save(); } else { $f->delete(); } } } else { $f = Table\FieldValues::findBy(['field_id' => $val->field_id, 'model_id' => $val->model_id, 'value' => '"' . $media->file . '"']); $f->delete(); } } } // Remove field value media files from field tables foreach ($fieldIds as $fieldId => $fieldName) { $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $fieldName); $sql = $fv->getSql(); $sql->select()->where('value LIKE :value'); $fv->executeStatement($sql, ['value' => '%"' . $media->file . '"%']); if ($fv->count() > 0) { if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $media->file)) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $media->file); } foreach ($fv->rows() as $val) { $f = new Record(); $f->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('fields_' . $fieldName); $f->findRecordById($val->id); if (isset($f->id)) { $f->delete(); } } } } } } } }