Fix course picture, now saving the file using resources.

pull/3064/head
Julio Montoya 6 years ago
parent 4c0f287ace
commit 5e20273d05
  1. 5
      .htaccess
  2. 2
      config/packages/oneup_flysystem.yaml
  3. 2
      config/packages/vich_uploader.yaml
  4. 4
      config/services.yaml
  5. 1
      main/auth/courses_categories.php
  6. 11
      main/course_info/infocours.php
  7. 8
      main/create_course/add_course.php
  8. 2
      main/inc/lib/api.lib.php
  9. 1
      main/inc/lib/formvalidator/FormValidator.class.php
  10. 11
      main/inc/lib/pear/HTML/QuickForm/file.php
  11. 158
      src/CoreBundle/Controller/ResourceController.php
  12. 1
      src/CoreBundle/Entity/Resource/ResourceFile.php
  13. 2
      src/CoreBundle/Resources/config/services.yml
  14. 2
      src/CourseBundle/Entity/CDocument.php

@ -41,11 +41,6 @@ RewriteRule ^courses/([^/]+)/upload/([^/]+)/(.*)$ main/document/download_uploade
# Rewrite everything in the work folder
RewriteRule ^courses/([^/]+)/work/(.*)$ main/work/download.php?file=work/$2&cDir=$1 [QSA,L]
#RewriteRule ^courses/([^/]+)/course-pic85x85.png$ main/inc/ajax/course.ajax.php?a=get_course_image&code=$1&image=course_image_source [QSA,L]
#RewriteRule ^courses/([^/]+)/course-pic.png$ main/inc/ajax/course.ajax.php?a=get_course_image&code=$1&image=course_image_large_source [QSA,L]
RewriteRule ^courses/([^/]+)/course-pic85x85.png$ var/courses/$1/course-pic85x85.png [QSA,L]
RewriteRule ^courses/([^/]+)/course-pic.png$ var/courses/$1/course-pic.png [QSA,L]
# Redirect all courses/ to app/courses/
RewriteRule ^courses/([^/]+)/(.*)$ app/courses/$1/$2 [QSA,L]

@ -14,4 +14,4 @@ oneup_flysystem:
cache_resources:
adapter: resource_cache_adapter
mount: cache_resources_fs
visibility: private
visibility: private

@ -12,4 +12,4 @@ vich_uploader:
options: {chars_per_dir: 1, dirs: 3}
inject_on_load: true
delete_on_update: true
delete_on_remove: true
delete_on_remove: true

@ -27,6 +27,9 @@ parameters:
#cache: 'var/cache/resource/'
glide_media_filters:
course_picture:
w: 400
h: 225
document_thumbnail_small:
w: 500
@ -176,4 +179,3 @@ imports:
# arguments:
# - "%kernel.root_dir%/../doclib/uploads"
# - true

