You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
259 lines
7.9 KiB
259 lines
7.9 KiB
<?php
|
|
|
|
/* For license terms, see /license.txt */
|
|
|
|
use Chamilo\CoreBundle\Entity\Course as CourseEntity;
|
|
use Chamilo\PluginBundle\Entity\TopLinks\TopLink;
|
|
use Chamilo\PluginBundle\Entity\TopLinks\TopLinkRelTool;
|
|
use Chamilo\PluginBundle\TopLinks\Form\LinkForm as TopLinkForm;
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
|
|
$cidReset = true;
|
|
|
|
require_once __DIR__.'/../../main/inc/global.inc.php';
|
|
|
|
api_protect_admin_script();
|
|
|
|
$plugin = TopLinksPlugin::create();
|
|
$httpRequest = \Symfony\Component\HttpFoundation\Request::createFromGlobals();
|
|
|
|
$pageBaseUrl = api_get_self();
|
|
$em = Database::getManager();
|
|
$linkRepo = $em->getRepository(TopLink::class);
|
|
|
|
$pageTitle = $plugin->get_title();
|
|
$pageActions = Display::url(
|
|
Display::return_icon('back.png', get_lang('Back'), [], ICON_SIZE_MEDIUM),
|
|
$pageBaseUrl
|
|
);
|
|
$pageContent = '';
|
|
|
|
$interbreadcrumb[] = [
|
|
'name' => get_lang('Administration'),
|
|
'url' => api_get_path(WEB_CODE_PATH).'admin/index.php',
|
|
];
|
|
$interbreadcrumb[] = ['name' => $plugin->get_title(), 'url' => $pageBaseUrl];
|
|
|
|
switch ($httpRequest->query->getAlpha('action', 'list')) {
|
|
case 'list':
|
|
default:
|
|
array_pop($interbreadcrumb); // Only show link to administration in breadcrumb
|
|
|
|
$pageActions = Display::url(
|
|
Display::return_icon('add.png', get_lang('AddLink'), [], ICON_SIZE_MEDIUM),
|
|
"$pageBaseUrl?".http_build_query(['action' => 'add'])
|
|
);
|
|
|
|
$table = new SortableTable(
|
|
'toplinks',
|
|
function () use ($linkRepo) {
|
|
return $linkRepo->count([]);
|
|
},
|
|
function ($offset, $limit, $column, $direction) use ($linkRepo) {
|
|
$links = $linkRepo->all($offset, $limit, $column, $direction);
|
|
|
|
return array_map(
|
|
function (TopLink $link) {
|
|
return [
|
|
[$link->getTitle(), $link->getUrl()],
|
|
$link->getId(),
|
|
];
|
|
},
|
|
$links
|
|
);
|
|
},
|
|
0
|
|
);
|
|
$table->set_header(0, get_lang('LinkName'));
|
|
$table->set_header(1, get_lang('Actions'), false, ['class' => 'th-head text-right'], ['class' => 'text-right']);
|
|
$table->set_column_filter(
|
|
0,
|
|
function (array $params) {
|
|
[$title, $url] = $params;
|
|
|
|
return "$title<br>".Display::url($url, $url);
|
|
}
|
|
);
|
|
$table->set_column_filter(
|
|
1,
|
|
function (int $id) use ($pageBaseUrl, $em, $plugin) {
|
|
$missingCourses = $em->getRepository(TopLinkRelTool::class)->getMissingCoursesForTool($id);
|
|
$countMissingCourses = count($missingCourses);
|
|
|
|
$actions = [];
|
|
$actions[] = Display::url(
|
|
Display::return_icon('edit.png', get_lang('Edit')),
|
|
"$pageBaseUrl?".http_build_query(['action' => 'edit', 'link' => $id])
|
|
);
|
|
|
|
if (count($missingCourses) > 0) {
|
|
$actions[] = Display::url(
|
|
Display::return_icon(
|
|
'view_tree.png',
|
|
sprintf($plugin->get_lang('ReplicateInXMissingCourses'), $countMissingCourses)
|
|
),
|
|
"$pageBaseUrl?".http_build_query(['action' => 'replicate', 'link' => $id])
|
|
);
|
|
} else {
|
|
$actions[] = Display::return_icon(
|
|
'view_tree_na.png',
|
|
$plugin->get_lang('AlreadyReplicatedInAllCourses')
|
|
);
|
|
}
|
|
|
|
$actions[] = Display::url(
|
|
Display::return_icon('delete.png', get_lang('Delete')),
|
|
"$pageBaseUrl?".http_build_query(['action' => 'delete', 'link' => $id])
|
|
);
|
|
|
|
return implode(PHP_EOL, $actions);
|
|
}
|
|
);
|
|
|
|
if ($table->total_number_of_items) {
|
|
$pageContent = $table->return_table();
|
|
} else {
|
|
$pageContent = Display::return_message(
|
|
get_lang('NoData'),
|
|
'info'
|
|
);
|
|
}
|
|
break;
|
|
case 'add':
|
|
$pageTitle = get_lang('LinkAdd');
|
|
|
|
$form = new TopLinkForm();
|
|
$form->createElements();
|
|
|
|
if ($form->validate()) {
|
|
$values = $form->exportValues();
|
|
|
|
$link = new TopLink();
|
|
$link
|
|
->setTitle($values['title'])
|
|
->setUrl($values['url'])
|
|
->setTarget($values['target']);
|
|
|
|
$em->persist($link);
|
|
$em->flush();
|
|
|
|
$iconPath = $form
|
|
->setLink($link)
|
|
->saveImage();
|
|
|
|
$link->setIcon($iconPath);
|
|
|
|
$em->flush();
|
|
|
|
Display::addFlash(
|
|
Display::return_message(get_lang('LinkAdded'), 'success')
|
|
);
|
|
|
|
header("Location: $pageBaseUrl");
|
|
exit;
|
|
}
|
|
|
|
$pageContent = $form->returnForm();
|
|
break;
|
|
case 'edit':
|
|
$pageTitle = get_lang('LinkMod');
|
|
|
|
$link = $em->find(TopLink::class, $httpRequest->query->getInt('link'));
|
|
|
|
if (null === $link) {
|
|
Display::addFlash(
|
|
Display::return_message(get_lang('NotFound'), 'error')
|
|
);
|
|
|
|
header("Location: $pageBaseUrl");
|
|
exit;
|
|
}
|
|
|
|
$form = new TopLinkForm($link);
|
|
$form->createElements();
|
|
|
|
if ($form->validate()) {
|
|
$values = $form->exportValues();
|
|
|
|
$iconPath = $form->saveImage();
|
|
|
|
$link
|
|
->setTitle($values['title'])
|
|
->setUrl($values['url'])
|
|
->setIcon($iconPath)
|
|
->setTarget($values['target']);
|
|
|
|
$em->flush();
|
|
|
|
$em->getRepository(TopLinkRelTool::class)->updateTools($link);
|
|
|
|
Display::addFlash(
|
|
Display::return_message(get_lang('LinkModded'), 'success')
|
|
);
|
|
|
|
header("Location: $pageBaseUrl");
|
|
exit;
|
|
}
|
|
|
|
$pageContent = $form->returnForm();
|
|
break;
|
|
case 'delete':
|
|
$link = $em->find(TopLink::class, $httpRequest->query->getInt('link'));
|
|
|
|
if (null === $link) {
|
|
Display::addFlash(
|
|
Display::return_message(get_lang('NotFound'), 'error')
|
|
);
|
|
|
|
header("Location: $pageBaseUrl");
|
|
exit;
|
|
}
|
|
|
|
if ($link->getIcon()) {
|
|
$fullIconPath = api_get_path(SYS_UPLOAD_PATH).'plugins/toplinks/'.$link->getIcon();
|
|
|
|
$fs = new Filesystem();
|
|
$fs->remove($fullIconPath);
|
|
}
|
|
|
|
$em->remove($link);
|
|
$em->flush();
|
|
|
|
Display::addFlash(
|
|
Display::return_message(get_lang('LinkDeleted'), 'success')
|
|
);
|
|
|
|
header("Location: $pageBaseUrl");
|
|
exit;
|
|
case 'replicate':
|
|
$link = $em->find(TopLink::class, $httpRequest->query->getInt('link'));
|
|
|
|
if (null === $link) {
|
|
Display::addFlash(
|
|
Display::return_message(get_lang('NotFound'), 'error')
|
|
);
|
|
|
|
header("Location: $pageBaseUrl");
|
|
exit;
|
|
}
|
|
|
|
$missingCourses = $em->getRepository(TopLinkRelTool::class)->getMissingCoursesForTool($link->getId());
|
|
|
|
/** @var CourseEntity $missingCourse */
|
|
foreach ($missingCourses as $missingCourse) {
|
|
$plugin->addToolInCourse($missingCourse->getId(), $link);
|
|
}
|
|
|
|
Display::addFlash(
|
|
Display::return_message($plugin->get_lang('LinkReplicated'), 'success')
|
|
);
|
|
|
|
header("Location: $pageBaseUrl");
|
|
exit;
|
|
}
|
|
|
|
$view = new Template($plugin->get_title());
|
|
$view->assign('header', $pageTitle);
|
|
$view->assign('actions', Display::toolbarAction('xapi_actions', [$pageActions]));
|
|
$view->assign('content', $pageContent);
|
|
$view->display_one_col_template();
|
|
|