/** * Update an existing field * * @param array $fields * @return void */ public function update(array $fields) { $field = Table\Fields::findById($fields['id']); if (isset($field->id)) { $oldStorage = $field->storage; $oldFieldName = $field->name; $field->group_id = $fields['group_id'] != '----' ? (int) $fields['group_id'] : null; $field->storage = $fields['storage']; $field->type = $fields['type']; $field->name = $fields['name']; $field->label = !empty($fields['label']) ? $fields['label'] : null; $field->values = !empty($fields['values']) ? $fields['values'] : null; $field->default_values = !empty($fields['default_values']) ? $fields['default_values'] : null; $field->attributes = !empty($fields['attributes']) ? $fields['attributes'] : null; $field->validators = serialize($this->getValidators()); $field->encrypt = !empty($fields['encrypt']) ? (int) $fields['encrypt'] : 0; $field->order = !empty($fields['order']) ? (int) $fields['order'] : 0; $field->required = !empty($fields['required']) ? (int) $fields['required'] : 0; $field->prepend = (int) $fields['prepend']; $field->dynamic = (int) $fields['dynamic']; $field->editor = !empty($fields['editor']) && strpos($fields['type'], 'textarea') !== false ? $fields['editor'] : null; $field->models = serialize($this->getModels()); $field->save(); if ($oldStorage != 'eav' && $field->storage == 'eav') { $this->dropFieldTable($field->name); } else { if ($oldStorage == 'eav' && $field->storage != 'eav') { $f = new Table\FieldValues(); $f->delete(['field_id' => $field->id]); $this->createFieldTable($field->name, $field->storage); } else { if ($oldStorage != 'eav' && $field->storage != 'eav') { if ($oldStorage != $field->storage || $oldFieldName != $field->name) { $this->updateFieldTable($field->name, $oldFieldName, $field->storage); } } } } $this->data = array_merge($this->data, $field->getColumns()); } }
/** * Delete dynamic field values * * @param AbstractController $controller * @param Application $application * * @return void */ public static function delete(AbstractController $controller, Application $application) { if ($_POST) { $uploadFolder = BASE_PATH . CONTENT_PATH . '/files'; $mediaLibrary = $application->module('phire-fields')->config()['media_library']; foreach ($_POST as $key => $value) { if (substr($key, 0, 3) == 'rm_' && is_array($value)) { $fields = Table\Fields::findBy(); $fieldIds = []; $fieldTypes = []; $fieldStorage = []; foreach ($fields->rows() as $field) { $fieldIds[$field->id] = $field->name; $fieldTypes[$field->id] = $field->type; $fieldStorage[$field->id] = $field->storage; } foreach ($value as $id) { foreach ($fieldIds as $fieldId => $fieldName) { if ($fieldStorage[$fieldId] == 'eav') { $fv = Table\FieldValues::findBy(['model_id' => (int) $id]); if ($fv->hasRows()) { foreach ($fv->rows() as $f) { $fValue = json_decode($f->value, true); if (!is_array($fValue)) { $fValue = [$fValue]; } foreach ($fValue as $f) { if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $f)) { unlink($_SERVER['DOCUMENT_ROOT'] . $uploadFolder . '/' . $f); } if (null !== $mediaLibrary && $application->isRegistered('phire-media')) { $library = new \Phire\Media\Model\MediaLibrary(); $library->getByFolder($mediaLibrary); if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/' . $library->folder . '/' . $f)) { $media = new \Phire\Media\Model\Media(); $media->getByFile($f); if (isset($media->id)) { $media->remove(['rm_media' => [$media->id]]); } } } } } } $fv = new Table\FieldValues(); $fv->delete(['model_id' => (int) $id]); } else { $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $fieldName); $fv->findRecordsBy(['model_id' => (int) $id]); if ($fieldTypes[$fieldId] == 'file' && $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 && $application->isRegistered('phire-media')) { $library = new \Phire\Media\Model\MediaLibrary(); $library->getByFolder($mediaLibrary); if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/' . $library->folder . '/' . $f->value)) { $media = new \Phire\Media\Model\Media(); $media->getByFile($f->value); if (isset($media->id)) { $media->remove(['rm_media' => [$media->id]]); } } } } } $fv->delete(['model_id' => (int) $id]); } } } } } } }