Add work corrections see BT#6760

1.10.x
Julio Montoya 10 years ago
parent 59dd41f69b
commit 756ffebbc9
  1. 61
      main/inc/ajax/work.ajax.php
  2. 73
      main/inc/lib/export.lib.inc.php
  3. 14
      main/template/default/work/view.tpl
  4. 54
      main/wiki/wiki.inc.php
  5. 4
      main/work/download.php
  6. 8
      main/work/downloadfolder.inc.php
  7. 6
      main/work/view.php
  8. 132
      main/work/work.lib.php
  9. 40
      main/work/work_list_all.php
  10. 32
      src/Chamilo/CoreBundle/Migrations/Schema/V110/Version20150713132630.php
  11. 46
      src/Chamilo/CourseBundle/Entity/CStudentPublication.php

@ -21,6 +21,67 @@ switch ($action) {
deleteDirWork($workId);
}
}
break;
case 'upload_correction_file':
api_protect_course_script(true);
// User access same as upload.php
$is_allowed_to_edit = api_is_allowed_to_edit(null, true);
$itemId = isset($_GET['item_id']) ? intval($_GET['item_id']) : '';
$result = array();
if (!empty($_FILES) && !empty($itemId)) {
$file = $_FILES['file'];
$courseInfo = api_get_course_info();
$workInfo = get_work_data_by_id($itemId);
$workInfoParent = get_work_data_by_id($workInfo['parent_id']);
$resultUpload = uploadWork($workInfoParent, $courseInfo, true, $workInfo);
$work_table = Database:: get_course_table(
TABLE_STUDENT_PUBLICATION
);
if (isset($resultUpload['url']) && !empty($resultUpload['url'])) {
$url = Database::escape_string($resultUpload['url']);
$title = isset($resultUpload['filename']) && !empty($resultUpload['filename']) ? $resultUpload['filename'] : get_lang('Untitled');
$sql = "UPDATE $work_table SET
url_correction = '".$url."',
title_correction = '".$title."'
WHERE iid = $itemId";
Database::query($sql);
$result['title'] = $resultUpload['filename'];
$result['url'] = 'view.php?'.api_get_cidreq().'&id='.$itemId;
$json = array();
$json['name'] = Display::url(
api_htmlentities($result['title']),
api_htmlentities($result['url']),
array('target' => '_blank')
);
$json['type'] = api_htmlentities($file['type']);
$json['size'] = format_file_size($file['size']);
}
if (isset($result['url'])) {
$json['result'] = Display::return_icon(
'accept.png',
get_lang('Uploaded')
);
} else {
$json['result'] = Display::return_icon(
'exclamation.png',
get_lang('Error')
);
}
echo json_encode($json);
}
break;
default:
echo '';

@ -8,6 +8,14 @@ use Ddeboer\DataImport\Workflow;
use Ddeboer\DataImport\Reader\CsvReader;
use Ddeboer\DataImport\Reader\ArrayReader;
use Ddeboer\DataImport\Writer\ArrayWriter;
use Chamilo\CoreBundle\Component\Editor\Connector;
use Chamilo\CoreBundle\Component\Filesystem\Data;
use ChamiloSession as Session;
use MediaAlchemyst\Alchemyst;
use MediaAlchemyst\DriversContainer;
use Neutron\TemporaryFilesystem\Manager;
use Neutron\TemporaryFilesystem\TemporaryFilesystem;
use Symfony\Component\Filesystem\Filesystem;
/**
* This is the export library for Chamilo.
@ -253,4 +261,69 @@ class Export
$table_tp_html = $table->toHtml();
return $table_tp_html;
}
/**
* Export HTML content in a ODF document
* @param string $html
* @param string $name
* @param string $format
*
* @return bool
*/
public static function htmlToOdt($html, $name, $format = 'odt')
{
$unoconv = api_get_configuration_value('unoconv.binaries');
if (empty($unoconv)) {
return false;
}
if (!empty($html)) {
$fs = new Filesystem();
$paths = [
'root_sys' => api_get_path(SYS_PATH),
'path.temp' => api_get_path(SYS_ARCHIVE_PATH),
];
$connector = new Connector();
$drivers = new DriversContainer();
$drivers['configuration'] = array(
'unoconv.binaries' => $unoconv,
'unoconv.timeout' => 60,
);
$tempFilesystem = TemporaryFilesystem::create();
$manager = new Manager($tempFilesystem, $fs);
$alchemyst = new Alchemyst($drivers, $manager);
$dataFileSystem = new Data($paths, $fs, $connector, $alchemyst);
$content = $dataFileSystem->convertRelativeToAbsoluteUrl($html);
$filePath = $dataFileSystem->putContentInTempFile(
$content,
api_replace_dangerous_char($name),
'html'
);
$try = true;
while ($try) {
try {
$convertedFile = $dataFileSystem->transcode(
$filePath,
$format
);
$try = false;
DocumentManager::file_send_for_download(
$convertedFile,
false,
$name.'.'.$format
);
} catch (Exception $e) {
// error_log($e->getMessage());
}
}
}
}
}

