You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
7.8 KiB
272 lines
7.8 KiB
<?php
|
|
/* For licensing terms, see /license.txt */
|
|
|
|
namespace Chamilo\CoreBundle\Component\DataFilesystem;
|
|
|
|
use Symfony\Component\Finder\Finder;
|
|
use Symfony\Component\Finder\SplFileInfo;
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
use Symfony\Component\Console;
|
|
use Sunra\PhpSimple\HtmlDomParser;
|
|
use Chamilo\CoreBundle\Component\Editor\Connector;
|
|
use Chamilo\CoreBundle\Component\Editor\Driver\CourseDriver;
|
|
use Application\Sonata\UserBundle\Entity\User;
|
|
use MediaAlchemyst\Alchemyst;
|
|
use Unoconv\Unoconv;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
|
|
/**
|
|
* @todo use Gaufrette to manage course files (some day)
|
|
* @todo add security restrictions.
|
|
* Class DataFilesystem
|
|
* @package Chamilo\CoreBundle\Component\DataFilesystem
|
|
*/
|
|
class DataFilesystem
|
|
{
|
|
/** @var array Chamilo paths */
|
|
private $paths;
|
|
|
|
/** @var Filesystem */
|
|
private $fs;
|
|
private $connector;
|
|
private $converter;
|
|
|
|
/**
|
|
* @param array $paths
|
|
* @param Filesystem $filesystem
|
|
* @param Connector $connector
|
|
* @param Alchemyst $converter
|
|
*/
|
|
public function __construct(
|
|
$paths,
|
|
Filesystem $filesystem,
|
|
Connector $connector,
|
|
$converter = null
|
|
) {
|
|
$this->paths = $paths;
|
|
$this->fs = $filesystem;
|
|
$this->converter = $converter;
|
|
$this->connector = $connector;
|
|
$this->connector->setDriver('CourseDriver');
|
|
}
|
|
|
|
/**
|
|
* Gets a file from the "data" folder
|
|
* @param string $file
|
|
* @return SplFileInfo
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function get($file)
|
|
{
|
|
$file = new SplFileInfo($this->paths['sys_data_path'].$file, null, null);
|
|
if ($this->fs->exists($file)) {
|
|
return $file;
|
|
} else {
|
|
throw new \InvalidArgumentException(
|
|
sprintf(
|
|
'The file "%s" does not exists .',
|
|
$file
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets a file from the data/courses/MATHS/document directory
|
|
* @param $courseCode
|
|
* @param $file
|
|
* @return SplFileInfo
|
|
*/
|
|
public function getCourseDocument($courseCode, $file)
|
|
{
|
|
$file = 'courses/'.$courseCode.'/document/'.$file;
|
|
return $this->get($file);
|
|
}
|
|
|
|
/**
|
|
* Gets a file from the data/courses/MATHS/scorm directory
|
|
* @param $courseCode
|
|
* @param $file
|
|
* @return SplFileInfo
|
|
*/
|
|
public function getCourseScormDocument($courseCode, $file)
|
|
{
|
|
$file = 'courses/'.$courseCode.'/scorm/'.$file;
|
|
return $this->get($file);
|
|
}
|
|
|
|
/**
|
|
* Gets a file from the data/courses/MATHS/document directory
|
|
* @param $courseCode
|
|
* @param $file
|
|
* @return SplFileInfo
|
|
*/
|
|
public function getCourseUploadFile($courseCode, $file)
|
|
{
|
|
$file = 'courses/'.$courseCode.'/upload/'.$file;
|
|
return $this->get($file);
|
|
}
|
|
|
|
/**
|
|
* Create folders
|
|
* @param array $folderList
|
|
* @param OutputInterface $output
|
|
* @param string permissions
|
|
*/
|
|
public function createFolders(
|
|
array $folderList,
|
|
OutputInterface $output = null,
|
|
$folderPermissions = null
|
|
) {
|
|
if (empty($folderPermissions)) {
|
|
$folderPermissions = api_get_permissions_for_new_directories();
|
|
}
|
|
|
|
if (!empty($folderList)) {
|
|
foreach ($folderList as $folder) {
|
|
if (!is_dir($folder)) {
|
|
$this->fs->mkdir($folder, $folderPermissions);
|
|
if ($output) {
|
|
$output->writeln("Folder <comment>'$folder'</comment> created");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param array $folderList
|
|
* @param OutputInterface $output
|
|
*/
|
|
public function copyFolders(array $folderList, OutputInterface $output = null)
|
|
{
|
|
if (!empty($folderList)) {
|
|
foreach ($folderList as $folderSource => $folderDestination) {
|
|
$this->fs->mirror($folderSource, $folderDestination);
|
|
$finder = new Finder();
|
|
$files = $finder->files()->in($folderDestination);
|
|
$this->fs->chmod($files, api_get_permissions_for_new_directories());
|
|
if ($output) {
|
|
$output->writeln("Contents were copied from <comment>$folderSource</comment> to <comment>$folderDestination</comment>");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return Finder
|
|
*/
|
|
public function getStyleSheetFolders()
|
|
{
|
|
$finder = new Finder();
|
|
$styleSheetFolder = $this->paths['root_sys'].'main/css';
|
|
return $finder->directories()->depth('== 0')->in($styleSheetFolder);
|
|
}
|
|
|
|
/**
|
|
* Creates a empty file inside the temp folder
|
|
* @param string $fileName
|
|
* @param string $extension
|
|
* @return string
|
|
*/
|
|
public function createTempFile($fileName = null, $extension = null)
|
|
{
|
|
if (empty($fileName)) {
|
|
$fileName = mt_rand();
|
|
}
|
|
if (!empty($extension)) {
|
|
$extension = ".$extension";
|
|
}
|
|
$filePath = $this->paths['path.temp'].$fileName.$extension;
|
|
$this->fs->touch($filePath);
|
|
if ($this->fs->exists($filePath)) {
|
|
return $filePath;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Converts ../courses/ABC/document/file.jpg to
|
|
* http://chamilo/courses/ABC/document/file.jpg
|
|
* @param string $content
|
|
* @return string
|
|
*/
|
|
public function convertRelativeToAbsoluteUrl($content)
|
|
{
|
|
/** @var CourseDriver $courseDriver */
|
|
$courseDriver = $this->connector->getDriver('CourseDriver');
|
|
|
|
$dom = HtmlDomParser::str_get_html($content);
|
|
/** @var \simple_html_dom_node $image */
|
|
foreach ($dom->find('img') as $image) {
|
|
$image->src = str_replace(
|
|
$courseDriver->getCourseDocumentRelativeWebPath(),
|
|
$courseDriver->getCourseDocumentWebPath(),
|
|
$image->src
|
|
);
|
|
}
|
|
return $dom;
|
|
}
|
|
|
|
/**
|
|
* Save string in a temp file.
|
|
*
|
|
* @param string $content
|
|
* @param string $fileName
|
|
* @param string $extension
|
|
*
|
|
* @return string file path
|
|
*/
|
|
public function putContentInTempFile($content, $filename = null, $extension = null)
|
|
{
|
|
$file = $this->createTempFile($filename, $extension);
|
|
if (!empty($file)) {
|
|
$this->fs->dumpFile($file, $content);
|
|
return $file;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* @param string $filePath
|
|
* @param string $format
|
|
* @return string
|
|
*/
|
|
public function transcode($filePath, $format)
|
|
{
|
|
if ($this->fs->exists($filePath)) {
|
|
$fileInfo = pathinfo($filePath);
|
|
$fileName = $fileInfo['filename'];
|
|
$newFilePath = str_replace(
|
|
$fileInfo['basename'],
|
|
$fileName.'.'.$format, $filePath
|
|
);
|
|
/** @var \MediaAlchemyst\DriversContainer $drivers */
|
|
$drivers = $this->converter->getDrivers();
|
|
$unoconv = $drivers['unoconv'];
|
|
/** @var Unoconv $unoconv */
|
|
//$drivers = $this->converter->turnInto($filePath, $newFilePath);
|
|
$unoconv->transcode($filePath, $format, $newFilePath);
|
|
if ($this->fs->exists($newFilePath)) {
|
|
return $newFilePath;
|
|
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Creates the users/upload/X/my_files folder
|
|
* @param User $user
|
|
*/
|
|
public function createMyFilesFolder(User $user)
|
|
{
|
|
$userId = $user->getUserId();
|
|
$path = \UserManager::get_user_picture_path_by_id($userId, 'system');
|
|
|
|
if (!$this->fs->exists($path['dir'].'my_files')) {
|
|
$this->createFolders(array($path['dir'].'my_files'));
|
|
}
|
|
}
|
|
|
|
}
|
|
|