/** * Get single model object with dynamic field values using a table join * * @param string $table * @param string $model * @param int $modelId * @param array $filters * @return mixed */ public static function getModelObjectFromTable($table, $model, $modelId, array $filters = []) { $sql = Table\Fields::sql(); $sql->select()->where('models LIKE :models'); $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%' . $model . '%' : '%' . addslashes($model) . '%'; $fields = Table\Fields::execute((string) $sql, ['models' => $value], Record::ROW_AS_ARRAYOBJECT); $encrypted = []; $multiples = []; if ($fields->hasRows()) { $sql = new Sql($sql->db(), $table); $select = [$table . '.*']; $where = []; foreach ($fields->rows() as $field) { $select[$field->name] = DB_PREFIX . 'field_' . $field->name . '.value'; } $sql->select($select); foreach ($fields->rows() as $field) { if ($field->encrypt) { $encrypted[$field->id] = $field->name; } if ($field->type != 'textarea-history' && ($field->dynamic || $field->type == 'checkbox' || $field->type == 'select' && strpos($field->attributes, 'multiple') !== false)) { $multiples[$field->id] = $field->name; } $sql->select()->join(DB_PREFIX . 'field_' . $field->name, [$table . '.id' => DB_PREFIX . 'field_' . $field->name . '.model_id']); } $sql->select()->where($table . '.id = :id'); if (count($where) > 0) { foreach ($where as $w) { $sql->select()->where($w); } } $record = new Record(); $record->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable($table); $record->executeStatement($sql, [$table . '.id' => $modelId], Record::ROW_AS_ARRAYOBJECT); $values = $record->getColumns(); foreach ($values as $key => $value) { foreach ($filters as $filter => $params) { if (null !== $params && count($params) > 0) { $params = array_merge([$value], $params); } else { $params = [$value]; } $value = call_user_func_array($filter, $params); } if (in_array($key, $encrypted)) { $values[$key] = self::parse((new Mcrypt())->decrypt($value)); } else { $values[$key] = self::parse($value); } } if (count($multiples) > 0) { foreach ($multiples as $id => $name) { $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $name); $fv->findRecordsBy(['model_id' => $modelId, 'model' => $model], null, Record::ROW_AS_ARRAYOBJECT); if ($fv->hasRows()) { $values[$name] = []; foreach ($fv->rows() as $f) { $values[$name][] = self::parse(in_array($id, $encrypted) ? (new Mcrypt())->decrypt($f->value) : $f->value); } } } } } else { $sql = new Sql($sql->db(), $table); $sql->select([$table . '.*'])->where($table . '.id = :id'); $record = new Record(); $record->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable($table); $record->executeStatement($sql, [$table . '.id' => $modelId], Record::ROW_AS_ARRAYOBJECT); $values = $record->getColumns(); } $values['id'] = $modelId; return new $model($values); }
/** * Get all dynamic field values for the form object * * @param AbstractController $controller * @param Application $application * @return void */ public static function getAll(AbstractController $controller, Application $application) { if (!$_POST && $controller->hasView() && null !== $controller->view()->form && $controller->view()->form !== false && (int) $controller->view()->form->id != 0 && $controller->view()->form instanceof \Pop\Form\Form) { $fields = $controller->view()->form->getFields(); $modelId = $controller->view()->form->id; $model = str_replace('Form', 'Model', get_class($controller->view()->form)); foreach ($fields as $key => $value) { if (substr($key, 0, 6) == 'field_') { $fieldId = (int) substr($key, 6); $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)) { $fieldValue = $fv->getColumns(); $value = json_decode($fieldValue['value']); if ($field->dynamic && is_array($value)) { if (!isset($values[$fieldId])) { $values[$fieldId] = $value; } if (isset($value[0])) { $value = $value[0]; } } if ($field->encrypt) { $value = (new Mcrypt())->decrypt($value); } if ($field->type == 'file') { $rmCheckbox = new \Pop\Form\Element\CheckboxSet('rm_field_file_' . $field->id, [$value => 'Remove <a href="' . BASE_PATH . CONTENT_PATH . '/files/' . $value . '" target="_blank">' . $value . '</a>?']); $controller->view()->form->insertElementAfter($key, $rmCheckbox); $value = null; } if (strpos($field->type, '-history') !== false && null !== $fv->history) { $history = [0 => 'Current']; $historyAry = json_decode($fv->history, true); krsort($historyAry); foreach ($historyAry as $time => $fieldValue) { $history[$time] = date('M j, Y H:i:s', $time); } $revision = new \Pop\Form\Element\Select('history_' . $modelId . '_' . $field->id, $history); $revision->setLabel('Select Revision'); $revision->setAttribute('onchange', 'phire.changeHistory(this);'); $revision->setAttribute('data-model', $fv->model); $controller->view()->form->insertElementAfter($key, $revision); } $controller->view()->form->{$key} = $value; } } else { $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)) { $fieldValue = $fv->getColumns(); if ($field->isMultiple()) { $values = []; foreach ($fv->rows() as $v) { if ($v->timestamp == $fieldValue['timestamp']) { $values[] = $v->value; } } $value = $values; } else { $value = $fieldValue['value']; } if ($field->encrypt) { $value = (new Mcrypt())->decrypt($value); } if ($field->type == 'file') { $rmCheckbox = new \Pop\Form\Element\CheckboxSet('rm_field_file_' . $field->id, [$fieldValue['value'] => 'Remove <a href="' . BASE_PATH . CONTENT_PATH . '/files/' . $fieldValue['value'] . '" target="_blank">' . $fieldValue['value'] . '</a>?']); $controller->view()->form->insertElementAfter($key, $rmCheckbox); $value = null; } if (strpos($field->type, '-history') !== false && $fv->count() > 1) { $history = [0 => 'Current']; $historyAry = $fv->rows(); for ($i = 1; $i < count($historyAry); $i++) { $history[$historyAry[$i]->timestamp] = date('M j, Y H:i:s', $historyAry[$i]->timestamp); } $revision = new \Pop\Form\Element\Select('history_' . $modelId . '_' . $field->id, $history); $revision->setLabel('Select Revision'); $revision->setAttribute('onchange', 'phire.changeHistory(this);'); $revision->setAttribute('data-model', $fv->model); $controller->view()->form->insertElementAfter($key, $revision); } } } $controller->view()->form->{$key} = $value; } } } } }