Source of file UploadFileField.php
Size: 8,927 Bytes - Last Modified: 2021-12-23T10:02:36+00:00
/var/www/docs.ssmods.com/process/src/src/Forms/UploadFileField.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 | <?php namespace MadeHQ\Cloudinary\Forms; use MadeHQ\Cloudinary\Model\FileLink; use SilverStripe\AssetAdmin\Controller\AssetAdmin; use SilverStripe\AssetAdmin\Forms\UploadField; use SilverStripe\Assets\Upload_Validator; use SilverStripe\Core\Injector\Injector; use SilverStripe\ORM\SS_List; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObjectInterface; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\FileUploadReceiver; use SilverStripe\Forms\FormField; use SilverStripe\Forms\TextField; use SilverStripe\Forms\TextareaField; use SilverStripe\View\Requirements; use SilverStripe\Control\{ HTTPRequest, HTTPResponse }; class UploadFileField extends FormField { use FileUploadReceiver; private $fields; private $uploadField; /** * @config * @var array */ private static $allowed_actions = [ 'upload' ]; /** * {@inheritdoc} */ public function __construct($name, $title = null, $value = null) { $this->constructFileUploadReceiver(); // When creating new files, rename on conflict $this->getUpload()->setReplaceFile(false); $this->uploadField = new CustomUploadField(sprintf('%s[File]', $name), 'File'); $this->fields = [ $this->uploadField->setAllowedMaxFileNumber(1), TextField::create(sprintf('%s[Title]', $name), 'Title'), TextareaField::create(sprintf('%s[Description]', $name), 'Description'), ]; parent::__construct($name, $title, $value); $this->setTemplate('UploadFileField'); $this->extend('init'); } /** * Inserts the given field to the list of fields to show in the CMS * * @param FormField $field * @return UploadFileField */ public function addField(FormField $field) { array_push($this->fields, $field); return $this; } /** * Creates a single file based on a form-urlencoded upload. * * @param HTTPRequest $request * @return HTTPResponse */ public function upload(HTTPRequest $request) { if ($this->isDisabled() || $this->isReadonly()) { return $this->httpError(403); } // CSRF check $token = $this->getForm()->getSecurityToken(); if (!$token->checkRequest($request)) { return $this->httpError(400); } $tmpFile = $request->postVar('Upload'); /** @var File $file */ $file = $this->saveTemporaryFile($tmpFile, $error); // Prepare result if ($error) { $result = [ 'message' => [ 'type' => 'error', 'value' => $error, ] ]; $this->getUpload()->clearErrors(); return (new HTTPResponse(json_encode($result), 400)) ->addHeader('Content-Type', 'application/json'); } // We need an ID for getObjectFromData if (!$file->isInDB()) { $file->write(); } // Return success response $result = [ AssetAdmin::singleton()->getObjectFromData($file) ]; // Don't discard pre-generated client side canvas thumbnail if ($result[0]['category'] === 'image') { unset($result[0]['thumbnail']); } $this->getUpload()->clearErrors(); return (new HTTPResponse(json_encode($result))) ->addHeader('Content-Type', 'application/json'); } /** * Removes the field with the given name from the list of fields * to show in the CMS * * @param string $name * @return UploadFileField */ public function removeField($name) { foreach ($this->fields as $i => $field) { if ($field->getName() === sprintf('%s[%s]', $this->getName(), $name)) { array_splice($this->fields, $i, 1); } } return $this; } /** * @return FieldList */ public function getFieldList() { return new FieldList($this->fields); } /** * @return FieldList */ public function setForm($form) { foreach ($this->fields as $field) { $field->setForm($form); } parent::setForm($form); } /** * {@inheritdoc} */ public function saveInto(DataObjectInterface $record) { $linkRecord = $record->{$this->getName()}(); $fields = $this->getFieldList(); $fileField = $fields->dataFieldByName(sprintf('%s[File]', $this->getName())); foreach ($fields as $field) { if ($field->getName() === sprintf('%s[File]', $this->getName())) { $linkRecord->setCastedField('FileID', $field->dataValue()['Files'][0]); } else { $linkRecord->setCastedField(preg_replace('/^.*\[(\w+)\]$/', '$1', $field->getName()), $field->dataValue()); } } $this->extend('saveIntoBeforeWrite', $record, $linkRecord); $linkRecord->write(true, false, true); $record->{$this->getName() . 'ID'} = $linkRecord->ID; $this->extend('saveIntoAfterWrite', $record, $linkRecord); } /** * {@inheritdoc} */ public function setValue($value, $record = null) { if(empty($value) && $record) { if (($record instanceof DataObject) && $record->hasMethod($this->getName())) { $data = $record->{$this->getName()}(); if($data && $data->exists()) { $fields = $this->getFieldList(); foreach ($fields as $field) { $fieldSubName = preg_replace('/^.+\[(\w+)\]$/', '$1', $field->getName()); if ($fieldSubName === 'File') { $field->setValue($data->File()); } else { $field->setValue($data->$fieldSubName); } } } } } elseif (!empty($value)) { // Load field values from Object $fields = $this->getFieldList(); foreach ($fields as $field) { $fieldSubName = preg_replace('/^.+\[(\w+)\]$/', '$1', $field->getName()); if ($fieldSubName === 'File') { if (is_object($value) && $value instanceof DataObject && $value->hasMethod('File')) { $field->setValue($value->File()); } else { $field->setValue($value); } } else { $field->setValue($value->$fieldSubName); } } } return parent::setValue($value, $record); } /** * {@inheritdoc} */ public function setSubmittedValue($value, $data = NULL) { $fields = $this->getFieldList(); if (!array_key_exists('File', $value)) { foreach ($fields as $field) { $field->setValue(false); } } else { foreach ($fields as $field) { $valueKey = preg_replace('/^.+\[(\w+)\]$$/', '$1', $field->getName()); $field->setValue($value[$valueKey]); } } } /** * @return boolean */ public function isComposite() { return true; } /** * @return Upload_Validator */ public function getValidator() { return Upload_Validator::create(); } /** * Gets the foreign class that needs to be created, or 'File' as default if there * is no relationship, or it cannot be determined. * * @param string $default Default value to return if no value could be calculated * @return string Foreign class name. */ public function getRelationAutosetClass($default = File::class) { // Don't autodetermine relation if no relationship between parent record if (!$this->getRelationAutoSetting()) { return $default; } // Check record and name $name = $this->getName(); $record = $this->getRecord(); if (empty($name) || empty($record)) { return $default; } else { $class = $record->getRelationClass($name); if (is_subclass_of($class, FileLink::class)) { $class = Injector::inst()->create($class)->getRelationClass('File'); } return empty($class) ? $default : $class; } } } /** * This is a nasty hack so that the child Upload Field ends up pointing to this field */ class CustomUploadField extends UploadField { public function Link($action = null) { $link = parent::Link($action); $link = str_replace('[File]', '', $link); return $link; } } |