@ -2,11 +2,23 @@
<h2>
{{ work.title }}
{% if work.contains_file %}
<a href="{{ work.download_url }}"><img src="{{ "save.png"|icon(22) }}" width="22" height="22"></a>
<a href="{{ work.download_url }}">
<img src="{{ "save.png"|icon(22) }}" width="22" height="22">
</a>
{% endif %}
</h2>
</div>
{% if work.url_correction %}
<h3>{{ "Correction" |get_lang }}</h3>
<p>
<a class="btn btn-default" href="{{ work.download_url }}&correction=1">
{{ "Download" |get_lang }}
</a>
</p>
<hr />
{% endif %}
{% if work.description %}
<p>
{{ work.description }}

@ -960,7 +960,6 @@ class Wiki
echo '<a href="index.php?'.api_get_cidreq().'&action=showpage&actionpage='.$lock_unlock_notify_page.'&title='.api_htmlentities(urlencode($page)).'">'.
$notify_page.'</a>';
// Page action: copy last version to doc area
if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
echo '<a href="index.php?'.api_get_cidreq().'&action=export2doc&wiki_id='.$row['id'].'">'.
@ -5248,64 +5247,17 @@ class Wiki
}
/**
* Export wiki content in a odf
* Export wiki content in a ODF
* @param int $id
* @param string int
* @return bool
*/
public function exportTo($id, $format = 'doc')
{
$unoconv = api_get_configuration_value('unoconv.binaries');
if (empty($unoconv)) {
return false;
}
$data = self::get_wiki_data($id);
if (!empty($data['content'])) {
$fs = new Filesystem();
$paths = [
'root_sys' => api_get_path(SYS_PATH),
'path.temp' => api_get_path(SYS_ARCHIVE_PATH),
];
$connector = new Connector();
$drivers = new DriversContainer();
$drivers['configuration'] = array(
'unoconv.binaries' => $unoconv,
'unoconv.timeout' => 60,
);
$tempFilesystem = TemporaryFilesystem::create();
$manager = new Manager($tempFilesystem, $fs);
$alchemyst = new Alchemyst($drivers, $manager);
$dataFileSystem = new Data($paths, $fs, $connector, $alchemyst);
$content = $dataFileSystem->convertRelativeToAbsoluteUrl($data['content']);
$filePath = $dataFileSystem->putContentInTempFile(
$content,
api_replace_dangerous_char($data['reflink']),
'html'
);
$try = true;
while ($try) {
try {
$convertedFile = $dataFileSystem->transcode(
$filePath,
$format
);
$try = false;
DocumentManager::file_send_for_download(
$convertedFile,
false,
$data['title'].'.'.$format
);
} catch (Exception $e) {
}
}
if (isset($data['content']) && !empty($data['content'])) {
Export::htmlToOdt($data['content'], $data['reflink'], $format);
}
return false;

@ -26,7 +26,9 @@ if (empty($courseInfo)) {
api_not_allowed(true);
}
$result = downloadFile($id, $courseInfo);
$correction = isset($_REQUEST['correction']) ? true : false;
$result = downloadFile($id, $courseInfo, $correction);
if ($result == false) {
api_not_allowed(true);
}

@ -56,6 +56,8 @@ $files = array();
$course_id = api_get_course_int_id();
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId, true, false, 'props.session_id');
$filenameCondition = null;
if (array_key_exists('filename', $work_data)) {
$filenameCondition = ", filename";
@ -63,7 +65,7 @@ if (array_key_exists('filename', $work_data)) {
if (api_is_allowed_to_edit() || api_is_coach()) {
//Search for all files that are not deleted => visibility != 2
$sql = "SELECT DISTINCT
$sql = "SELECT DISTINCT
url,
title,
description,
@ -86,8 +88,8 @@ if (api_is_allowed_to_edit() || api_is_coach()) {
work.filetype = 'file' AND
props.visibility <> '2' AND
work.active IN (0, 1) AND
work.post_group_id = $groupId AND
session_id = $sessionId
work.post_group_id = $groupId
$sessionCondition
";
} else {

@ -22,12 +22,6 @@ $interbreadcrumb[] = array ('url' => 'work.php', 'name' => get_lang('StudentPubl
$my_folder_data = get_work_data_by_id($work['parent_id']);
$courseInfo = api_get_course_info();
/*allowOnlySubscribedUser(
api_get_user_id(),
$work['parent_id'],
$courseInfo['real_id']
);*/
protectWork(api_get_course_info(), $work['parent_id']);
$isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(

@ -41,12 +41,12 @@ function display_action_links($id, $cur_dir_path, $action)
if (api_is_allowed_to_edit(null, true) && $origin != 'learnpath') {
// Create dir
if (empty($id)) {
$display_output .= '<a href="'.api_get_self().'?'.api_get_cidreq().'&amp;action=create_dir&origin='.$origin.'&gradebook='.$gradebook.'">';
$display_output .= '<a href="'.api_get_self().'?'.api_get_cidreq().'&action=create_dir&origin='.$origin.'&gradebook='.$gradebook.'">';
$display_output .= Display::return_icon('new_work.png', get_lang('CreateAssignment'),'',ICON_SIZE_MEDIUM).'</a>';
}
if (empty($id)) {
// Options
$display_output .= '<a href="'.api_get_self().'?'.api_get_cidreq().'&amp;action=settings&amp;origin='.$origin.'&amp;gradebook='.$gradebook.'">';
$display_output .= '<a href="'.api_get_self().'?'.api_get_cidreq().'&action=settings&origin='.$origin.'&gradebook='.$gradebook.'">';
$display_output .= Display::return_icon('settings.png', get_lang('EditToolOptions'),'',ICON_SIZE_MEDIUM).'</a>';
}
}
@ -1922,6 +1922,8 @@ function get_work_user_list(
$url = api_get_path(WEB_CODE_PATH).'work/';
$unoconv = api_get_configuration_value('unoconv.binaries');
while ($work = Database::fetch_array($result, 'ASSOC')) {
$item_id = $work['id'];
@ -2043,9 +2045,47 @@ function get_work_user_list(
$action = '';
if (api_is_allowed_to_edit()) {
$action .= '<a href="'.$url.'view.php?'.api_get_cidreq().'&id='.$item_id.'" title="'.get_lang('View').'">'.
$action .= $item_id.'<a href="'.$url.'view.php?'.api_get_cidreq().'&id='.$item_id.'" title="'.get_lang('View').'">'.
Display::return_icon('default.png', get_lang('View'),array(), ICON_SIZE_SMALL).'</a> ';
if ($unoconv && empty($work['contains_file'])) {
$action .= '<a href="'.$url.'work_list_all.php?'.api_get_cidreq().'&id='.$work_id.'&action=export_to_doc&item_id='.$item_id.'" title="'.get_lang('ExportToDoc').'" >'.
Display::return_icon('export_doc.png', get_lang('ExportToDoc'),array(), ICON_SIZE_SMALL).'</a> ';
}
$action .= '
<form
id="file_upload_'.$item_id.'"
class="work_correction_upload file_upload file_upload_small"
action="'.api_get_path(WEB_AJAX_PATH).'work.ajax.php?'.api_get_cidreq().'&a=upload_correction_file&item_id='.$item_id.'" method="POST" enctype="multipart/form-data">
<input type="file" name="file" multiple>
<button type="submit">Upload</button>
</form>
';
$action .= "
<script>
$(document).ready(function() {
$('#file_upload_".$item_id."').fileUploadUI({
uploadTable: $('.files'),
downloadTable: $('.files'),
buildUploadRow: function (files, index) {
$('.files').show();
return $('<tr><td>' + files[index].name + '<\/td>' +
'<td class=\"file_upload_progress\"><div><\/div><\/td>' +
'<td class=\"file_upload_cancel\">' +
'<button class=\"ui-state-default ui-corner-all\" title=\"".get_lang('Cancel')."\">' +
'<span class=\"ui-icon ui-icon-cancel\">".get_lang('Cancel')."<\/span>' +'<\/button>'+
'<\/td><\/tr>');
},
buildDownloadRow: function (file) {
return $('<tr><td>' + file.name + '<\/td> <td> ' + file.size + ' <\/td> <td>&nbsp;' + file.result + ' <\/td> <\/tr>');
}
});
});
</script>
";
if ($locked) {
if ($qualification_exists) {
$action .= Display::return_icon('rate_work_na.png', get_lang('CorrectAndRate'),array(), ICON_SIZE_SMALL);
@ -2082,7 +2122,7 @@ function get_work_user_list(
if ($locked) {
$action .= Display::return_icon('delete_na.png', get_lang('Delete'), '', ICON_SIZE_SMALL);
} else {
$action .= '<a href="'.$url.'work_list_all.php?'.api_get_cidreq().'&id='.$work_id.'&action=delete&amp;item_id='.$item_id.'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'),ENT_QUOTES))."'".')) return false;" title="'.get_lang('Delete').'" >'.
$action .= '<a href="'.$url.'work_list_all.php?'.api_get_cidreq().'&id='.$work_id.'&action=delete&item_id='.$item_id.'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'),ENT_QUOTES))."'".')) return false;" title="'.get_lang('Delete').'" >'.
Display::return_icon('delete.png', get_lang('Delete'),'',ICON_SIZE_SMALL).'</a>';
}
} elseif ($is_author && (empty($work['qualificator_id']) || $work['qualificator_id'] == 0)) {
@ -3357,9 +3397,12 @@ function setWorkUploadForm($form, $uploadFormType = 0)
/**
* @param array $my_folder_data
* @param array $_course
* @param bool $isCorrection
* @param array $workInfo
*
* @return array
*/
function uploadWork($my_folder_data, $_course)
function uploadWork($my_folder_data, $_course, $isCorrection = false, $workInfo = [])
{
if (empty($_FILES['file']['size'])) {
return array('error' => Display :: return_message(get_lang('UplUploadFailedSizeIsZero'), 'error'));
@ -3394,6 +3437,15 @@ function uploadWork($my_folder_data, $_course)
// Compose a unique file name to avoid any conflict
$new_file_name = api_get_unique_id();
if ($isCorrection) {
if (!empty($workInfo['url'])) {
$new_file_name = basename($workInfo['url']).'_correction';
} else {
$new_file_name = $new_file_name.'_correction';
}
}
$curdirpath = basename($my_folder_data['url']);
// If we come from the group tools the groupid will be saved in $work_table
@ -3563,6 +3615,7 @@ function processWorkForm($workInfo, $values, $courseInfo, $sessionId, $groupId,
$sql = "INSERT INTO ".$work_table." SET
c_id = $courseId ,
url = '".$url . "',
filetype = 'file',
title = '".Database::escape_string($title)."',
description = '".Database::escape_string($description)."',
contains_file = '".$contains_file."',
@ -4434,36 +4487,48 @@ function getWorkUserListData(
/**
* @param int $id
* @param array $course_info
* @param bool $download
* @param bool $isCorrection
*
* @return bool
*/
function getFile($id, $course_info, $download = true)
function downloadFile($id, $course_info, $isCorrection)
{
$file = getFileContents($id, $course_info);
if (!empty($file) && is_array($file)) {
return DocumentManager::file_send_for_download($file['path'], $download, $file['title']);
}
return false;
return getFile($id, $course_info, true, $isCorrection);
}
/**
* @param int $id
* @param array $course_info
* @param bool $download
* @param bool $isCorrection
*
* @return bool
*/
function downloadFile($id, $course_info)
function getFile($id, $course_info, $download = true, $isCorrection = false)
{
return getFile($id, $course_info, true);
$file = getFileContents($id, $course_info, 0, $isCorrection);
if (!empty($file) && is_array($file)) {
return DocumentManager::file_send_for_download(
$file['path'],
$download,
$file['title']
);
}
return false;
}
/**
* Get the file contents for an assigment
* @param int $id
* @param array $course_info
* @param int Session ID
* @param $correction
*
* @return array|bool
*/
function getFileContents($id, $course_info, $sessionId = 0)
function getFileContents($id, $course_info, $sessionId = 0, $correction = false)
{
$id = intval($id);
if (empty($course_info) || empty($id)) {
@ -4473,18 +4538,38 @@ function getFileContents($id, $course_info, $sessionId = 0)
$sessionId = api_get_session_id();
}
$tbl_student_publication = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
$table = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
if (!empty($course_info['real_id'])) {
$sql = 'SELECT * FROM '.$tbl_student_publication.'
$sql = 'SELECT *
FROM '.$table.'
WHERE c_id = '.$course_info['real_id'].' AND id = "'.$id.'"';
$result = Database::query($sql);
if ($result && Database::num_rows($result)) {
$row = Database::fetch_array($result, 'ASSOC');
if ($correction) {
$row['url'] = $row['url_correction'];
}
if (empty($row['url'])) {
return false;
}
$full_file_name = api_get_path(SYS_COURSE_PATH).api_get_course_path().'/'.$row['url'];
$item_info = api_get_item_property_info(api_get_course_int_id(), 'work', $row['id'], $sessionId);
allowOnlySubscribedUser(api_get_user_id(), $row['parent_id'], $course_info['real_id']);
$item_info = api_get_item_property_info(
api_get_course_int_id(),
'work',
$row['id'],
$sessionId
);
allowOnlySubscribedUser(
api_get_user_id(),
$row['parent_id'],
$course_info['real_id']
);
if (empty($item_info)) {
api_not_allowed();
@ -4518,7 +4603,7 @@ function getFileContents($id, $course_info, $sessionId = 0)
(editor = teacher + admin + anybody with right api_is_allowed_to_edit)
*/
$work_is_visible = ($item_info['visibility'] == 1 && $row['accepted'] == 1);
$work_is_visible = $item_info['visibility'] == 1 && $row['accepted'] == 1;
$doc_visible_for_all = ($course_info['show_score'] == 1);
$is_editor = api_is_allowed_to_edit(true, true, true);
@ -4529,9 +4614,13 @@ function getFileContents($id, $course_info, $sessionId = 0)
($doc_visible_for_all && $work_is_visible)
) {
$title = $row['title'];
if ($correction) {
$title = $row['title_correction'];
}
if (array_key_exists('filename', $row) && !empty($row['filename'])) {
$title = $row['filename'];
}
$title = str_replace(' ', '_', $title);
Event::event_download($title);
if (Security::check_abs_path(
@ -4540,7 +4629,8 @@ function getFileContents($id, $course_info, $sessionId = 0)
) {
return array(
'path' => $full_file_name,
'title' => $title
'title' => $title,
'title_correction' => $row['title_correction']
);
}
}

@ -89,6 +89,16 @@ $itemId = isset($_REQUEST['item_id']) ? intval($_REQUEST['item_id']) : null;
$message = null;
switch ($action) {
case 'export_to_doc':
if ($is_allowed_to_edit) {
if (!empty($itemId)) {
$work = get_work_data_by_id($itemId);
if (!empty($work)) {
Export::htmlToOdt($work['description'], $work['title']);
}
}
}
break;
case 'delete':
/* Delete document */
if ($itemId) {
@ -132,6 +142,8 @@ switch ($action) {
break;
}
$htmlHeadXtra[] = api_get_jquery_libraries_js(array('jquery-upload'));
Display :: display_header(null);
echo $message;
@ -146,6 +158,9 @@ if (api_is_allowed_to_session_edit(false, true) && !empty($workId) && !$isDrhOfC
/*echo '<a href="'.api_get_path(WEB_CODE_PATH).'work/upload.php?'.api_get_cidreq().'&id='.$workId.'">';
echo Display::return_icon('upload_file.png', get_lang('UploadADocument'), '', ICON_SIZE_MEDIUM).'</a>';*/
echo '<a href="'.api_get_path(WEB_CODE_PATH).'work/upload_corrections.php?'.api_get_cidreq().'&id='.$workId.'">';
echo Display::return_icon('upload_file.png', get_lang('UploadCorrections'), '', ICON_SIZE_MEDIUM).'</a>';
echo '<a href="'.api_get_path(WEB_CODE_PATH).'work/add_document.php?'.api_get_cidreq().'&id='.$workId.'">';
echo Display::return_icon('new_document.png', get_lang('AddDocument'), '', ICON_SIZE_MEDIUM).'</a>';
@ -231,15 +246,25 @@ if (!empty($work_data['enable_qualification']) &&
array('name'=>'lastname', 'index'=>'lastname', 'width'=>'35', 'align'=>'left', 'search' => 'true'),
array('name'=>'title', 'index'=>'title', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'wrap_cell' => "true"),
array('name'=>'qualification', 'index'=>'qualification', 'width'=>'25', 'align'=>'left', 'search' => 'true'),
array('name'=>'sent_date', 'index'=>'sent_date', 'width'=>'45', 'align'=>'left', 'search' => 'true', 'wrap_cell' => 'true'),
array('name'=>'actions', 'index'=>'actions', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'sortable'=>'false', 'wrap_cell' => 'true')
array('name'=>'sent_date', 'index'=>'sent_date', 'width'=>'30', 'align'=>'left', 'search' => 'true', 'wrap_cell' => 'true'),
array(
'name' => 'actions',
'index' => 'actions',
'width' => '40',
'align' => 'left',
'search' => 'false',
'sortable' => 'false'
//'wrap_cell' => 'true',
)
);
}
$extra_params = array(
'autowidth' => 'true',
'height' => 'auto',
'sortname' => 'firstname'
'sortname' => 'firstname',
'sortable' => 'false'
);
$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_work_user_list_all&work_id='.$workId.'&type='.$type;
@ -250,9 +275,18 @@ $(function() {
echo Display::grid_js('results', $url, $columns, $column_model, $extra_params);
?>
});
</script>
<?php
echo $documentsAddedInWork;
echo Display::grid_html('results');
echo '<table style="display:none; width:50%" class="files data_table">
<tr>
<th>'.get_lang('FileName').'</th>
<th>'.get_lang('Size').'</th>
<th>'.get_lang('Status').'</th>
</tr>
</table>';
Display :: display_footer();

@ -0,0 +1,32 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Migrations\Schema\V110;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Doctrine\DBAL\Schema\Schema;
/**
* Class Version20150713132630
* @package Chamilo\CoreBundle\Migrations\Schema\V110
*/
class Version20150713132630 extends AbstractMigrationChamilo
{
/**
* @param Schema $schema
*/
public function up(Schema $schema)
{
$this->addSql('ALTER TABLE c_student_publication ADD url_correction VARCHAR(255) DEFAULT NULL');
$this->addSql('ALTER TABLE c_student_publication ADD title_correction VARCHAR(255) DEFAULT NULL');
}
/**
* @param Schema $schema
*/
public function down(Schema $schema)
{
$this->addSql('ALTER TABLE c_student_publication DROP url_correction');
$this->addSql('ALTER TABLE c_student_publication DROP title_correction');
}
}

@ -43,6 +43,13 @@ class CStudentPublication
*/
private $url;
/**
* @var string
*
* @ORM\Column(name="url_correction", type="string", length=255, nullable=true)
*/
private $urlCorrection;
/**
* @var string
*
@ -50,6 +57,13 @@ class CStudentPublication
*/
private $title;
/**
* @var string
*
* @ORM\Column(name="title_correction", type="string", length=255, nullable=true)
*/
private $titleCorrection;
/**
* @var string
*
@ -681,4 +695,36 @@ class CStudentPublication
{
return $this->cId;
}
/**
* @return string
*/
public function getUrlCorrection()
{
return $this->urlCorrection;
}
/**
* @param string $urlCorrection
*/
public function setUrlCorrection($urlCorrection)
{
$this->urlCorrection = $urlCorrection;
}
/**
* @return string
*/
public function getTitleCorrection()
{
return $this->titleCorrection;
}
/**
* @param string $titleCorrection
*/
public function setTitleCorrection($titleCorrection)
{
$this->titleCorrection = $titleCorrection;
}
}

Loading…
Cancel
Save