/** * (non-PHPdoc) * @see tao_helpers_form_FormContainer::initElements() */ public function initElements() { /* $descElt = tao_helpers_form_FormFactory::getElement('qtitest_desc', 'Label'); $descElt->setValue(__('A qti testpackage')); $this->form->addElement($descElt); */ //create file upload form box $fileElt = tao_helpers_form_FormFactory::getElement('source', 'AsyncFile'); $fileElt->setDescription(__("Add the source file")); if (isset($_POST['import_sent_xhtml'])) { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); } else { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty', array('message' => ''))); } $fileElt->addValidators(array(tao_helpers_form_FormFactory::getValidator('FileMimeType', array('mimetype' => array('application/zip', 'application/x-zip', 'application/x-zip-compressed', 'application/octet-stream'), 'extension' => array('zip'))), tao_helpers_form_FormFactory::getValidator('FileSize', array('max' => tao_helpers_Environment::getFileUploadLimit())))); $this->form->addElement($fileElt); $this->form->createGroup('file', __('Upload a QTI 2.1 Test Package File'), array('source')); $element = tao_helpers_form_FormFactory::getElement('uri', 'Hidden'); //$element->setValue(); $this->getForm()->addElement($element); $xhtmlSentElt = tao_helpers_form_FormFactory::getElement('import_sent_qtitest', 'Hidden'); $xhtmlSentElt->setValue(1); $this->form->addElement($xhtmlSentElt); }
/** * overriden * * @access public * @author Joel Bout, <*****@*****.**> * @return mixed */ public function initElements() { //create file upload form box $fileElt = tao_helpers_form_FormFactory::getElement('source', 'AsyncFile'); $fileElt->setDescription(__("Add an RDF/XML file")); if (isset($_POST['import_sent_rdf'])) { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); } else { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty', array('message' => ''))); } $fileElt->addValidators(array(tao_helpers_form_FormFactory::getValidator('FileMimeType', array('mimetype' => array('text/xml', 'application/rdf+xml', 'application/xml'), 'extension' => array('rdf', 'rdfs'))), tao_helpers_form_FormFactory::getValidator('FileSize', array('max' => tao_helpers_Environment::getFileUploadLimit())))); $this->form->addElement($fileElt); $this->form->createGroup('file', __('Import Metadata from RDF file'), array('rdf_desc', 'source')); $rdfSentElt = tao_helpers_form_FormFactory::getElement('import_sent_rdf', 'Hidden'); $rdfSentElt->setValue(1); $this->form->addElement($rdfSentElt); }
/** * overriden * * @access public * @author Joel Bout, <*****@*****.**> * @return mixed */ public function initElements() { //create file upload form box $fileElt = tao_helpers_form_FormFactory::getElement('source', 'AsyncFile'); $fileElt->setDescription(__("Add a CSV file")); if (isset($_POST['import_sent_csv'])) { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); } else { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty', array('message' => ''))); } $fileElt->addValidators(array(tao_helpers_form_FormFactory::getValidator('FileMimeType', array('mimetype' => array('text/plain', 'text/csv', 'text/comma-separated-values', 'application/csv', 'application/csv-tab-delimited-table'), 'extension' => array('csv', 'txt'))), tao_helpers_form_FormFactory::getValidator('FileSize', array('max' => tao_helpers_Environment::getFileUploadLimit())))); $this->form->addElement($fileElt); $this->form->createGroup('file', __('Import Metadata from CSV file'), array('csv_desc', 'source')); $csvSentElt = tao_helpers_form_FormFactory::getElement('import_sent_csv', 'Hidden'); $csvSentElt->setValue(1); $this->form->addElement($csvSentElt); // options $optDelimiter = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::FIELD_DELIMITER, 'Textbox'); $optDelimiter->setDescription(__("Field delimiter")); $optDelimiter->setValue(';'); $optDelimiter->addAttribute("size", 6); $optDelimiter->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); $this->form->addElement($optDelimiter); $optEncloser = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::FIELD_ENCLOSER, 'Textbox'); $optEncloser->setDescription(__("Field encloser")); $optEncloser->setValue('"'); $optEncloser->addAttribute("size", 6); $optEncloser->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); $this->form->addElement($optEncloser); /* $optMulti = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::MULTI_VALUES_DELIMITER, 'Textbox'); $optMulti->setDescription(__("Multiple values delimiter")); $optMulti->setValue('|'); $optMulti->addAttribute("size", 6); $optMulti->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); $this->form->addElement($optMulti); */ $optFirstColumn = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES, 'Checkbox'); $optFirstColumn->setDescription(__("First row column names")); $optFirstColumn->setOptions(array(tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES => '')); $optFirstColumn->setValue(tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES); $this->form->addElement($optFirstColumn); $this->form->createGroup('options', __('CSV Options'), array($optDelimiter, $optEncloser, $optFirstColumn)); }
/** * overriden * * @access public * @author Joel Bout, <*****@*****.**> * @return mixed */ public function initElements() { $descElt = tao_helpers_form_FormFactory::getElement('rdf_desc', 'Label'); $descElt->setValue(__('Please upload a published delivery assembly .')); $this->form->addElement($descElt); //create file upload form box $fileElt = tao_helpers_form_FormFactory::getElement('source', 'AsyncFile'); $fileElt->setDescription(__("Add the source file.")); if (isset($_POST['import_sent_rdf'])) { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); } else { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty', array('message' => ''))); } $fileElt->addValidators(array(tao_helpers_form_FormFactory::getValidator('FileMimeType', array('mimetype' => array('application/zip', 'application/x-zip', 'application/x-zip-compressed', 'application/octet-stream'), 'extension' => array('zip'))), tao_helpers_form_FormFactory::getValidator('FileSize', array('max' => tao_helpers_Environment::getFileUploadLimit())))); $this->form->addElement($fileElt); $this->form->createGroup('file', __('Upload an assembly'), array('rdf_desc', 'source')); $rdfSentElt = tao_helpers_form_FormFactory::getElement('import_sent_rdf', 'Hidden'); $rdfSentElt->setValue(1); $this->form->addElement($rdfSentElt); }
/** * Used to create the form elements and bind them to the form instance * * @access protected * @return mixed */ protected function initElements() { //create file upload form box $fileElt = \tao_helpers_form_FormFactory::getElement('source', 'AsyncFile'); $fileElt->setDescription(__("Add a media file")); if (isset($_POST['import_sent_file'])) { $fileElt->addValidator(\tao_helpers_form_FormFactory::getValidator('NotEmpty')); } else { $fileElt->addValidator(\tao_helpers_form_FormFactory::getValidator('NotEmpty', array('message' => ''))); } $fileElt->addValidators(array(\tao_helpers_form_FormFactory::getValidator('FileSize', array('max' => \tao_helpers_Environment::getFileUploadLimit())))); $this->form->addElement($fileElt); $langService = \tao_models_classes_LanguageService::singleton(); $dataUsage = new \core_kernel_classes_Resource(INSTANCE_LANGUAGE_USAGE_DATA); $dataLang = \common_session_SessionManager::getSession()->getDataLanguage(); $dataLang = 'http://www.tao.lu/Ontologies/TAO.rdf#Lang' . $dataLang; if (!is_null($this->instanceUri)) { $instance = new \core_kernel_classes_Resource($this->instanceUri); $lang = $instance->getOnePropertyValue(new \core_kernel_classes_Property(MEDIA_LANGUAGE)); if ($lang instanceof \core_kernel_classes_Resource) { $dataLang = $lang->getUri(); } } $langOptions = array(); foreach ($langService->getAvailableLanguagesByUsage($dataUsage) as $lang) { $langOptions[\tao_helpers_Uri::encode($lang->getUri())] = $lang->getLabel(); } $langElt = \tao_helpers_form_FormFactory::getElement('lang', 'Combobox'); $langElt->setValue(\tao_helpers_Uri::encode($dataLang)); $langElt->setOptions($langOptions); $this->form->addElement($langElt); $this->form->createGroup('options', __('Media Options'), array($langElt)); $fileSentElt = \tao_helpers_form_FormFactory::getElement('import_sent_file', 'Hidden'); $fileSentElt->setValue(1); $this->form->addElement($fileSentElt); if (!is_null($this->instanceUri)) { $instanceElt = \tao_helpers_form_FormFactory::getElement('instanceUri', 'Hidden'); $instanceElt->setValue($this->instanceUri); $this->form->addElement($instanceElt); } }
/** * (non-PHPdoc) * @see tao_helpers_form_FormContainer::initElements() */ public function initElements() { //create file upload form box $fileElt = tao_helpers_form_FormFactory::getElement('source', 'AsyncFile'); $fileElt->setDescription(__("Add a zip file containing QTI/APIP tests and items")); if (isset($_POST['import_sent_qti'])) { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty')); } else { $fileElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty', array('message' => ''))); } $fileElt->addValidators(array(tao_helpers_form_FormFactory::getValidator('FileMimeType', array('mimetype' => array('application/zip', 'application/x-zip', 'application/x-zip-compressed', 'application/octet-stream'), 'extension' => array('zip'))), tao_helpers_form_FormFactory::getValidator('FileSize', array('max' => tao_helpers_Environment::getFileUploadLimit())))); $this->form->addElement($fileElt); /* $disableValidationElt = tao_helpers_form_FormFactory::getElement("disable_validation", 'Checkbox'); $disableValidationElt->setDescription(__("Disable validation")); $disableValidationElt->setOptions(array("on" => "")); $this->form->addElement($disableValidationElt); */ $this->form->createGroup('file', __('Import a QTI/APIP Content Package'), array('source')); $qtiSentElt = tao_helpers_form_FormFactory::getElement('import_sent_qti', 'Hidden'); $qtiSentElt->setValue(1); $this->form->addElement($qtiSentElt); }
/** * Get the files data from an HTTP file upload (ie. from the $_FILES) * @author "Bertrand Chevrier <*****@*****.**> * @param string the file field name * @return array the file data * @throws common_exception_Error in case of wrong upload */ public static function getUploadedFile($name) { // for large file, the $_FILES may be empty so see this before checking for other updates $limit = tao_helpers_Environment::getFileUploadLimit(); $contentLength = intval($_SERVER['CONTENT_LENGTH']); if ($limit > 0 && $contentLength > $limit && count(self::getFiles()) === 0) { throw new FileUploadException('Exceeded filesize limit of ' . tao_helpers_Environment::getFileUploadLimit()); } $files = self::getFiles(); $fileData = $files[$name]; if (isset($files[$name])) { //check for upload errors if (isset($fileData['error']) && $fileData['error'] != UPLOAD_ERR_OK) { switch ($fileData['error']) { case UPLOAD_ERR_NO_FILE: throw new FileUploadException('No file sent.'); case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new FileUploadException('Exceeded filesize limit of ' . tao_helpers_Environment::getFileUploadLimit()); default: throw new common_exception_Error('Upload fails, check errors'); } } } if (!is_uploaded_file($fileData['tmp_name'])) { throw new common_exception_Error('Non uploaded file in filedata, potential attack'); } return $fileData; }
/** * Short description of method render * * @access public * @author Joel Bout, <*****@*****.**> * @return string */ public function render() { $widgetName = 'Uploader_' . md5($this->name); $returnValue = $this->renderLabel(); $returnValue .= "<input type='hidden' name='{$this->name}' id='{$this->name}' value='' />"; $returnValue .= "<div id='{$widgetName}_container' class='form-elt-container file-uploader'>"; // get the upload max size $fileSize = tao_helpers_Environment::getFileUploadLimit(); $mimetypes = array(); // add a client validation foreach ($this->validators as $validator) { // get the valid file extensions if ($validator instanceof tao_helpers_form_validators_FileMimeType) { $options = $validator->getOptions(); if (isset($options['mimetype'])) { $mimetypes = $options['mimetype']; } } // get the max file size if ($validator instanceof tao_helpers_form_validators_FileSize) { $options = $validator->getOptions(); if (isset($options['max'])) { $validatorMax = (int) $options['max']; if ($validatorMax > 0 && $validatorMax < $fileSize) { $fileSize = $validatorMax; } } } } // default value for 'auto' is 'true': $auto = 'true'; if (isset($this->attributes['auto'])) { if (!$this->attributes['auto'] || $this->attributes['auto'] === 'false') { $auto = 'false'; } unset($this->attributes['auto']); } // initialize the Uploader Js component $returnValue .= '<script type="text/javascript"> require([\'jquery\', \'ui/feedback\', \'ui/uploader\'], function($, feedback){ $("#' . $widgetName . '_container").uploader({ uploadUrl: "' . ROOT_URL . 'tao/File/upload", inputName: "' . $widgetName . '", autoUpload: "' . $auto . '" , showResetButton: "' . !$auto . '" , showUploadButton: "' . !$auto . '" , fileSelect : function(files, done){ var error = [], files = files.filter(_.isObject),// due to Chrome drag\'n\'drop issue givenLength = files.length, filters = "' . implode(',', $mimetypes) . '".split(",").filter(function(e){return e.length}); if (filters.length){ files = _.filter(files, function(file){ return !file.type || _.contains(filters, file.type.replace(/[\'"]+/g, \'\'));//IE9 doesnt detect type, so lets rely on server validation }); if(files.length !== givenLength){ error.push( "Unauthorized files have been removed"); } } files = _.filter(files, function(file){ return file.size <= ' . $fileSize . '; }); if(files.length !== givenLength && !error.length){ error.push( "Size limit is ' . $fileSize . ' bytes"); } if (error.length){ feedback().error(error.join(",")); } done(files); if ( ' . $auto . ' ){ $(this).uploader("upload"); } } }).on("upload.uploader", function(e, file, result){ if ( result && result.uploaded ){ $("input[name=\'' . $this->getName() . '\']").val(result.data); } }) }); </script>'; $returnValue .= "</div>"; return (string) $returnValue; }
/** * Produce a simple view use to display a file upload form in a popup */ public function htmlUpload() { if ($this->hasRequestParameter('sizeLimit')) { $this->setData('sizeLimit', (int) $this->getRequestParameter('sizeLimit')); } else { $this->setData('sizeLimit', tao_helpers_Environment::getFileUploadLimit()); } if ($this->hasRequestParameter('target')) { $this->setData('target', $this->getRequestParameter('target')); } else { $this->setData('target', "#source"); } $this->setData('accept', '*'); if ($this->hasRequestParameter('fileExt')) { $accept = ''; foreach (explode(',', $this->getRequestParameter('fileExt')) as $fileExt) { $accept .= tao_helpers_File::getMimeType(str_replace('*', 'file', $fileExt)); } $this->setData('accept', $accept); } $response = array('uploaded' => false, 'data' => '', 'name' => '', 'uploaded_file' => ''); if (isset($_FILES) && isset($_POST['upload_sent'])) { if (isset($_FILES['Filedata'])) { $response = array_merge($response, $this->uploadFile($_FILES['Filedata'], '/')); } } $setLinear = true; if ($this->hasRequestParameter('format')) { if ($this->getRequestParameter('format') != 'linear') { $setLinear = false; } } $this->setData('setLinear', $setLinear); $this->setData('uploaded', $response['uploaded'] === true); $this->setData('uploadData', $response['data']); $this->setData('uploadFile', $response['name']); $this->setData('uploadFilePath', $response['uploaded_file']); $this->setView('form/html_upload.tpl'); }
/** * It is sometimes necessary to identify the link between assessmentItemRefs described in a QTI Test definition and the resources * describing items in IMS Manifest file. This utility method helps you to achieve this. * * The method will return an array describing the IMS Manifest resources that were found in an IMS Manifest file on basis of * the assessmentItemRefs found in an AssessmentTest definition. The keys of the arrays are assessmentItemRef identifiers and * values are IMS Manifest Resources. * * If an IMS Manifest Resource cannot be found for a given assessmentItemRef, the value in the returned array will be false. * * @param XmlDocument $test A QTI Test Definition. * @param taoQtiTest_models_classes_ManifestParser $manifestParser A Manifest Parser. * @param string $basePath The base path of the folder the IMS archive is exposed as a file system component. * @return array An array containing two arrays (items and dependencies) where keys are identifiers and values are oat\taoQtiItem\model\qti\Resource objects or false. */ public static function buildAssessmentItemRefsTestMap(XmlDocument $test, taoQtiTest_models_classes_ManifestParser $manifestParser, $basePath) { $assessmentItemRefs = $test->getDocumentComponent()->getComponentsByClassName('assessmentItemRef'); $map = array('items' => array(), 'dependencies' => array()); $itemResources = $manifestParser->getResources(array('imsqti_item_xmlv2p1', 'imsqti_apipitem_xmlv2p1'), taoQtiTest_models_classes_ManifestParser::FILTER_RESOURCE_TYPE); $allResources = $manifestParser->getResources(); // cleanup $basePath. $basePath = rtrim($basePath, "/\\"); $basePath = helpers_File::truePath($basePath); $basePath .= DIRECTORY_SEPARATOR; $documentURI = preg_replace('/^file:\\//', '', $test->getDomDocument()->documentURI); $testPathInfo = pathinfo($documentURI); $testBasePath = tao_helpers_File::truePath($testPathInfo['dirname']) . DIRECTORY_SEPARATOR; foreach ($assessmentItemRefs as $itemRef) { // Find the QTI Resource (in IMS Manifest) related to the item ref. // To achieve this, we compare their path. $itemRefRelativeHref = str_replace('/', DIRECTORY_SEPARATOR, $itemRef->getHref()); $itemRefRelativeHref = ltrim($itemRefRelativeHref, "/\\"); $itemRefCanonicalHref = helpers_File::truePath($testBasePath . $itemRefRelativeHref); $map['items'][$itemRef->getIdentifier()] = false; // Compare with items referenced in the manifest. foreach ($itemResources as $itemResource) { $itemResourceRelativeHref = str_replace('/', DIRECTORY_SEPARATOR, $itemResource->getFile()); $itemResourceRelativeHref = ltrim($itemResourceRelativeHref, "/\\"); $itemResourceCanonicalHref = helpers_File::truePath($basePath . $itemResourceRelativeHref); // With some Windows flavours (Win7, Win8), the $itemRefCanonicalHref comes out with // a leading 'file:\' component. Let's clean this. (str_replace is binary-safe \0/) $os = tao_helpers_Environment::getOperatingSystem(); if ($os === 'WINNT' || $os === 'WIN32' || $os === 'Windows') { $itemRefCanonicalHref = str_replace('file:\\', '', $itemRefCanonicalHref); // And moreover, it sometimes refer the temp directory as Windows\TEMP instead of Windows\Temp. $itemRefCanonicalHref = str_replace('\\TEMP\\', '\\Temp\\', $itemRefCanonicalHref); } // With some MacOS flavours, the $itemRefCanonicalHref comes out with // a leading '/private' component. Clean it! if ($os === 'Darwin') { $itemRefCanonicalHref = str_replace('/private', '', $itemRefCanonicalHref); } if ($itemResourceCanonicalHref == $itemRefCanonicalHref && is_file($itemResourceCanonicalHref)) { // assessmentItemRef <-> IMS Manifest resource successful binding! $map['items'][$itemRef->getIdentifier()] = $itemResource; //get dependencies for each item foreach ($itemResource->getDependencies() as $dependencyIdentifier) { /** @var taoQtiTest_models_classes_QtiResource $resource */ foreach ($allResources as $resource) { if ($dependencyIdentifier == $resource->getIdentifier()) { $map['dependencies'][$dependencyIdentifier] = $resource; break; } } } break; } } } return $map; }
/** * Get the files data from an HTTP file upload (ie. from the $_FILES) * @author "Bertrand Chevrier <*****@*****.**> * @param string the file field name * @return array the file data * @throws common_exception_Error in case of wrong upload */ public static function getUploadedFile($name) { $files = self::getFiles(); $fileData = $files[$name]; if (isset($files[$name])) { //check for upload errors if (isset($fileData['error']) && $fileData['error'] != UPLOAD_ERR_OK) { switch ($fileData['error']) { case UPLOAD_ERR_NO_FILE: throw new FileUploadException('No file sent.'); case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new FileUploadException('Exceeded filesize limit of ' . tao_helpers_Environment::getFileUploadLimit()); default: throw new common_exception_Error('Upload fails, check errors'); } } } if (!is_uploaded_file($fileData['tmp_name'])) { throw new common_exception_Error('Non uploaded file in filedata, potential attack'); } return $fileData; }
/** * returns the fileupload limit in either Bytes or MB * default is Bytes * * @author CRP Henri Tudor - TAO Team - {@link http://www.tao.lu} * @param boolean $inMegabytes * @return number */ private function getFileUploadLimit($inMegabytes = false) { $limit = min(tao_helpers_Environment::getFileUploadLimit(), UPLOAD_MAX_SIZE); return $inMegabytes ? round($limit / 1048576, 1) : $limit; }