<?php 
/** 
 * User: delboy1978uk 
 * Date: 01/01/2017 
 * Time: 19:58 
 */ 
 
namespace Del\Form\Field; 
 
use Del\Form\Renderer\Field\FileUploadRender; 
use InvalidArgumentException; 
use LogicException; 
 
class FileUpload extends FieldAbstract implements FieldInterface 
{ 
    /** @var string $uploadDirectory */ 
    private $uploadDirectory; 
 
    /** @var array $_FILES */ 
    private $files; 
 
    /** 
     * @return string 
     */ 
    public function getTag() 
    { 
        return 'input'; 
    } 
 
    public function init() 
    { 
        $this->setAttribute('type', 'file'); 
        $this->setRenderer(new FileUploadRender()); 
        $this->files = $_FILES; 
 
        if ($this->hasUploadedFile()) { 
            $this->setValue($this->files[$this->getName()]['name']); 
        } 
    } 
 
    /** 
     * @return bool 
     */ 
    private function hasUploadedFile() 
    { 
        return $this->isFileArraySet() && $this->isTempNameSet(); 
    } 
 
    /** 
     * @return bool 
     */ 
    private function isFileArraySet() 
    { 
        return isset($this->files[$this->getName()]); 
    } 
 
    /** 
     * @return bool 
     */ 
    private function isTempNameSet() 
    { 
        return isset($this->files[$this->getName()]['tmp_name']); 
    } 
 
    /** 
     * @param $path 
     * @return $this 
     */ 
    public function setUploadDirectory($path) 
    { 
        $path = realpath($path); 
        if (!is_dir($path) || !is_writable($path)) { 
            throw new InvalidArgumentException('Directory does not exist or is not writable.'); 
        } 
        $this->uploadDirectory = $path; 
        return $this; 
    } 
 
    /** 
     * @return string 
     */ 
    public function getUploadDirectory() 
    { 
        return $this->uploadDirectory; 
    } 
 
    /** 
     * @return bool 
     */ 
    public function hasUploadDirectory() 
    { 
        return $this->uploadDirectory !== null; 
    } 
 
    /** 
     * @return bool 
     */ 
    public function moveUploadToDestination() 
    { 
        if (!$this->hasUploadDirectory()) { 
            throw new LogicException('No destination directory set using setUploadDirectory($path)'); 
        } 
        $tmp = $this->files[$this->getName()]['tmp_name']; 
        $destination = $this->getUploadDirectory().DIRECTORY_SEPARATOR.$this->files[$this->getName()]['name']; 
        $success = move_uploaded_file($tmp, $destination); 
        return $success; 
    } 
}
 
 |