/** * 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(); } } } }
/** * Copy template * * @param \Pop\Module\Manager $modules * @return void */ public function copy(\Pop\Module\Manager $modules) { $oldId = (int) $this->data['id']; $template = Table\Templates::findById($oldId); if (isset($template->id)) { $i = 1; $name = $template->name . ' (Copy ' . $i . ')'; $dupeTemplate = Table\Templates::findBy(['name' => $name]); while (isset($dupeTemplate->id)) { $i++; $name = $template->name . ' (Copy ' . $i . ')'; $dupeTemplate = Table\Templates::findBy(['name' => $name]); } $newTemplate = new Table\Templates(['parent_id' => $template->parent_id, 'name' => $name, 'device' => null !== $template->parent_id ? null : 'desktop', 'template' => $template->template, 'history' => $template->history]); $newTemplate->save(); if ($modules->isRegistered('phire-fields')) { $fv = \Phire\Fields\Table\FieldValues::findBy(['model_id' => $oldId]); if ($fv->count() > 0) { foreach ($fv->rows() as $value) { $v = new \Phire\Fields\Table\FieldValues(['field_id' => $value->field_id, 'model_id' => $newTemplate->id, 'model' => 'Phire\\Templates\\Model\\Template', 'value' => $value->value, 'timestamp' => time(), 'history' => $value->history]); $v->save(); } } } $this->data = array_replace($this->data, $newTemplate->getColumns()); } }
/** * 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(); } } } }
/** * Get all entity field names * * @param array $rows * @return array */ public function getAllFields(array $rows) { $fieldNames = []; foreach ($rows as $i => $row) { if (class_exists('Phire\\Fields\\Model\\FieldValue')) { $class = 'Phire\\Entities\\Model\\Entity'; $sql = \Phire\Fields\Table\Fields::sql(); $sql->select()->where('models LIKE :models'); $sql->select()->orderBy('order'); $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%' . $class . '%' : '%' . addslashes($class) . '%'; $fields = \Phire\Fields\Table\Fields::execute((string) $sql, ['models' => $value]); foreach ($fields->rows() as $field) { $field->models = unserialize($field->models); if ($this->isFieldAllowed($field->models, $row)) { if ($field->storage == 'eav') { $fv = \Phire\Fields\Table\FieldValues::findBy(['field_id' => $field->id, 'model_id' => $row->id, 'model' => 'Phire\\Entities\\Model\\Entity']); foreach ($fv->rows() as $fv) { if (!array_key_exists($field->name, $fieldNames)) { $fieldNames[$field->name] = $field->type; } $rows[$i][$field->name] = json_decode($fv->value, true); } } else { $fv = new \Pop\Db\Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->findRecordsBy(['model_id' => $row->id, 'model' => 'Phire\\Entities\\Model\\Entity', 'revision' => 0]); if (!array_key_exists($field->name, $fieldNames)) { $fieldNames[$field->name] = $field->type; } if ($fv->count() > 1) { $rows[$i][$field->name] = []; foreach ($fv->rows() as $f) { $rows[$i][$field->name][] = $f->value; } } else { $rows[$i][$field->name] = $fv->value; } } } } } } return $fieldNames; }
/** * 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]); } } } } } } }
/** * Copy content * * @param int $userId * @return void */ public function copy($userId) { $oldId = (int) $this->data['id']; $content = Table\Content::findById($oldId); if (isset($content->id)) { $i = 1; $title = $content->title . ' (Copy ' . $i . ')'; $uri = $content->uri . '-' . $i; $slug = $content->slug . '-' . $i; $dupeContent = Table\Content::findBy(['uri' => $uri]); while (isset($dupeContent->id)) { $i++; $title = $content->title . ' (Copy ' . $i . ')'; $uri = $content->uri . '-' . $i; $slug = $content->slug . '-' . $i; $dupeContent = Table\Content::findBy(['uri' => $uri]); } $newContent = new Table\Content(['type_id' => $content->type_id, 'parent_id' => $content->parent_id, 'title' => $title, 'uri' => $uri, 'slug' => $slug, 'publish' => date('Y-m-d H:i:s'), 'expire' => null, 'status' => -1, 'template' => $content->template, 'roles' => $content->roles, 'order' => $content->order, 'force_ssl' => $content->force_ssl, 'created' => date('Y-m-d H:i:s'), 'created_by' => $userId]); $newContent->save(); if (class_exists('Phire\\Fields\\Table\\FieldValues')) { $fv = \Phire\Fields\Table\FieldValues::findBy(['model_id' => $oldId]); if ($fv->count() > 0) { foreach ($fv->rows() as $value) { $v = new \Phire\Fields\Table\FieldValues(['field_id' => $value->field_id, 'model_id' => $newContent->id, 'model' => 'Phire\\Content\\Model\\Content', 'value' => $value->value, 'timestamp' => time(), 'history' => $value->history]); $v->save(); } } } $this->data = array_replace($this->data, $newContent->getColumns()); } }