@ -10,7 +10,6 @@ use Chamilo\CoreBundle\Framework\Container;
*
* @package chamilo.auth
*/
if (isset($_REQUEST['action']) && Security::remove_XSS($_REQUEST['action']) !== 'subscribe') {
$stok = Security::get_token();
} else {

@ -86,15 +86,12 @@ function card_settings_close()
$form->addHtml(card_settings_open('course_settings', get_lang('Course settings'), true, 'settings.png', 'accordionSettings'));
$image = '';
// Display course picture
$course_path = api_get_path(SYS_COURSE_PATH).$currentCourseRepository; // course path
$illustration = $courseEntity->getResourceNodeIllustration();
if (!empty($illustration)) {
$course_medium_image = Container::getRouter()->generate(
'core_tool_resource',
['id' => $illustration->getId()]
);
'core_tool_resource',
['id' => $illustration->getId(), 'filter' => 'course_picture']
);
$image = '<div class="row"><label class="col-md-2 control-label">'.get_lang('Image').'</label>
<div class="col-md-8"><img class="img-thumbnail" src="'.$course_medium_image.'" /></div></div>';
}
@ -964,7 +961,7 @@ if ($form->validate() && $isEditable) {
$repo->addResourceNode($illustration, api_get_user_entity(api_get_user_id()), $courseEntity);
$file = $repo->addFileToResource($illustration, $uploadFile);
if ($file) {
$file->setCrop($updateValues['picture_crop_result']);
$file->setCrop($updateValues['picture_crop_result_for_resource']);
$em->persist($file);
$em->persist($illustration);
$em->flush();

@ -347,7 +347,6 @@ if ($form->validate()) {
if (file_exists($file_to_include)) {
include $file_to_include;
}*/
$course_info = CourseManager::create_course($params);
if (!empty($course_info)) {
@ -363,7 +362,7 @@ if ($form->validate()) {
$illustration = new \Chamilo\CoreBundle\Entity\Illustration();
$repo->addResourceNode($illustration, api_get_user_entity(api_get_user_id()), $course);
$file = $repo->addFileToResource($illustration, $uploadFile);
$file->setCrop($course_values['picture_crop_result']);
$file->setCrop($course_values['picture_crop_result_for_resource']);
$em->persist($file);
$em->persist($illustration);
$em->flush();
@ -371,7 +370,10 @@ if ($form->validate()) {
$splash = api_get_setting('course_creation_splash_screen');
if ($splash === 'true') {
$url = Container::getRouter()->generate('chamilo_core_course_welcome', ['course' =>$course_info['code']]);
$url = Container::getRouter()->generate(
'chamilo_core_course_welcome',
['course' => $course_info['code']]
);
header('Location: '.$url);
exit;
} else {

@ -8753,6 +8753,7 @@ function api_format_time($time, $originFormat = 'php')
*
* @param string $name The new directory name
* @param string $parentDirectory Directory parent directory name
*
* @deprecated use Resources
*
* @return bool Return true if the directory was create. Otherwise return false
@ -9107,6 +9108,7 @@ function api_is_student_view_active()
* @param array $file
* @param int $itemId
* @param string $cropParameters
*
* @deprecated use Resources
*
* @return array|bool

@ -958,6 +958,7 @@ EOT;
</div>'
);
$this->addHidden($id.'_crop_result', '');
$this->addHidden($id.'_crop_result_for_resource', '');
$this->addHidden($id.'_crop_image_base_64', '');
}
} catch (HTML_Quick | Form_Error $e) {

@ -267,6 +267,7 @@ class HTML_QuickForm_file extends HTML_QuickForm_input
var $inputFile = $(\'#'.$id.'\'),
$image = $(\'#'.$id.'_preview_image\'),
$input = $(\'[name="'.$id.'_crop_result"]\'),
$inputForResource = $(\'[name="'.$id.'_crop_result_for_resource"]\'),
$cropButton = $(\'#'.$id.'_crop_button\'),
$formGroup = $(\'#'.$id.'-form-group\');
@ -300,7 +301,10 @@ class HTML_QuickForm_file extends HTML_QuickForm_input
scalable: '.$scalable.',
crop: function(e) {
// Output the result data for cropping image.
$input.val(event.detail.x + \',\' + event.detail.y + \',\' + event.detail.width + \',\' + event.detail.height);
$input.val(event.detail.x + \',\' + event.detail.y + \',\' + event.detail.width + \',\' + event.detail.height);
$inputForResource.val(
parseInt(event.detail.width) + \',\' + parseInt(event.detail.height) + \',\' + parseInt(event.detail.x) + \',\' + parseInt(event.detail.y)
);
}
});
}
@ -308,12 +312,9 @@ class HTML_QuickForm_file extends HTML_QuickForm_input
$inputFile.on(\'change\', function () {
var inputFile = this,
file = inputFile.files[0],
fileReader = new FileReader();
fileReader = new FileReader();
$(".img-box").hide();
$(".img-preview").show();
if (!isValidType(file)) {
$formGroup.hide();
$cropButton.hide();

@ -12,17 +12,17 @@ use APY\DataGridBundle\Grid\Source\Entity;
use Chamilo\CoreBundle\Component\Utils\Glide;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Entity\Resource\ResourceRight;
use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
use Chamilo\CourseBundle\Controller\CourseControllerTrait;
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Repository\CDocumentRepository;
use Doctrine\ORM\EntityManager;
use FOS\RestBundle\View\View;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Sylius\Component\Resource\Exception\UpdateHandlingException;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
@ -154,7 +154,7 @@ class ResourceController extends BaseController implements CourseControllerInter
* @param Request $request
* @param string $fileType
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response|null
* @return RedirectResponse|Response|null
*/
public function createResource(Request $request, $fileType = 'file')
{
@ -409,90 +409,15 @@ class ResourceController extends BaseController implements CourseControllerInter
public function getResourceFileAction(Request $request, Glide $glide): Response
{
$id = $request->get('id');
$filter = $request->get('filter');
$em = $this->getDoctrine();
$resourceNode = $em->getRepository('ChamiloCoreBundle:Resource\ResourceNode')->find($id);
return $this->showFile($resourceNode, $glide, 'show', '');
/*
$fs = $documentRepo->getFileSystem();
$stream = $fs->readStream($filePath);
$response = new StreamedResponse(function () use ($stream): void {
stream_copy_to_stream($stream, fopen('php://output', 'wb'));
});
$disposition = $response->headers->makeDisposition(
$forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
Transliterator::transliterate($fileName)
);
$response->headers->set('Content-Disposition', $disposition);
$response->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
return $response;*/
}
/**
* @param ResourceNode $resourceNode
* @param $glide
* @param $type
* @param $filter
*
* @return StreamedResponse
* @throws \League\Flysystem\FileNotFoundException
*/
private function showFile(ResourceNode $resourceNode, Glide $glide, $type, $filter)
{
$fs = $this-> container->get('oneup_flysystem.resources_filesystem');
$this->denyAccessUnlessGranted(
ResourceNodeVoter::VIEW,
$resourceNode,
'Unauthorised access to resource'
);
$resourceFile = $resourceNode->getResourceFile();
if (!$resourceFile) {
throw new NotFoundHttpException();
if ($resourceNode === null) {
throw new FileNotFoundException('Not found');
}
$fileName = $resourceNode->getName();
$filePath = $resourceFile->getFile()->getPathname();
$mimeType = $resourceFile->getMimeType();
switch ($type) {
case 'download':
$forceDownload = true;
break;
case 'show':
default:
$forceDownload = false;
// See filter definition
if (!empty($filter)) {
$server = $glide->getServer();
$filter = $glide->getFilters()[$filter] ?? [];
$crop = $resourceFile->getCrop();
if (!empty($filter)) {
$filter['crop'] = $crop;
}
return $server->getImageResponse($filePath, $filter);
}
break;
}
$stream = $fs->readStream($filePath);
$response = new StreamedResponse(function () use ($stream): void {
stream_copy_to_stream($stream, fopen('php://output', 'wb'));
});
$disposition = $response->headers->makeDisposition(
$forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
Transliterator::transliterate($fileName)
);
$response->headers->set('Content-Disposition', $disposition);
$response->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
return $response;
return $this->showFile($request, $resourceNode, $glide, 'show', $filter);
}
/**
@ -526,7 +451,7 @@ class ResourceController extends BaseController implements CourseControllerInter
/** @var ResourceNode $resourceNode */
$resourceNode = $document->getResourceNode();
return $this->showFile($resourceNode, $glide, $type, $filter);
return $this->showFile($request, $resourceNode, $glide, $type, $filter);
}
/**
@ -624,4 +549,71 @@ class ResourceController extends BaseController implements CourseControllerInter
return $this->viewHandler->handle($configuration, $view);
}
/**
* @param Request $request
* @param ResourceNode $resourceNode
* @param Glide $glide
* @param $type
* @param string $filter
*
* @return mixed|StreamedResponse
* @throws \League\Flysystem\FileNotFoundException
*/
private function showFile(Request $request, ResourceNode $resourceNode, Glide $glide, $type, $filter = '')
{
$fs = $this->container->get('oneup_flysystem.resources_filesystem');
$this->denyAccessUnlessGranted(
ResourceNodeVoter::VIEW,
$resourceNode,
'Unauthorised access to resource'
);
$resourceFile = $resourceNode->getResourceFile();
if (!$resourceFile) {
throw new NotFoundHttpException();
}
$fileName = $resourceNode->getName();
$filePath = $resourceFile->getFile()->getPathname();
$mimeType = $resourceFile->getMimeType();
switch ($type) {
case 'download':
$forceDownload = true;
break;
case 'show':
default:
$forceDownload = false;
$server = $glide->getServer();
$params = $request->query->all();
// The filter overwrites the params from get
if (!empty($filter)) {
$params = $glide->getFilters()[$filter] ?? [];
}
// The image was cropped by the user, so we force to render this version, no matter other parameters.
$crop = $resourceFile->getCrop();
if (!empty($crop)) {
$params['crop'] = $crop;
}
return $server->getImageResponse($filePath, $params);
break;
}
$stream = $fs->readStream($filePath);
$response = new StreamedResponse(function () use ($stream): void {
stream_copy_to_stream($stream, fopen('php://output', 'wb'));
});
$disposition = $response->headers->makeDisposition(
$forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
Transliterator::transliterate($fileName)
);
$response->headers->set('Content-Disposition', $disposition);
$response->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
return $response;
}
}

@ -225,7 +225,6 @@ class ResourceFile
return $this;
}
/**
* @return string
*/

@ -1,8 +1,6 @@
# Settings parameters that will be used in the 'services' section
parameters:
chamilo_core.entity.course: Chamilo\CoreBundle\Entity\Course
chamilo_core.entity.manager.session_manager.class: Chamilo\CoreBundle\Entity\Manager\SessionManager
chamilo_core.entity.session: Chamilo\CoreBundle\Entity\Session

@ -225,7 +225,7 @@ class CDocument extends AbstractResource implements ResourceInterface
*/
public function setSize(int $size)
{
$this->size = $size ?: 0;
$this->size = $size ?: 0;
return $this;
}

Loading…
Cancel
Save