Source of file HasOneUploadField.php
Size: 3,205 Bytes - Last Modified: 2021-12-23T10:38:16+00:00
/var/www/docs.ssmods.com/process/src/src/HasOneUploadField.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | <?php namespace SGN\HasOneEdit; use SilverStripe\AssetAdmin\Forms\UploadField; use SilverStripe\Assets\File; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObjectInterface; use SilverStripe\ORM\Relation; /** * Class HasOneUploadField * @package App\Forms */ class HasOneUploadField extends UploadField { /** * @var null|bool */ private $hasOneMultiUpload = null; /** * HasOneUploadField constructor. * @param \SilverStripe\AssetAdmin\Forms\UploadField $original */ public function __construct(UploadField $original) { if (!HasOneEdit::isHasOneEditField($original)) { throw new \InvalidArgumentException('Original upload field passed to HasOneUploadField must have the has_one separator "' . HasOneEdit::FIELD_SEPARATOR . '" in its name.'); } parent::__construct($original->getName(), $original->title, $original->getItems()); // Copy state from original upload field foreach (get_object_vars($original) as $prop => $value) { $this->{$prop} = $value; } } /** * Check if allowed to upload more than one file * @see \SilverStripe\AssetAdmin\Forms\UploadField::getIsMultiUpload() * @return bool */ public function getIsMultiUpload() { if ($this->hasOneMultiUpload === null) { // Guess from record list($relationName, $fieldOnRelation) = HasOneEdit::getRelationNameAndField($this); $relatedObject = HasOneEdit::getRelationRecord($this->getRecord(), $relationName); // Multi-upload disabled for has_one components $this->hasOneMultiUpload = !($relatedObject && DataObject::getSchema()->hasOneComponent($relatedObject, $fieldOnRelation)); } return $this->hasOneMultiUpload; } /** * @see \SilverStripe\AssetAdmin\Forms\UploadField::saveInto() * @inheritDoc */ public function saveInto(DataObjectInterface $record) { list($relationName, $fieldOnRelation) = HasOneEdit::getRelationNameAndField($this); $record = HasOneEdit::getRelationRecord($this->getRecord(), $relationName); // Check type of relation $relation = $record->hasMethod($fieldOnRelation) ? $record->$fieldOnRelation() : null; if ($relation instanceof Relation) { // has_many or many_many $relation->setByIDList($this->getItemIDs()); } elseif ($class = DataObject::getSchema()->hasOneComponent($record, $fieldOnRelation)) { // Get details to save $idList = $this->getItemIDs(); // Assign has_one ID $id = !empty($idList) ? reset($idList) : 0; $record->setField("{$fieldOnRelation}ID", $id); // Polymorphic asignment if ($class === DataObject::class) { $file = $id ? File::get()->byID($id) : null; $fileClass = $file ? get_class($file) : File::class; $record->{"{$fieldOnRelation}Class"} = $id ? $fileClass : null; } // Write has one record $record->write(); } return $this; } } |