tao-test/app/taoQtiItem/controller/AbstractPortableElementManager.php

104 lines
3.1 KiB
PHP
Raw Normal View History

2022-08-29 20:14:13 +02:00
<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2014 (original work) Open Assessment Technologies SA;
*
*/
namespace oat\taoQtiItem\controller;
use \core_kernel_classes_Resource;
use oat\tao\model\routing\AnnotationReader\security;
use oat\taoQtiItem\model\CreatorRegistry;
use \tao_actions_CommonModule;
use \common_exception_Error;
use \tao_helpers_File;
use \tao_helpers_Http;
abstract class AbstractPortableElementManager extends tao_actions_CommonModule
{
/**
* @var CreatorRegistry
*/
protected $registry;
/**
* Instanciate the controller
* @security("hide")
*/
public function __construct()
{
$this->registry = $this->getCreatorRegistry();
}
/**
* Return the registry used by this controller
*
* @return CreatorRegistry
*/
abstract protected function getCreatorRegistry();
/**
* Get a file of a custom interaction
*/
public function getFile()
{
if ($this->hasRequestParameter('file')) {
$file = urldecode($this->getRequestParameter('file'));
$filePathTokens = explode('/', $file);
$typeIdentifier = array_shift($filePathTokens);
$relPath = implode(DIRECTORY_SEPARATOR, $filePathTokens);
$this->renderFile($typeIdentifier, $relPath);
}
}
/**
* Get the directory where the implementation sits
*
* @param string $typeIdentifier
* @return string
*/
protected function getImplementationDirectory($typeIdentifier)
{
return $this->registry->getDevImplementationDirectory($typeIdentifier);
}
/**
* Render the file to the browser
*
* @param string $typeIdentifier
* @param string $relPath
* @throws common_exception_Error
*/
private function renderFile($typeIdentifier, $relPath)
{
if (tao_helpers_File::securityCheck($relPath, true)) {
$folder = $this->getImplementationDirectory($typeIdentifier);
$filename = $folder . $relPath;
//@todo : find better way to to this
//load amd module
if (! file_exists($filename) && file_exists($filename . '.js')) {
$filename = $filename . '.js';
}
tao_helpers_Http::returnFile($filename);
} else {
throw new common_exception_Error('invalid item preview file path');
}
}
}