From db21e6a44786731977a5c9ebab3286be89028b0c Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Tue, 11 Jun 2019 15:56:39 +0200 Subject: [PATCH] #2810 --- src/app/Magic/Fields/Field.php | 24 +++++++++++++++++++ src/app/Magic/Fields/Files.php | 12 +++++++++- src/app/Magic/Fields/Images.php | 11 +++++++++ .../Magic/Models/CubistMagicAbstractModel.php | 15 ++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/app/Magic/Fields/Field.php b/src/app/Magic/Fields/Field.php index 25eead7..89517a7 100644 --- a/src/app/Magic/Fields/Field.php +++ b/src/app/Magic/Fields/Field.php @@ -26,6 +26,11 @@ class Field protected $_cast = false; protected $_translatable = false; + /** + * @var CubistMagicAbstractModel + */ + protected $_modelInstance; + protected $_databaseAttributes = []; /** @@ -46,6 +51,25 @@ class Field return new $class($attributes); } + /** + * @return CubistMagicAbstractModel + */ + public function getModelInstance(): CubistMagicAbstractModel + { + return $this->_modelInstance; + } + + /** + * @param CubistMagicAbstractModel $modelInstance + * @return Field + */ + public function setModelInstance(CubistMagicAbstractModel $modelInstance): Field + { + $this->_modelInstance = $modelInstance; + return $this; + } + + public function getDatabaseType() { if ($this->_translatable) { diff --git a/src/app/Magic/Fields/Files.php b/src/app/Magic/Fields/Files.php index 85466a1..ed1c2bd 100644 --- a/src/app/Magic/Fields/Files.php +++ b/src/app/Magic/Fields/Files.php @@ -13,7 +13,7 @@ class Files extends Field public function getDefaultAttributes() { - return array_merge(parent::getDefaultAttributes(), ['mime_types' => $this->_mimeTypes, 'multiple' => $this->_multiple]); + return array_merge(parent::getDefaultAttributes(), ['mime_types' => $this->_mimeTypes, 'multiple' => $this->_multiple, 'upload' => true, 'disk' => 'uploads']); } protected function _postSetAttributes() @@ -27,4 +27,14 @@ class Files extends Field return parent::_postSetAttributes(); } + public function setMutator($value) + { + $model = $this->getModelInstance(); + + $function = $this->_multiple ? 'uploadMultipleToDisk' : 'uploadToDisk'; + $path = $model->getAttribute('name') . '/' . $model->getPrimaryKey(); + + $model->$function($value, $this->getAttribute('name'), $this->getAttribute('disk'), $path); + } + } diff --git a/src/app/Magic/Fields/Images.php b/src/app/Magic/Fields/Images.php index 580386b..4c54636 100644 --- a/src/app/Magic/Fields/Images.php +++ b/src/app/Magic/Fields/Images.php @@ -7,4 +7,15 @@ namespace Cubist\Backpack\app\Magic\Fields; class Images extends Files { protected $_mimeTypes = ['image/png', 'image/jpeg', 'image/svg+xml', 'image/webp', 'image/gif']; + + protected function _postSetAttributes() + { + if ($this->_multiple) { + $this->setAttribute('type', 'upload_multiple'); + } else { + $this->setAttribute('type', 'image'); + } + + return parent::_postSetAttributes(); + } } diff --git a/src/app/Magic/Models/CubistMagicAbstractModel.php b/src/app/Magic/Models/CubistMagicAbstractModel.php index 67ab9a4..53f9b4f 100644 --- a/src/app/Magic/Models/CubistMagicAbstractModel.php +++ b/src/app/Magic/Models/CubistMagicAbstractModel.php @@ -174,6 +174,7 @@ class CubistMagicAbstractModel extends Model { /** @var Field $field */ $field = Field::getInstance($attributes); + $field->setModelInstance($this); if (is_callable([$field, 'getRelationship']) && null !== $field->getRelationship()) { $this->_addRelationship($field); } @@ -348,6 +349,20 @@ class CubistMagicAbstractModel extends Model public function __call($method, $parameters) { + + // Set mutators + if (preg_match('/^set([a-zA-Z0-9]+)Attribute$/', $method, $matches)) { + $attr = Str::snake($matches[1]); + + if (isset($this->_fields[$attr])) { + $callback = [$this->_fields[$attr], 'setMutator']; + if (is_callable($callback)) { + return call_user_func_array($callback, $parameters); + } + } + } + + // magic call of relationships foreach ($this->_relationships as $relationship) { /** @var $relationship Field */ if ($method == $relationship->getAttribute('entity')) { -- 2.39.5