Skip to content

Commit dc36893

Browse files
Merge pull request #7440 from christianbeeznest/rna-22254
Session: Enable session duplication with session-specific content - refs BT#22254
2 parents e7ee9d8 + c2f8d49 commit dc36893

3 files changed

Lines changed: 82 additions & 21 deletions

File tree

public/main/inc/lib/course.lib.php

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4375,25 +4375,69 @@ public static function copy_course(
43754375
bool $withBaseContent = true,
43764376
bool $copySessionContent = false
43774377
) {
4378-
$course_info = api_get_course_info($source_course_code);
4379-
4380-
if (!empty($course_info)) {
4381-
$cb = new CourseBuilder('', $course_info);
4382-
$course = $cb->build($source_session_id, $source_course_code, $withBaseContent);
4383-
$restorer = new CourseRestorer($course);
4384-
$restorer->copySessionContent = $copySessionContent;
4385-
$restorer->skip_content = $params;
4386-
$restorer->restore(
4387-
$destination_course_code,
4388-
$destination_session_id,
4389-
true,
4390-
$withBaseContent
4391-
);
4378+
$courseInfo = api_get_course_info($source_course_code);
43924379

4393-
return true;
4380+
if (empty($courseInfo)) {
4381+
return false;
43944382
}
43954383

4396-
return false;
4384+
$source_session_id = (int) $source_session_id;
4385+
$destination_session_id = (int) $destination_session_id;
4386+
4387+
if (!is_array($params)) {
4388+
$params = [];
4389+
}
4390+
4391+
// If there is no valid session on source or destination, session content copy does not make sense.
4392+
if ($source_session_id <= 0 || $destination_session_id <= 0) {
4393+
$copySessionContent = false;
4394+
}
4395+
4396+
try {
4397+
// Copy base content (course-wide) into destination course base (session 0).
4398+
if ($withBaseContent) {
4399+
$cb = new CourseBuilder('', $courseInfo);
4400+
4401+
// Build only base content snapshot (session 0).
4402+
$baseCourse = $cb->build(0, $source_course_code, true);
4403+
4404+
$baseRestorer = new CourseRestorer($baseCourse);
4405+
$baseRestorer->copySessionContent = false;
4406+
$baseRestorer->skip_content = $params;
4407+
4408+
// Restore into destination base (session 0).
4409+
$baseRestorer->restore(
4410+
$destination_course_code,
4411+
0,
4412+
true,
4413+
true
4414+
);
4415+
}
4416+
4417+
// Copy session-specific content into destination session.
4418+
if ($copySessionContent) {
4419+
$cb = new CourseBuilder('', $courseInfo);
4420+
4421+
// Build only session content snapshot (no base to avoid duplicates).
4422+
$sessionCourse = $cb->build($source_session_id, $source_course_code, false);
4423+
4424+
$sessionRestorer = new CourseRestorer($sessionCourse);
4425+
$sessionRestorer->copySessionContent = true;
4426+
$sessionRestorer->skip_content = $params;
4427+
4428+
// Restore into destination session (no base).
4429+
$sessionRestorer->restore(
4430+
$destination_course_code,
4431+
$destination_session_id,
4432+
true,
4433+
false
4434+
);
4435+
}
4436+
4437+
return true;
4438+
} catch (\Throwable $e) {
4439+
return false;
4440+
}
43974441
}
43984442

43994443
/**

public/main/session/session_list.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,18 @@
158158
#session-table #gview_sessions .ui-jqgrid-pager {
159159
width: 100% !important;
160160
}
161+
#sessions_pager .ui-pg-button.ui-state-hover .ch-tool-icon,
162+
#sessions_pager .ui-pg-button:hover .ch-tool-icon,
163+
#sessions_pager .ui-pg-button.ui-state-hover .mdi,
164+
#sessions_pager .ui-pg-button:hover .mdi {
165+
color: #fff !important;
166+
-webkit-text-fill-color: #fff !important;
167+
}
168+
#sessions_pager .ui-pg-button.ui-state-hover svg,
169+
#sessions_pager .ui-pg-button:hover svg {
170+
fill: #fff !important;
171+
stroke: #fff !important;
172+
}
161173
</style>
162174
<script>
163175
$(function() {
@@ -268,7 +280,9 @@
268280
// Optional action: copy with session content
269281
$copyWithContentJs = '';
270282
if ($addSessionContent) {
271-
$iconCopyWithContent = addslashes(Display::return_icon('copy.png', get_lang('Copy with session content')));
283+
$iconCopyWithContent = addslashes(
284+
Display::getMdiIcon('content-duplicate', 'ch-tool-icon', null, 22, get_lang('Copy with session content'))
285+
);
272286
$copyWithContentJs =
273287
" + '&nbsp;<a onclick=\"if(!confirm(\\'{$confirmMsg}\\')) return false;\""
274288
." href=\"session_list.php?copy_session_content=1&list_type={$listType}&action=copy&idChecked=' + options.rowId + '\">"
@@ -552,7 +566,7 @@ function resizeSessionsGrid() {
552566
{reloadAfterSubmit:true, url: '<?php echo $deleteUrl; ?>' }, // del options
553567
prmSearch
554568
).navButtonAdd('#sessions_pager',{
555-
caption:"<?php echo addslashes(Display::return_icon('copy.png', get_lang('Copy'))); ?>",
569+
caption:"<?php echo addslashes(Display::getMdiIcon('content-duplicate', 'ch-tool-icon', null, 22, get_lang('Copy'))); ?>",
556570
buttonicon:"ui-icon ui-icon-plus",
557571
onClickButton: function(a) {
558572
var list = $("#sessions").jqGrid('getGridParam', 'selarrrow');
@@ -563,7 +577,7 @@ function resizeSessionsGrid() {
563577
}
564578
}
565579
}).navButtonAdd('#sessions_pager',{
566-
caption:"<?php echo addslashes(Display::return_icon('save_pack.png', get_lang('Courses reports'))); ?>",
580+
caption:"<?php echo addslashes(Display::getMdiIcon('archive-arrow-down', 'ch-tool-icon', null, 22, get_lang('Courses reports'))); ?>",
567581
buttonicon:"ui-icon ui-icon-plus",
568582
onClickButton: function(a) {
569583
var list = $("#sessions").jqGrid('getGridParam', 'selarrrow');
@@ -575,7 +589,7 @@ function resizeSessionsGrid() {
575589
},
576590
position:"last"
577591
}).navButtonAdd("#sessions_pager",{
578-
caption:"<?php echo addslashes(Display::return_icon('export_csv.png', get_lang('Export courses reports complete'))); ?>",
592+
caption:"<?php echo addslashes(Display::getMdiIcon('file-delimited-outline', 'ch-tool-icon', null, 22, get_lang('Export courses reports complete'))); ?>",
579593
buttonicon:"ui-icon ui-icon-plus",
580594
onClickButton: function(a) {
581595
var list = $("#sessions").jqGrid("getGridParam", "selarrrow");

src/CourseBundle/Component/CourseCopy/CourseBuilder.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,10 @@ public function build(
611611

612612
// Always try to include documents referenced inside HTML (images, attachments, etc.).
613613
if ($courseEntity instanceof CourseEntity) {
614-
$this->restoreDocumentsFromList($courseEntity, $sessionEntity);
614+
// Avoid pulling base documents into a session-only build (prevents duplicates on two-pass copy).
615+
if ($withBaseContent || null === $sessionEntity) {
616+
$this->restoreDocumentsFromList($courseEntity, $sessionEntity);
617+
}
615618
}
616619

617620
return $this->course;

0 commit comments

Comments
 (0)