%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/file/widgets/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/file/widgets/UploadInput.php |
<?php namespace humhub\modules\file\widgets; use Yii; use yii\base\Model; use yii\helpers\Html; use humhub\modules\file\models\File; use humhub\widgets\JsWidget; /** * The file input will upload files either to the given $url or to the default * file upload route '/file/file/upload'. * * The returned guids will be attached to an array input field with a default form name 'guids[]'. * The default form name can either be overwritten by providing a $model and $attribute or by setting the * $name field. * * The resulted guids will either be appended to the surrounding form if no $form selector is given. * * @package humhub.modules_core.file.widgets * @since 1.2 */ class UploadInput extends JsWidget { const DEFAULT_FORM_NAME = 'fileList'; /** * javascript widget implementation. * * @var type */ public $jsWidget = 'file.Upload'; /** * @inheritdoc * @var type */ public $init = true; /** * Active Model can be set to attach files to this model. * * @var \yii\db\ActiveRecord */ public $model; /** * Can be used to overwrite the default result input name files[] with a model * bound attribute formName. * * @var string */ public $attribute; /** * Name of the upload input field default files[]. * * @var string */ public $name = 'files[]'; /** * Will automatically add posted files with the given $submitName to the form as hidden input. * * This sometimes is required for forms with backend validation. Note in case of a successful submission the files * will also be added if the form is included visible in the resulting view. * * @var bool * @since 1.3.5 */ public $postState = false; /** * Defines the input name of attached file list items. * * If no model is given the default name is `fileList[]` * * @var string */ public $submitName; /** * Can be set if the upload button is not contained in the form itself. * * @var type */ public $form; /** * Can be set to overwrite the default file upload route. * * @var type */ public $url; /** * Total number of maximum amount of allowed file uploads. * @var type */ public $max; /** * Selector of dropzone node. * @var type */ public $dropZone; /** * Selector of paste zone node. * @var string */ public $pasteZone; /** * File preview js widget selector. * * @var type */ public $preview; /** * Upload progress js widget selector. * @var type */ public $progress; /** * Used to hide/show the actual input element. * @var type */ public $visible = false; /** * @var boolean defines if uploaded files should set the show_in_stream flag, this has only effect if the underlying action does support the showInStream request parameter */ public $hideInStream = false; /** * This flag can be used in order to only allow a single guid to be submitted. * Note that already attached files have to be removed manually. * @var boolean */ public $single = false; /** * Sets the multiple flag of the file input * @var bool */ public $multiple = true; /** * @var bool defines if the file should be attached to the given §model right after upload, note this only works for * already existing models */ public $attach = true; public function init() { parent::init(); if(!$this->submitName) { $this->submitName = ($this->model && $this->attribute) ? $this->model->formName() . '[' . $this->attribute . ']' : self::DEFAULT_FORM_NAME; if(!$this->single) { $this->submitName .= '[]'; } } } /** * Draws the Upload Button output. */ public function run() { $result = Html::input('file', $this->name, null, $this->getOptions()); if($this->postState) { foreach (static::getSubmittedFiles($this->model, $this->attribute, $this->submitName) as $file) { $result .= Html::hiddenInput($this->submitName, $file->guid); } } return $result; } /** * Returns submitted files for the given settings, either bei fetching them directly from the * request in case of form-name based uploads or from the model in case of model based uploads. * * @param $model Model * @param $attribute string * @param $submitName string * @return array * @since 1.3.5 */ public static function getSubmittedFiles($model, $attribute, $submitName) { $files = []; if($model && $attribute) { $files = Html::getAttributeValue($model, $attribute); } else if($submitName) { $postSubmit = $submitName; if(static::endsWith('[]', $postSubmit)) { $postSubmit = substr($postSubmit, 0, -2); } $files = Yii::$app->request->post($postSubmit); } if(!$files) { return []; } if(!is_array($files)) { $files = [$files]; } $result = []; foreach ($files as $file) { $result[] = is_string($file) ? File::findOne(['guid' => $file]) : $file; } return $result; } private static function endsWith($needle, $haystack) { return substr($haystack, -strlen($needle)) === $needle; } public function getAttributes() { return [ 'multiple' => ($this->multiple) ? 'multiple' : null, 'title' => Yii::t('base', 'Upload file') ]; } public function getData() { $formSelector = ($this->form instanceof \yii\widgets\ActiveForm) ? '#' + $this->form->getId() : $this->form; $result = [ 'upload-url' => $this->url, 'upload-progress' => $this->progress, 'upload-preview' => $this->preview, 'upload-form' => $formSelector, 'upload-single' => $this->single, 'upload-submit-name' => $this->submitName, ]; if($this->hideInStream) { $result['upload-hide-in-stream'] = 1; } if($this->dropZone) { $result['upload-drop-zone'] = $this->dropZone; } if($this->pasteZone) { $result['upload-paste-zone'] = $this->pasteZone; } if($this->hideInStream) { $result['upload-hide-in-stream'] = '1'; } if ($this->model instanceof \yii\db\ActiveRecord && $this->attach) { $result['upload-model'] = $this->model->className(); $result['upload-model-id'] = $this->model->getPrimaryKey(); } $result['php-max-file-uploads'] = ini_get('max_file_uploads'); $result['php-max-file-uploads-message'] = Yii::t('FileModule.base', 'Sorry, you can only upload up to {n,plural,=1{# file} other{# files}} at once.', ['n' => $result['php-max-file-uploads']]); if ($this->max) { $result['max-number-of-files'] = $this->max; $result['max-number-of-files-message'] = Yii::t('FileModule.base', 'This upload field only allows a maximum of {n,plural,=1{# file} other{# files}}.', ['n' => $this->max]); } return $result; } }