Exemple #1
0
 /**
  * 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);
 }
Exemple #2
0
 /**
  * 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;
                 }
             }
         }
     }
 }