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 * 0 if requires context *out of* session, and null to use global context
* @param bool $ignoreDeleted * @param bool $ignoreDeleted
* *
* @deprecated use $repo->find()
*
* @return array document content * @return array document content
*/ */
public static function get_document_data_by_id( 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; $session_id = empty($session_id) ? api_get_session_id() : (int) $session_id;
$groupId = api_get_group_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); $TABLE_DOCUMENT = Database::get_course_table(TABLE_DOCUMENT);
$id = (int) $id; $id = (int) $id;
$sessionCondition = api_get_session_condition($session_id, true, true); $sessionCondition = api_get_session_condition($session_id, true, true);
$sql = "SELECT * FROM $TABLE_DOCUMENT $sql = "SELECT * FROM $TABLE_DOCUMENT
WHERE c_id = $course_id $sessionCondition AND iid = $id"; WHERE iid = $id";
if ($ignoreDeleted) { if ($ignoreDeleted) {
$sql .= " AND path NOT LIKE '%_DELETED_%' "; $sql .= " AND path NOT LIKE '%_DELETED_%' ";
} }
$result = Database::query($sql); $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)) { if ($result && 1 == Database::num_rows($result)) {
$row = Database::fetch_array($result, 'ASSOC'); $row = Database::fetch_array($result, 'ASSOC');
//@todo need to clarify the name of the URLs not nice right now //@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'] = api_get_path(SYS_COURSE_PATH).$course_info['path'].'/document'.$row['path'];
$row['absolute_path_from_document'] = '/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['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']); $row['basename'] = basename($row['path']);
if ('.' == dirname($row['path'])) { if ('.' == dirname($row['path'])) {
@ -4570,8 +4572,9 @@ class DocumentManager
$attributes = ['onchange' => 'javascript: document.selector.submit();']; $attributes = ['onchange' => 'javascript: document.selector.submit();'];
} }
$form->addElement('hidden', 'cidReq', api_get_course_id()); $form->addElement('hidden', 'cidReq', api_get_course_id());
$form->addElement('hidden', 'id_session', api_get_session_id()); $form->addElement('hidden', 'cid', api_get_course_int_id());
$form->addElement('hidden', 'gidReq', api_get_group_id()); $form->addElement('hidden', 'sid', api_get_session_id());
$form->addElement('hidden', 'gid', api_get_group_id());
$parent_select = $form->addSelect( $parent_select = $form->addSelect(
$selectName, $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; $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 { } else {
// Direct document URL // 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)) { if (!empty($overwrite_url)) {
$overwrite_url = Security::remove_XSS($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); $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'] ['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( $link .= ' '.Display::url(
Display::return_icon('preview_view.png', get_lang('Preview')), Display::return_icon('preview_view.png', get_lang('Preview')),
$directUrl, $directUrl,

@ -106,7 +106,7 @@ class learnpath
public $expired_on = ''; public $expired_on = '';
public $ref; public $ref;
public $course_int_id; public $course_int_id;
public $course_info = []; public $course_info;
public $categoryId; public $categoryId;
public $scormUrl; public $scormUrl;
@ -123,6 +123,7 @@ class learnpath
$lp_id = (int) $entity->getIid(); $lp_id = (int) $entity->getIid();
$course_info = empty($course_info) ? api_get_course_info() : $course_info; $course_info = empty($course_info) ? api_get_course_info() : $course_info;
$course_id = (int) $course_info['real_id']; $course_id = (int) $course_info['real_id'];
$this->course_info = $course_info;
$this->set_course_int_id($course_id); $this->set_course_int_id($course_id);
if (empty($lp_id) || empty($course_id)) { if (empty($lp_id) || empty($course_id)) {
$this->error = "Parameter is empty: LpId:'$lp_id', courseId: '$lp_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); $documentId = DocumentManager::get_document_id($course, $dir, 0);
} }
$array = [ return [
'dir' => $dir, 'dir' => $dir,
'filepath' => $filepath, 'filepath' => $filepath,
'folder' => $folder, 'folder' => $folder,
'id' => $documentId, 'id' => $documentId,
]; ];
return $array;
} }
/** /**
@ -6566,38 +6565,6 @@ class learnpath
// Generates folder // Generates folder
$result = $this->generate_lp_folder($courseInfo); $result = $this->generate_lp_folder($courseInfo);
$dir = $result['dir']; $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'] // stripslashes() before calling api_replace_dangerous_char() because $_POST['title']
// is already escaped twice when it gets here. // is already escaped twice when it gets here.
$originalTitle = !empty($title) ? $title : $_POST['title']; $originalTitle = !empty($title) ? $title : $_POST['title'];
@ -6704,11 +6671,13 @@ class learnpath
$id = (int) $_REQUEST['document_id']; $id = (int) $_REQUEST['document_id'];
/** @var CDocument $document */ /** @var CDocument $document */
$document = $repo->find($id); $document = $repo->find($id);
if ($document->getResourceNode()->hasEditableTextContent()) { if ($document->getResourceNode()->hasEditableTextContent()) {
$repo->updateResourceFileContent($document, $_REQUEST['content_lp']); $repo->updateResourceFileContent($document, $_REQUEST['content_lp']);
/* $nodeRepo = Container::getDocumentRepository()->getResourceNodeRepository();
$nodeRepo->update($document->getResourceNode());
var_dump($document->getResourceNode()->getContent());
exit;*/
} }
$document->setTitle($_REQUEST['title']); $document->setTitle($_REQUEST['title']);
$repo->update($document); $repo->update($document);
} }

@ -514,104 +514,97 @@ switch ($action) {
exit; exit;
break; break;
case 'add_item': case 'add_item':
if (!$is_allowed_to_edit) { if (!$is_allowed_to_edit || !$lp_found) {
api_not_allowed(true); 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)) { Session::write('refresh', 1);
// 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);
}
$parent = isset($_POST['parent']) ? $_POST['parent'] : ''; if (isset($_POST['submit_button']) && !empty($post_title)) {
$previous = isset($_POST['previous']) ? $_POST['previous'] : ''; Session::write('post_time', $_POST['post_time']);
$type = isset($_POST['type']) ? $_POST['type'] : ''; $directoryParentId = isset($_POST['directory_parent_id']) ? $_POST['directory_parent_id'] : 0;
$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
);
}
}
$_SESSION['oLP']->add_item( if (empty($directoryParentId) || '/' === $directoryParentId) {
$parent, $result = $oLP->generate_lp_folder($courseInfo);
$previous, $directoryParentId = $result['id'];
$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
);
}
}
$_SESSION['oLP']->add_item( $parent = isset($_POST['parent']) ? $_POST['parent'] : '';
$parent, $previous = isset($_POST['previous']) ? $_POST['previous'] : '';
$previous, $type = isset($_POST['type']) ? $_POST['type'] : '';
TOOL_READOUT_TEXT, $path = isset($_POST['path']) ? $_POST['path'] : '';
$document_id, $description = isset($_POST['description']) ? $_POST['description'] : '';
$post_title, $prerequisites = isset($_POST['prerequisites']) ? $_POST['prerequisites'] : '';
$description, $maxTimeAllowed = isset($_POST['maxTimeAllowed']) ? $_POST['maxTimeAllowed'] : '';
$prerequisites
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( $oLP->add_item(
$parent, $parent,
$previous, $previous,
$type, $type,
$path, $document_id,
$post_title, $post_title,
$description, $description,
$prerequisites, $prerequisites
$maxTimeAllowed );
} 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 { } 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; break;
case 'add_users_to_category': case 'add_users_to_category':
if (!$is_allowed_to_edit) { if (!$is_allowed_to_edit) {
@ -746,55 +739,50 @@ switch ($action) {
} }
break; break;
case 'edit_item': case 'edit_item':
if (!$is_allowed_to_edit) { if (!$is_allowed_to_edit || !$lp_found) {
api_not_allowed(true); 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( Session::write('refresh', 1);
$_REQUEST['id'], if (isset($_POST['submit_button']) && !empty($post_title)) {
$_POST['parent'], // TODO: mp3 edit
$_POST['previous'], $audio = [];
$post_title, if (isset($_FILES['mp3'])) {
$description, $audio = $_FILES['mp3'];
$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;
} }
if (isset($_GET['view']) && 'build' === $_GET['view']) {
require 'lp_edit_item.php'; $description = isset($_POST['description']) ? $_POST['description'] : '';
} else { $prerequisites = isset($_POST['prerequisites']) ? $_POST['prerequisites'] : '';
require 'lp_admin_view.php'; $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; break;
case 'edit_item_prereq': case 'edit_item_prereq':

@ -323,7 +323,7 @@ if (!empty($users)) {
if (!empty($groupsByUser)) { if (!empty($groupsByUser)) {
$groupUrl = api_get_path(WEB_CODE_PATH).'group/group_space.php?'.api_get_cidreq(true, false); $groupUrl = api_get_path(WEB_CODE_PATH).'group/group_space.php?'.api_get_cidreq(true, false);
foreach ($groupsByUser as $group) { 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'); error_log('resource node preUpdate');
if ($resourceNode->hasResourceFile() && $resourceNode->isFileEditableText()) { if ($resourceNode->hasResourceFile() && $resourceNode->hasEditableTextContent()) {
$fileName = $this->resourceNodeRepository->getFilename($resourceNode->getResourceFile()); $fileName = $this->resourceNodeRepository->getFilename($resourceNode->getResourceFile());
error_log("fileName: $fileName");
if ($fileName) { if ($fileName) {
error_log('updated');
$content = $resourceNode->getContent(); $content = $resourceNode->getContent();
$this->resourceNodeRepository->getFileSystem()->update($fileName, $content); $this->resourceNodeRepository->getFileSystem()->update($fileName, $content);
} }

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

@ -37,6 +37,21 @@ class ResourceNodeRepository extends MaterializedPathRepository
return $this->storage->resolveUri($resourceFile); 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 * @return FilesystemInterface
*/ */

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

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

Loading…
Cancel
Save