|
|
|
|
@ -7,9 +7,9 @@ use Chamilo\CoreBundle\Entity\Resource\ResourceRight; |
|
|
|
|
use Chamilo\CoreBundle\Framework\Container; |
|
|
|
|
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter; |
|
|
|
|
use Chamilo\CourseBundle\Entity\CDocument; |
|
|
|
|
use Symfony\Component\HttpFoundation\File\UploadedFile; |
|
|
|
|
use Chamilo\UserBundle\Entity\User; |
|
|
|
|
use ChamiloSession as Session; |
|
|
|
|
use Symfony\Component\HttpFoundation\File\UploadedFile; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Class DocumentManager |
|
|
|
|
@ -6407,6 +6407,224 @@ class DocumentManager |
|
|
|
|
return $list; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Adds a new document to the database. |
|
|
|
|
* |
|
|
|
|
* @param array $courseInfo |
|
|
|
|
* @param string $path |
|
|
|
|
* @param string $fileType |
|
|
|
|
* @param int $fileSize |
|
|
|
|
* @param string $title |
|
|
|
|
* @param string $comment |
|
|
|
|
* @param int $readonly |
|
|
|
|
* @param int $visibility see ResourceLink constants |
|
|
|
|
* @param int $group_id group.id |
|
|
|
|
* @param int $sessionId Session ID, if any |
|
|
|
|
* @param int $userId creator user id |
|
|
|
|
* @param bool $sendNotification |
|
|
|
|
* @param string $content |
|
|
|
|
* @param int $parentId |
|
|
|
|
* |
|
|
|
|
* @return CDocument|false |
|
|
|
|
*/ |
|
|
|
|
public static function addDocument( |
|
|
|
|
$courseInfo, |
|
|
|
|
$path, |
|
|
|
|
$fileType, |
|
|
|
|
$fileSize, |
|
|
|
|
$title, |
|
|
|
|
$comment = null, |
|
|
|
|
$readonly = 0, |
|
|
|
|
$visibility = null, |
|
|
|
|
$group_id = 0, |
|
|
|
|
$sessionId = 0, |
|
|
|
|
$userId = 0, |
|
|
|
|
$sendNotification = true, |
|
|
|
|
$content = '', |
|
|
|
|
$parentId = 0 |
|
|
|
|
) { |
|
|
|
|
$userId = empty($userId) ? api_get_user_id() : $userId; |
|
|
|
|
|
|
|
|
|
if (empty($userId)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$userEntity = api_get_user_entity($userId); |
|
|
|
|
if (empty($userEntity)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$courseEntity = api_get_course_entity($courseInfo['real_id']); |
|
|
|
|
|
|
|
|
|
if (empty($courseEntity)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$sessionId = empty($sessionId) ? api_get_session_id() : $sessionId; |
|
|
|
|
$session = api_get_session_entity($sessionId); |
|
|
|
|
$group = api_get_group_entity($group_id); |
|
|
|
|
$readonly = (int) $readonly; |
|
|
|
|
|
|
|
|
|
$em = Database::getManager(); |
|
|
|
|
$documentRepo = $em->getRepository('ChamiloCourseBundle:CDocument'); |
|
|
|
|
|
|
|
|
|
$parentNode = null; |
|
|
|
|
if (!empty($parentId)) { |
|
|
|
|
$parent = $documentRepo->find($parentId); |
|
|
|
|
if ($parent) { |
|
|
|
|
$parentNode = $parent->getResourceNode(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$document = new CDocument(); |
|
|
|
|
$document |
|
|
|
|
->setCourse($courseEntity) |
|
|
|
|
->setPath($path) |
|
|
|
|
->setFiletype($fileType) |
|
|
|
|
->setSize($fileSize) |
|
|
|
|
->setTitle($title) |
|
|
|
|
->setComment($comment) |
|
|
|
|
->setReadonly($readonly) |
|
|
|
|
->setSession($session) |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
$em->persist($document); |
|
|
|
|
$em->flush(); |
|
|
|
|
|
|
|
|
|
$resourceNode = $documentRepo->addResourceNode($document, $userEntity); |
|
|
|
|
$resourceNode->setParent($parentNode); |
|
|
|
|
$document->setResourceNode($resourceNode); |
|
|
|
|
|
|
|
|
|
// Only create a ResourseFile and Media if there's a file involved |
|
|
|
|
if ($fileType === 'file') { |
|
|
|
|
$mediaManager = Container::$container->get('sonata.media.manager.media'); |
|
|
|
|
/** @var \Chamilo\MediaBundle\Entity\Media $media */ |
|
|
|
|
$media = $mediaManager->create(); |
|
|
|
|
$media->setName($title); |
|
|
|
|
|
|
|
|
|
$fileName = basename($path); |
|
|
|
|
$extension = pathinfo($fileName, PATHINFO_EXTENSION); |
|
|
|
|
$media->setContext('default'); |
|
|
|
|
|
|
|
|
|
$provider = 'sonata.media.provider.image'; |
|
|
|
|
if (!in_array($extension, ['jpeg', 'jpg', 'gif', 'png'])) { |
|
|
|
|
$provider = 'sonata.media.provider.file'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$media->setProviderName($provider); |
|
|
|
|
$media->setEnabled(true); |
|
|
|
|
|
|
|
|
|
if ($content instanceof UploadedFile) { |
|
|
|
|
$file = $content; |
|
|
|
|
$media->setSize($file->getSize()); |
|
|
|
|
} else { |
|
|
|
|
$handle = tmpfile(); |
|
|
|
|
fwrite($handle, $content); |
|
|
|
|
$file = new \Sonata\MediaBundle\Extra\ApiMediaFile($handle); |
|
|
|
|
$file->setMimetype($media->getContentType()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$media->setBinaryContent($file); |
|
|
|
|
$mediaManager->save($media, true); |
|
|
|
|
|
|
|
|
|
$resourceFile = new ResourceFile(); |
|
|
|
|
$resourceFile->setMedia($media); |
|
|
|
|
$resourceFile->setName($title); |
|
|
|
|
$em->persist($resourceFile); |
|
|
|
|
|
|
|
|
|
$resourceNode->setResourceFile($resourceFile); |
|
|
|
|
$em->persist($resourceNode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// By default visibility is published |
|
|
|
|
// @todo change visibility |
|
|
|
|
//$newVisibility = ResourceLink::VISIBILITY_PUBLISHED; |
|
|
|
|
|
|
|
|
|
if (is_null($visibility)) { |
|
|
|
|
$visibility = ResourceLink::VISIBILITY_PUBLISHED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$link = new ResourceLink(); |
|
|
|
|
$link |
|
|
|
|
->setCourse($courseEntity) |
|
|
|
|
->setSession($session) |
|
|
|
|
->setGroup($group) |
|
|
|
|
//->setUser($toUser) |
|
|
|
|
->setResourceNode($resourceNode) |
|
|
|
|
->setVisibility($visibility) |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
$rights = []; |
|
|
|
|
switch ($visibility) { |
|
|
|
|
case ResourceLink::VISIBILITY_PENDING: |
|
|
|
|
case ResourceLink::VISIBILITY_DRAFT: |
|
|
|
|
$editorMask = ResourceNodeVoter::getEditorMask(); |
|
|
|
|
$resourceRight = new ResourceRight(); |
|
|
|
|
$resourceRight |
|
|
|
|
->setMask($editorMask) |
|
|
|
|
->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER) |
|
|
|
|
; |
|
|
|
|
$rights[] = $resourceRight; |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($rights)) { |
|
|
|
|
foreach ($rights as $right) { |
|
|
|
|
$link->addResourceRight($right); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$em->persist($link); |
|
|
|
|
$em->persist($document); |
|
|
|
|
$em->flush(); |
|
|
|
|
|
|
|
|
|
$documentId = $document->getIid(); |
|
|
|
|
if ($documentId) { |
|
|
|
|
$table = Database::get_course_table(TABLE_DOCUMENT); |
|
|
|
|
$sql = "UPDATE $table SET id = iid WHERE iid = $documentId"; |
|
|
|
|
Database::query($sql); |
|
|
|
|
|
|
|
|
|
/*if ($saveVisibility) { |
|
|
|
|
api_set_default_visibility( |
|
|
|
|
$documentId, |
|
|
|
|
TOOL_DOCUMENT, |
|
|
|
|
$group_id, |
|
|
|
|
$courseInfo, |
|
|
|
|
$sessionId, |
|
|
|
|
$userId |
|
|
|
|
); |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
$allowNotification = api_get_configuration_value('send_notification_when_document_added'); |
|
|
|
|
if ($sendNotification && $allowNotification) { |
|
|
|
|
$courseTitle = $courseInfo['title']; |
|
|
|
|
if (!empty($sessionId)) { |
|
|
|
|
$sessionInfo = api_get_session_info($sessionId); |
|
|
|
|
$courseTitle .= ' ( '.$sessionInfo['name'].') '; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$url = api_get_path(WEB_CODE_PATH). |
|
|
|
|
'document/showinframes.php?cidReq='.$courseInfo['code'].'&id_session='.$sessionId.'&id='.$documentId; |
|
|
|
|
$link = Display::url(basename($title), $url, ['target' => '_blank']); |
|
|
|
|
$userInfo = api_get_user_info($userId); |
|
|
|
|
|
|
|
|
|
$message = sprintf( |
|
|
|
|
get_lang('DocumentXHasBeenAddedToDocumentInYourCourseXByUserX'), |
|
|
|
|
$link, |
|
|
|
|
$courseTitle, |
|
|
|
|
$userInfo['complete_name'] |
|
|
|
|
); |
|
|
|
|
$subject = sprintf(get_lang('NewDocumentAddedToCourseX'), $courseTitle); |
|
|
|
|
MessageManager::sendMessageToAllUsersInCourse($subject, $message, $courseInfo, $sessionId); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $document; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Parse file information into a link. |
|
|
|
|
* |
|
|
|
|
@ -6833,223 +7051,4 @@ class DocumentManager |
|
|
|
|
|
|
|
|
|
return $btn; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Adds a new document to the database. |
|
|
|
|
* |
|
|
|
|
* @param array $courseInfo |
|
|
|
|
* @param string $path |
|
|
|
|
* @param string $fileType |
|
|
|
|
* @param int $fileSize |
|
|
|
|
* @param string $title |
|
|
|
|
* @param string $comment |
|
|
|
|
* @param int $readonly |
|
|
|
|
* @param int $visibility see ResourceLink constants |
|
|
|
|
* @param int $group_id group.id |
|
|
|
|
* @param int $sessionId Session ID, if any |
|
|
|
|
* @param int $userId creator user id |
|
|
|
|
* @param bool $sendNotification |
|
|
|
|
* @param string $content |
|
|
|
|
* @param int $parentId |
|
|
|
|
* |
|
|
|
|
* @return CDocument|false |
|
|
|
|
*/ |
|
|
|
|
public static function addDocument( |
|
|
|
|
$courseInfo, |
|
|
|
|
$path, |
|
|
|
|
$fileType, |
|
|
|
|
$fileSize, |
|
|
|
|
$title, |
|
|
|
|
$comment = null, |
|
|
|
|
$readonly = 0, |
|
|
|
|
$visibility = null, |
|
|
|
|
$group_id = 0, |
|
|
|
|
$sessionId = 0, |
|
|
|
|
$userId = 0, |
|
|
|
|
$sendNotification = true, |
|
|
|
|
$content = '', |
|
|
|
|
$parentId = 0 |
|
|
|
|
) { |
|
|
|
|
$userId = empty($userId) ? api_get_user_id() : $userId; |
|
|
|
|
|
|
|
|
|
if (empty($userId)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$userEntity = api_get_user_entity($userId); |
|
|
|
|
if (empty($userEntity)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$courseEntity = api_get_course_entity($courseInfo['real_id']); |
|
|
|
|
|
|
|
|
|
if (empty($courseEntity)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$sessionId = empty($sessionId) ? api_get_session_id() : $sessionId; |
|
|
|
|
$session = api_get_session_entity($sessionId); |
|
|
|
|
$group = api_get_group_entity($group_id); |
|
|
|
|
$readonly = (int) $readonly; |
|
|
|
|
|
|
|
|
|
$em = Database::getManager(); |
|
|
|
|
$documentRepo = $em->getRepository('ChamiloCourseBundle:CDocument'); |
|
|
|
|
|
|
|
|
|
$parentNode = null; |
|
|
|
|
if (!empty($parentId)) { |
|
|
|
|
$parent = $documentRepo->find($parentId); |
|
|
|
|
if ($parent) { |
|
|
|
|
$parentNode = $parent->getResourceNode(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$document = new CDocument(); |
|
|
|
|
$document |
|
|
|
|
->setCourse($courseEntity) |
|
|
|
|
->setPath($path) |
|
|
|
|
->setFiletype($fileType) |
|
|
|
|
->setSize($fileSize) |
|
|
|
|
->setTitle($title) |
|
|
|
|
->setComment($comment) |
|
|
|
|
->setReadonly($readonly) |
|
|
|
|
->setSession($session) |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
$em->persist($document); |
|
|
|
|
$em->flush(); |
|
|
|
|
|
|
|
|
|
$resourceNode = $documentRepo->addResourceNode($document, $userEntity); |
|
|
|
|
$resourceNode->setParent($parentNode); |
|
|
|
|
$document->setResourceNode($resourceNode); |
|
|
|
|
|
|
|
|
|
// Only create a ResourseFile and Media if there's a file involved |
|
|
|
|
if ($fileType === 'file') { |
|
|
|
|
$mediaManager = Container::$container->get('sonata.media.manager.media'); |
|
|
|
|
/** @var \Chamilo\MediaBundle\Entity\Media $media */ |
|
|
|
|
$media = $mediaManager->create(); |
|
|
|
|
$media->setName($title); |
|
|
|
|
|
|
|
|
|
$fileName = basename($path); |
|
|
|
|
$extension = pathinfo($fileName, PATHINFO_EXTENSION); |
|
|
|
|
$media->setContext('default'); |
|
|
|
|
|
|
|
|
|
$provider = 'sonata.media.provider.image'; |
|
|
|
|
if (!in_array($extension, ['jpeg', 'jpg', 'gif', 'png'])) { |
|
|
|
|
$provider = 'sonata.media.provider.file'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$media->setProviderName($provider); |
|
|
|
|
$media->setEnabled(true); |
|
|
|
|
|
|
|
|
|
if ($content instanceof UploadedFile) { |
|
|
|
|
$file = $content; |
|
|
|
|
$media->setSize($file->getSize()); |
|
|
|
|
} else { |
|
|
|
|
$handle = tmpfile(); |
|
|
|
|
fwrite($handle, $content); |
|
|
|
|
$file = new \Sonata\MediaBundle\Extra\ApiMediaFile($handle); |
|
|
|
|
$file->setMimetype($media->getContentType()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$media->setBinaryContent($file); |
|
|
|
|
$mediaManager->save($media, true); |
|
|
|
|
|
|
|
|
|
$resourceFile = new ResourceFile(); |
|
|
|
|
$resourceFile->setMedia($media); |
|
|
|
|
$resourceFile->setName($title); |
|
|
|
|
$em->persist($resourceFile); |
|
|
|
|
|
|
|
|
|
$resourceNode->setResourceFile($resourceFile); |
|
|
|
|
$em->persist($resourceNode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// By default visibility is published |
|
|
|
|
// @todo change visibility |
|
|
|
|
//$newVisibility = ResourceLink::VISIBILITY_PUBLISHED; |
|
|
|
|
|
|
|
|
|
if (is_null($visibility)) { |
|
|
|
|
$visibility = ResourceLink::VISIBILITY_PUBLISHED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$link = new ResourceLink(); |
|
|
|
|
$link |
|
|
|
|
->setCourse($courseEntity) |
|
|
|
|
->setSession($session) |
|
|
|
|
->setGroup($group) |
|
|
|
|
//->setUser($toUser) |
|
|
|
|
->setResourceNode($resourceNode) |
|
|
|
|
->setVisibility($visibility) |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
$rights = []; |
|
|
|
|
switch ($visibility) { |
|
|
|
|
case ResourceLink::VISIBILITY_PENDING: |
|
|
|
|
case ResourceLink::VISIBILITY_DRAFT: |
|
|
|
|
$editorMask = ResourceNodeVoter::getEditorMask(); |
|
|
|
|
$resourceRight = new ResourceRight(); |
|
|
|
|
$resourceRight |
|
|
|
|
->setMask($editorMask) |
|
|
|
|
->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER) |
|
|
|
|
; |
|
|
|
|
$rights[] = $resourceRight; |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($rights)) { |
|
|
|
|
foreach ($rights as $right) { |
|
|
|
|
$link->addResourceRight($right); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$em->persist($link); |
|
|
|
|
$em->persist($document); |
|
|
|
|
$em->flush(); |
|
|
|
|
|
|
|
|
|
$documentId = $document->getIid(); |
|
|
|
|
if ($documentId) { |
|
|
|
|
$table = Database::get_course_table(TABLE_DOCUMENT); |
|
|
|
|
$sql = "UPDATE $table SET id = iid WHERE iid = $documentId"; |
|
|
|
|
Database::query($sql); |
|
|
|
|
|
|
|
|
|
/*if ($saveVisibility) { |
|
|
|
|
api_set_default_visibility( |
|
|
|
|
$documentId, |
|
|
|
|
TOOL_DOCUMENT, |
|
|
|
|
$group_id, |
|
|
|
|
$courseInfo, |
|
|
|
|
$sessionId, |
|
|
|
|
$userId |
|
|
|
|
); |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
$allowNotification = api_get_configuration_value('send_notification_when_document_added'); |
|
|
|
|
if ($sendNotification && $allowNotification) { |
|
|
|
|
$courseTitle = $courseInfo['title']; |
|
|
|
|
if (!empty($sessionId)) { |
|
|
|
|
$sessionInfo = api_get_session_info($sessionId); |
|
|
|
|
$courseTitle .= ' ( '.$sessionInfo['name'].') '; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$url = api_get_path(WEB_CODE_PATH). |
|
|
|
|
'document/showinframes.php?cidReq='.$courseInfo['code'].'&id_session='.$sessionId.'&id='.$documentId; |
|
|
|
|
$link = Display::url(basename($title), $url, ['target' => '_blank']); |
|
|
|
|
$userInfo = api_get_user_info($userId); |
|
|
|
|
|
|
|
|
|
$message = sprintf( |
|
|
|
|
get_lang('DocumentXHasBeenAddedToDocumentInYourCourseXByUserX'), |
|
|
|
|
$link, |
|
|
|
|
$courseTitle, |
|
|
|
|
$userInfo['complete_name'] |
|
|
|
|
); |
|
|
|
|
$subject = sprintf(get_lang('NewDocumentAddedToCourseX'), $courseTitle); |
|
|
|
|
MessageManager::sendMessageToAllUsersInCourse($subject, $message, $courseInfo, $sessionId); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $document; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|