Lps: Fix lp document edit

pull/3741/head
Julio Montoya 5 years ago
parent 166034e039
commit 7d0dcff0b5
  1. 21
      public/main/inc/lib/document.lib.php
  2. 45
      public/main/lp/learnpath.class.php
  3. 246
      public/main/lp/lp_controller.php
  4. 2
      public/main/lp/lp_report.php
  5. 4
      src/CoreBundle/Entity/Listener/ResourceNodeListener.php
  6. 5
      src/CoreBundle/Entity/ResourceNode.php
  7. 15
      src/CoreBundle/Repository/ResourceNodeRepository.php
  8. 8
      src/CoreBundle/Repository/ResourceRepository.php
  9. 3
      src/CourseBundle/Entity/CDocument.php

@ -1155,6 +1155,8 @@ class DocumentManager
* 0 if requires context *out of* session, and null to use global context
* @param bool $ignoreDeleted
*
* @deprecated use $repo->find()
*
* @return array document content
*/
public static function get_document_data_by_id(
@ -1174,20 +1176,20 @@ class DocumentManager
$session_id = empty($session_id) ? api_get_session_id() : (int) $session_id;
$groupId = api_get_group_id();
$www = api_get_path(WEB_COURSE_PATH).$course_info['path'].'/document';
//$www = api_get_path(WEB_COURSE_PATH).$course_info['path'].'/document';
$TABLE_DOCUMENT = Database::get_course_table(TABLE_DOCUMENT);
$id = (int) $id;
$sessionCondition = api_get_session_condition($session_id, true, true);
$sql = "SELECT * FROM $TABLE_DOCUMENT
WHERE c_id = $course_id $sessionCondition AND iid = $id";
WHERE iid = $id";
if ($ignoreDeleted) {
$sql .= " AND path NOT LIKE '%_DELETED_%' ";
}
$result = Database::query($sql);
$courseParam = '&cidReq='.$course_code.'&id='.$id.'&id_session='.$session_id.'&gidReq='.$groupId;
$courseParam = '&cidReq='.$course_code.'&id='.$id.'&sid='.$session_id.'&gidReq='.$groupId;
if ($result && 1 == Database::num_rows($result)) {
$row = Database::fetch_array($result, 'ASSOC');
//@todo need to clarify the name of the URLs not nice right now
@ -1200,7 +1202,7 @@ class DocumentManager
//$row['absolute_path'] = api_get_path(SYS_COURSE_PATH).$course_info['path'].'/document'.$row['path'];
$row['absolute_path_from_document'] = '/document'.$row['path'];
//$row['absolute_parent_path'] = api_get_path(SYS_COURSE_PATH).$course_info['path'].'/document'.$pathinfo['dirname'].'/';
$row['direct_url'] = $www.$path;
//$row['direct_url'] = $www.$path;
$row['basename'] = basename($row['path']);
if ('.' == dirname($row['path'])) {
@ -4570,8 +4572,9 @@ class DocumentManager
$attributes = ['onchange' => 'javascript: document.selector.submit();'];
}
$form->addElement('hidden', 'cidReq', api_get_course_id());
$form->addElement('hidden', 'id_session', api_get_session_id());
$form->addElement('hidden', 'gidReq', api_get_group_id());
$form->addElement('hidden', 'cid', api_get_course_int_id());
$form->addElement('hidden', 'sid', api_get_session_id());
$form->addElement('hidden', 'gid', api_get_group_id());
$parent_select = $form->addSelect(
$selectName,
@ -6554,12 +6557,12 @@ This folder contains all sessions that have been opened in the chat. Although th
$url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq().'&action=add_item&type='.TOOL_DOCUMENT.'&file='.$documentId.'&lp_id='.$lp_id;
} else {
// Direct document URL
$url = $web_code_path.'document/document.php?cidReq='.$course_info['code'].'&id_session='.$session_id.'&id='.$documentId;
$url = $web_code_path.'document/document.php?cidReq='.$course_info['code'].'&sid='.$session_id.'&id='.$documentId;
}
if (!empty($overwrite_url)) {
$overwrite_url = Security::remove_XSS($overwrite_url);
$url = $overwrite_url.'&cidReq='.$course_info['code'].'&id_session='.$session_id.'&document_id='.$documentId;
$url = $overwrite_url.'&cidReq='.$course_info['code'].'&sid='.$session_id.'&document_id='.$documentId;
}
$img = Display::returnIconPath($icon);
@ -6573,7 +6576,7 @@ This folder contains all sessions that have been opened in the chat. Although th
['target' => $target, 'class' => 'moved']
);
$directUrl = $web_code_path.'document/document.php?cidReq='.$course_info['code'].'&id_session='.$session_id.'&id='.$documentId;
$directUrl = $web_code_path.'document/document.php?cidReq='.$course_info['code'].'&sid='.$session_id.'&id='.$documentId;
$link .= ' '.Display::url(
Display::return_icon('preview_view.png', get_lang('Preview')),
$directUrl,

@ -106,7 +106,7 @@ class learnpath
public $expired_on = '';
public $ref;
public $course_int_id;
public $course_info = [];
public $course_info;
public $categoryId;
public $scormUrl;
@ -123,6 +123,7 @@ class learnpath
$lp_id = (int) $entity->getIid();
$course_info = empty($course_info) ? api_get_course_info() : $course_info;
$course_id = (int) $course_info['real_id'];
$this->course_info = $course_info;
$this->set_course_int_id($course_id);
if (empty($lp_id) || empty($course_id)) {
$this->error = "Parameter is empty: LpId:'$lp_id', courseId: '$lp_id'";
@ -6524,14 +6525,12 @@ class learnpath
$documentId = DocumentManager::get_document_id($course, $dir, 0);
}
$array = [
return [
'dir' => $dir,
'filepath' => $filepath,
'folder' => $folder,
'id' => $documentId,
];
return $array;
}
/**
@ -6566,38 +6565,6 @@ class learnpath
// Generates folder
$result = $this->generate_lp_folder($courseInfo);
$dir = $result['dir'];
if (empty($parentId) || '/' == $parentId) {
$postDir = isset($_POST['dir']) ? $_POST['dir'] : $dir;
$dir = isset($_GET['dir']) ? $_GET['dir'] : $postDir; // Please, do not modify this dirname formatting.
if ('/' === $parentId) {
$dir = '/';
}
// Please, do not modify this dirname formatting.
if (strstr($dir, '..')) {
$dir = '/';
}
if (!empty($dir[0]) && '.' == $dir[0]) {
$dir = substr($dir, 1);
}
if (!empty($dir[0]) && '/' != $dir[0]) {
$dir = '/'.$dir;
}
if (isset($dir[strlen($dir) - 1]) && '/' != $dir[strlen($dir) - 1]) {
$dir .= '/';
}
} else {
$parentInfo = DocumentManager::get_document_data_by_id(
$parentId,
$courseInfo['code']
);
if (!empty($parentInfo)) {
$dir = $parentInfo['path'].'/';
}
}
// stripslashes() before calling api_replace_dangerous_char() because $_POST['title']
// is already escaped twice when it gets here.
$originalTitle = !empty($title) ? $title : $_POST['title'];
@ -6704,11 +6671,13 @@ class learnpath
$id = (int) $_REQUEST['document_id'];
/** @var CDocument $document */
$document = $repo->find($id);
if ($document->getResourceNode()->hasEditableTextContent()) {
$repo->updateResourceFileContent($document, $_REQUEST['content_lp']);
/* $nodeRepo = Container::getDocumentRepository()->getResourceNodeRepository();
$nodeRepo->update($document->getResourceNode());
var_dump($document->getResourceNode()->getContent());
exit;*/
}
$document->setTitle($_REQUEST['title']);
$repo->update($document);
}

@ -514,104 +514,97 @@ switch ($action) {
exit;
break;
case 'add_item':
if (!$is_allowed_to_edit) {
if (!$is_allowed_to_edit || !$lp_found) {
api_not_allowed(true);
}
if (!$lp_found) {
// Check if the learnpath ID was defined, otherwise send back to list
require 'lp_list.php';
} else {
Session::write('refresh', 1);
if (isset($_POST['submit_button']) && !empty($post_title)) {
// If a title was submitted:
if (isset($_SESSION['post_time']) && $_SESSION['post_time'] == $_POST['post_time']) {
// Check post_time to ensure ??? (counter-hacking measure?)
require 'lp_add_item.php';
} else {
Session::write('post_time', $_POST['post_time']);
$directoryParentId = isset($_POST['directory_parent_id']) ? $_POST['directory_parent_id'] : 0;
if (empty($directoryParentId)) {
$_SESSION['oLP']->generate_lp_folder($courseInfo);
}
Session::write('refresh', 1);
$parent = isset($_POST['parent']) ? $_POST['parent'] : '';
$previous = isset($_POST['previous']) ? $_POST['previous'] : '';
$type = isset($_POST['type']) ? $_POST['type'] : '';
$path = isset($_POST['path']) ? $_POST['path'] : '';
$description = isset($_POST['description']) ? $_POST['description'] : '';
$prerequisites = isset($_POST['prerequisites']) ? $_POST['prerequisites'] : '';
$maxTimeAllowed = isset($_POST['maxTimeAllowed']) ? $_POST['maxTimeAllowed'] : '';
if (TOOL_DOCUMENT === $_POST['type']) {
if (isset($_POST['path']) && isset($_GET['id']) && !empty($_GET['id'])) {
$document_id = $_POST['path'];
} else {
if ($_POST['content_lp']) {
$document_id = $_SESSION['oLP']->create_document(
$courseInfo,
$_POST['content_lp'],
$_POST['title'],
'html',
$directoryParentId
);
}
}
if (isset($_POST['submit_button']) && !empty($post_title)) {
Session::write('post_time', $_POST['post_time']);
$directoryParentId = isset($_POST['directory_parent_id']) ? $_POST['directory_parent_id'] : 0;
$_SESSION['oLP']->add_item(
$parent,
$previous,
$type,
$document_id,
$post_title,
$description,
$prerequisites
);
} elseif (TOOL_READOUT_TEXT == $_POST['type']) {
if (isset($_POST['path']) && 'true' != $_GET['edit']) {
$document_id = $_POST['path'];
} else {
if ($_POST['content_lp']) {
$document_id = $_SESSION['oLP']->createReadOutText(
$courseInfo,
$_POST['content_lp'],
$_POST['title'],
$directoryParentId
);
}
}
if (empty($directoryParentId) || '/' === $directoryParentId) {
$result = $oLP->generate_lp_folder($courseInfo);
$directoryParentId = $result['id'];
}
$_SESSION['oLP']->add_item(
$parent,
$previous,
TOOL_READOUT_TEXT,
$document_id,
$post_title,
$description,
$prerequisites
$parent = isset($_POST['parent']) ? $_POST['parent'] : '';
$previous = isset($_POST['previous']) ? $_POST['previous'] : '';
$type = isset($_POST['type']) ? $_POST['type'] : '';
$path = isset($_POST['path']) ? $_POST['path'] : '';
$description = isset($_POST['description']) ? $_POST['description'] : '';
$prerequisites = isset($_POST['prerequisites']) ? $_POST['prerequisites'] : '';
$maxTimeAllowed = isset($_POST['maxTimeAllowed']) ? $_POST['maxTimeAllowed'] : '';
if (TOOL_DOCUMENT === $_POST['type']) {
if (isset($_POST['path']) && isset($_GET['id']) && !empty($_GET['id'])) {
$document_id = $_POST['path'];
} else {
if ($_POST['content_lp']) {
$document_id = $oLP->create_document(
$courseInfo,
$_POST['content_lp'],
$_POST['title'],
'html',
$directoryParentId
);
} else {
// For all other item types than documents,
// load the item using the item type and path rather than its ID.
$_SESSION['oLP']->add_item(
$parent,
$previous,
$type,
$path,
$post_title,
$description,
$prerequisites,
$maxTimeAllowed
}
}
$oLP->add_item(
$parent,
$previous,
$type,
$document_id,
$post_title,
$description,
$prerequisites
);
} elseif (TOOL_READOUT_TEXT == $_POST['type']) {
if (isset($_POST['path']) && 'true' != $_GET['edit']) {
$document_id = $_POST['path'];
} else {
if ($_POST['content_lp']) {
$document_id = $oLP->createReadOutText(
$courseInfo,
$_POST['content_lp'],
$_POST['title'],
$directoryParentId
);
}
$url = api_get_self().'?action=add_item&type=step&lp_id='.intval($_SESSION['oLP']->lp_id).'&'.api_get_cidreq();
header('Location: '.$url);
exit;
}
$oLP->add_item(
$parent,
$previous,
TOOL_READOUT_TEXT,
$document_id,
$post_title,
$description,
$prerequisites
);
} else {
require 'lp_add_item.php';
// For all other item types than documents,
// load the item using the item type and path rather than its ID.
$oLP->add_item(
$parent,
$previous,
$type,
$path,
$post_title,
$description,
$prerequisites,
$maxTimeAllowed
);
}
$url = api_get_self().'?action=add_item&type=step&lp_id='.intval($oLP->lp_id).'&'.api_get_cidreq();
header('Location: '.$url);
exit;
} else {
require 'lp_add_item.php';
}
break;
case 'add_users_to_category':
if (!$is_allowed_to_edit) {
@ -746,55 +739,50 @@ switch ($action) {
}
break;
case 'edit_item':
if (!$is_allowed_to_edit) {
if (!$is_allowed_to_edit || !$lp_found) {
api_not_allowed(true);
}
if (!$lp_found) {
require 'lp_list.php';
} else {
Session::write('refresh', 1);
if (isset($_POST['submit_button']) && !empty($post_title)) {
// TODO: mp3 edit
$audio = [];
if (isset($_FILES['mp3'])) {
$audio = $_FILES['mp3'];
}
$description = isset($_POST['description']) ? $_POST['description'] : '';
$prerequisites = isset($_POST['prerequisites']) ? $_POST['prerequisites'] : '';
$maxTimeAllowed = isset($_POST['maxTimeAllowed']) ? $_POST['maxTimeAllowed'] : '';
$url = isset($_POST['url']) ? $_POST['url'] : '';
$_SESSION['oLP']->edit_item(
$_REQUEST['id'],
$_POST['parent'],
$_POST['previous'],
$post_title,
$description,
$prerequisites,
$audio,
$maxTimeAllowed,
$url
);
if (isset($_POST['content_lp'])) {
$_SESSION['oLP']->edit_document($courseInfo);
}
$is_success = true;
$extraFieldValues = new ExtraFieldValue('lp_item');
$extraFieldValues->saveFieldValues($_POST);
Display::addFlash(Display::return_message(get_lang('Updated')));
$url = api_get_self().'?action=add_item&type=step&lp_id='.intval($_SESSION['oLP']->lp_id).'&'.api_get_cidreq();
header('Location: '.$url);
exit;
Session::write('refresh', 1);
if (isset($_POST['submit_button']) && !empty($post_title)) {
// TODO: mp3 edit
$audio = [];
if (isset($_FILES['mp3'])) {
$audio = $_FILES['mp3'];
}
if (isset($_GET['view']) && 'build' === $_GET['view']) {
require 'lp_edit_item.php';
} else {
require 'lp_admin_view.php';
$description = isset($_POST['description']) ? $_POST['description'] : '';
$prerequisites = isset($_POST['prerequisites']) ? $_POST['prerequisites'] : '';
$maxTimeAllowed = isset($_POST['maxTimeAllowed']) ? $_POST['maxTimeAllowed'] : '';
$url = isset($_POST['url']) ? $_POST['url'] : '';
$oLP->edit_item(
$_REQUEST['id'],
$_POST['parent'],
$_POST['previous'],
$post_title,
$description,
$prerequisites,
$audio,
$maxTimeAllowed,
$url
);
if (isset($_POST['content_lp'])) {
$oLP->edit_document($courseInfo);
}
$is_success = true;
$extraFieldValues = new ExtraFieldValue('lp_item');
$extraFieldValues->saveFieldValues($_POST);
Display::addFlash(Display::return_message(get_lang('Updated')));
$url = api_get_self().'?action=add_item&type=step&lp_id='.intval($_SESSION['oLP']->lp_id).'&'.api_get_cidreq();
header('Location: '.$url);
exit;
}
if (isset($_GET['view']) && 'build' === $_GET['view']) {
require 'lp_edit_item.php';
} else {
require 'lp_admin_view.php';
}
break;
case 'edit_item_prereq':

@ -323,7 +323,7 @@ if (!empty($users)) {
if (!empty($groupsByUser)) {
$groupUrl = api_get_path(WEB_CODE_PATH).'group/group_space.php?'.api_get_cidreq(true, false);
foreach ($groupsByUser as $group) {
$userGroupList .= Display::url($icon.$group['name'], $groupUrl.'&gidReq='.$group['iid']).' ';
$userGroupList .= Display::url($icon.$group['name'], $groupUrl.'&gid='.$group['iid']).' ';
}
}
}

@ -55,9 +55,11 @@ class ResourceNodeListener
{
error_log('resource node preUpdate');
if ($resourceNode->hasResourceFile() && $resourceNode->isFileEditableText()) {
if ($resourceNode->hasResourceFile() && $resourceNode->hasEditableTextContent()) {
$fileName = $this->resourceNodeRepository->getFilename($resourceNode->getResourceFile());
error_log("fileName: $fileName");
if ($fileName) {
error_log('updated');
$content = $resourceNode->getContent();
$this->resourceNodeRepository->getFileSystem()->update($fileName, $content);
}

@ -476,11 +476,6 @@ class ResourceNode
return false;
}
public function isFileEditableText(): bool
{
return $this->hasEditableTextContent();
}
public function isResourceFileAnImage(): bool
{
if ($this->hasResourceFile()) {

@ -37,6 +37,21 @@ class ResourceNodeRepository extends MaterializedPathRepository
return $this->storage->resolveUri($resourceFile);
}
/*public function create(ResourceNode $node): void
{
$this->getEntityManager()->persist($node);
$this->getEntityManager()->flush();
}
public function update(ResourceNode $node, $andFlush = true): void
{
//$node->setUpdatedAt(new \DateTime());
$this->getEntityManager()->persist($node);
if ($andFlush) {
$this->getEntityManager()->flush();
}
}*/
/**
* @return FilesystemInterface
*/

@ -281,8 +281,10 @@ abstract class ResourceRepository extends ServiceEntityRepository
public function update(AbstractResource $resource, $andFlush = true): void
{
$resource->getResourceNode()->setUpdatedAt(new \DateTime());
$resource->getResourceNode()->setTitle($resource->getResourceName());
$this->getEntityManager()->persist($resource);
if ($andFlush) {
$this->getEntityManager()->flush();
}
@ -731,6 +733,10 @@ abstract class ResourceRepository extends ServiceEntityRepository
$resourceNode = $resource->getResourceNode();
if ($resourceNode->hasResourceFile()) {
$resourceNode->setContent($content);
error_log('updated');
$resourceNode->getResourceFile()->setSize(strlen($content));
/*
error_log('has file');
$resourceFile = $resourceNode->getResourceFile();
if ($resourceFile) {
@ -745,7 +751,7 @@ abstract class ResourceRepository extends ServiceEntityRepository
$resource->setUploadFile($file);
return true;
}
}*/
}
error_log('false');

@ -286,9 +286,6 @@ class CDocument extends AbstractResource implements ResourceInterface
return $this->iid;
}
/**
* Resource identifier.
*/
public function getResourceIdentifier(): int
{
return $this->getIid();

Loading…
Cancel
Save