/** * Get view by ID * * @param int $id * @return void */ public function getById($id) { $view = Table\Views::findById($id); if (isset($view->id)) { $data = $view->getColumns(); if (!empty($data['group_fields'])) { $data['group_fields'] = explode('|', $data['group_fields']); $data['_group_fields'] = []; $data['group_fields_names'] = []; foreach ($data['group_fields'] as $id) { $data['_group_fields'][] = '_' . $id; if (!is_numeric($id)) { $data['group_fields_names'][] = $id; } else { $f = \Phire\Fields\Table\Fields::findById($id); if (isset($f->id)) { $data['group_fields_names'][] = $f->name; } } } } if (!empty($data['single_fields'])) { $data['single_fields'] = explode('|', $data['single_fields']); $data['_single_fields'] = []; $data['single_fields_names'] = []; foreach ($data['single_fields'] as $id) { $data['_single_fields'][] = '_' . $id; if (!is_numeric($id)) { $data['single_fields_names'][] = $id; } else { $f = \Phire\Fields\Table\Fields::findById($id); if (isset($f->id)) { $data['single_fields_names'][] = $f->name; } } } } if (!empty($data['models'])) { $data['models'] = unserialize($data['models']); } $this->data = array_merge($this->data, $data); } }
/** * Save field values * * @param array $fields * @param int $modelId * @param string $model * @return array */ public function save(array $fields, $modelId, $model) { $values = []; foreach ($fields as $name => $value) { if (substr($name, 0, 6) == 'field_') { $fieldId = substr($name, strpos($name, '_') + 1); $field = Table\Fields::findById($fieldId); if (isset($field->id)) { if ($field->storage == 'eav') { if ($field->encrypt) { if (is_array($value)) { foreach ($value as $k => $v) { $value[$k] = (new Mcrypt())->create($v); } } else { $value = (new Mcrypt())->create($value); } } $fv = new Table\FieldValues(['field_id' => $fieldId, 'model_id' => $modelId, 'model' => $model, 'value' => json_encode($value), 'timestamp' => time()]); $fv->save(); } else { if (!is_array($value)) { $value = [$value]; } foreach ($value as $v) { if ($field->encrypt) { $v = (new Mcrypt())->create($v); } $fv = new Record(['model_id' => $modelId, 'model' => $model, 'timestamp' => time(), 'revision' => 0, 'value' => $v]); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->save(); } } $values[$field->name] = $value; } } } return $values; }
/** * Delete dynamic field files * * @param int $fieldId * @param int $modelId * @param string $model * @param boolean $encrypt * @param Application $app * @param string $uploadFolder * @param string $mediaLibrary * @return void */ protected static function saveFiles($fieldId, $modelId, $model, $encrypt, $app, $uploadFolder, $mediaLibrary = null) { $field = T\Fields::findById($fieldId); if (isset($field->id)) { $time = time(); $newValues = []; $oldValues = new Record(); $oldValues->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $oldValues->findRecordsBy(['model_id' => $modelId, 'model' => $model], ['order' => 'id ASC']); $old = $oldValues->rows(false); foreach ($_FILES as $key => $file) { $id = substr_count($key, '_') == 2 ? substr($key, strrpos($key, '_') + 1) : 0; if (!empty($_FILES[$key]['tmp_name']) && !empty($_FILES[$key]['name'])) { if (null !== $mediaLibrary) { $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; if ($encrypt) { $value = (new Mcrypt())->create($value); } if (isset($old[$id])) { $replaceValue = new Record(); $replaceValue->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $replaceValue->findRecordById($old[$id]['id']); if (isset($replaceValue->id)) { $replaceValue->value = $value; $replaceValue->save(); if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $old[$id]['value'])) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $old[$id]['value']); } if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/' . $library->folder . '/' . $old[$id]['value'])) { $media = new \Phire\Media\Model\Media(); $media->getByFile($old[$id]['value']); if (isset($media->id)) { $media->remove(['rm_media' => [$media->id]]); } } } } else { $newValues[] = $value; } 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 . '/', $app->module('phire-fields')->config()['max_size'], $app->module('phire-fields')->config()['disallowed_types'], $app->module('phire-fields')->config()['allowed_types']); $value = $upload->upload($_FILES[$key]); if ($encrypt) { $value = (new Mcrypt())->create($value); } if (isset($old[$id])) { $replaceValue = new Record(); $replaceValue->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $replaceValue->findRecordById($old[$id]['id']); if (isset($replaceValue->id)) { $replaceValue->value = $value; $replaceValue->save(); if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $old[$id]['value'])) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $old[$id]['value']); } } } else { $newValues[] = $value; } } } } foreach ($newValues as $v) { if (!empty($v)) { $fv = new Record(['model_id' => $modelId, 'model' => $model, 'timestamp' => $time, 'revision' => 0, 'value' => $v]); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->save(); $fvs = new Record(); $fvs->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $sql = $fvs->getSql(); $sql->update(['timestamp' => ':timestamp'])->where('model_id = :model_id')->where('model = :model'); $fvs->execute($sql, ['timestamp' => $time, 'model_id' => $modelId, 'model' => $model]); } } } }
/** * Remove a field * * @param array $fields * @param array $config * @return void */ public function remove(array $fields, array $config) { if (isset($fields['rm_fields'])) { $uploadFolder = BASE_PATH . CONTENT_PATH . '/files'; $mediaLibrary = $config['media_library']; foreach ($fields['rm_fields'] as $id) { $field = Table\Fields::findById((int) $id); if (isset($field->id)) { if ($field->type == 'file') { if ($field->storage == 'eav') { $values = Table\FieldValues::findBy(['field_id' => $field->id]); foreach ($values->rows() as $value) { $val = json_decode($value->value); if (is_array($val)) { foreach ($val as $v) { if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $v)) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $v); if (null !== $mediaLibrary && class_exists('Phire\\Media\\Model\\Media')) { $media = new \Phire\Media\Model\Media(); $media->getByFile($v); if (isset($media->id) && $media->library_folder == $mediaLibrary) { $media->remove(['rm_media' => [$media->id]]); } } } } } else { if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $val)) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $val); if (null !== $mediaLibrary && class_exists('Phire\\Media\\Model\\Media')) { $media = new \Phire\Media\Model\Media(); $media->getByFile($val); if (isset($media->id) && $media->library_folder == $mediaLibrary) { $media->remove(['rm_media' => [$media->id]]); } } } } } } else { $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->findAllRecords(); if ($fv->hasRows()) { foreach ($fv->rows() as $f) { if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $f->value)) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $f->value); if (null !== $mediaLibrary && class_exists('Phire\\Media\\Model\\Media')) { $media = new \Phire\Media\Model\Media(); $media->getByFile($f->value); if (isset($media->id) && $media->library_folder == $mediaLibrary) { $media->remove(['rm_media' => [$media->id]]); } } } } } } } if ($field->storage != 'eav') { $this->dropFieldTable($field->name); } $field->delete(); } } } }
/** * Process a form submission * * @param array $fields * @return void */ public function process(array $fields) { if (isset($fields['rm_submissions'])) { foreach ($fields['rm_submissions'] as $id) { $fv = \Phire\Fields\Table\FieldValues::findBy(['model_id' => $id]); foreach ($fv->rows() as $value) { $field = \Phire\Fields\Table\Fields::findById($value->field_id); if (isset($field->id) && $field->type == 'file') { $file = json_decode($value->value); if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/files/' . $file)) { unlink($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/files/' . $file); } } } $fv = new \Phire\Fields\Table\FieldValues(); $fv->delete(['model_id' => $id]); $form = Table\FormSubmissions::findById((int) $id); if (isset($form->id)) { $form->delete(); } } } }
/** * 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); } } } } } }
/** * Copy form * * @param int $id * @param \Pop\Module\Manager $modules * @return void */ public function copy($id, \Pop\Module\Manager $modules = null) { $oldForm = Table\Forms::findById((int) $id); if (isset($oldForm->id)) { $i = 1; $name = $oldForm->name . ' (Copy ' . $i . ')'; $dupeForm = Table\forms::findBy(['name' => $name]); while (isset($dupeForm->id)) { $i++; $name = $oldForm->name . ' (Copy ' . $i . ')'; $dupeForm = Table\forms::findBy(['name' => $name]); } $form = new Table\Forms(['name' => $name, 'method' => !empty($oldForm->method) ? $oldForm->method : null, 'to' => !empty($oldForm->to) ? $oldForm->to : null, 'from' => !empty($oldForm->from) ? $oldForm->from : null, 'reply_to' => !empty($oldForm->reply_to) ? $oldForm->reply_to : null, 'action' => !empty($oldForm->action) ? $oldForm->action : null, 'redirect' => !empty($oldForm->redirect) ? $oldForm->redirect : null, 'attributes' => !empty($oldForm->attributes) ? $oldForm->attributes : null, 'submit_value' => !empty($oldForm->submit_value) ? $oldForm->submit_value : null, 'submit_attributes' => !empty($oldForm->submit_attributes) ? $oldForm->submit_attributes : null, 'use_captcha' => !empty($oldForm->use_captcha) ? (int) $oldForm->use_captcha : null, 'use_csrf' => !empty($oldForm->use_csrf) ? (int) $oldForm->use_csrf : null, 'force_ssl' => !empty($oldForm->force_ssl) ? (int) $oldForm->force_ssl : null]); $form->save(); $flds = null; if (null !== $modules && $modules->isRegistered('phire-fields')) { $flds = \Phire\Fields\Table\Fields::findAll(); } if (null !== $flds) { foreach ($flds->rows() as $f) { if (!empty($f->models)) { $models = unserialize($f->models); print_r($models); foreach ($models as $model) { if ($model['model'] == 'Phire\\Forms\\Model\\Form' && $oldForm->id == $model['type_value']) { $models[] = ['model' => 'Phire\\Forms\\Model\\Form', 'type_field' => 'id', 'type_value' => $form->id]; $newField = \Phire\Fields\Table\Fields::findById($f->id); if (isset($newField->id)) { $newField->models = serialize($models); $newField->save(); } } } } } } } }