Chamilo is a learning management system focused on ease of use and accessibility
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.
 
 
 
 
 
 
chamilo-lms/src/CoreBundle/Controller/Admin/SettingsController.php

219 lines
7.1 KiB

<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Controller\Admin;
use Chamilo\CoreBundle\Controller\BaseController;
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Traits\ControllerTrait;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Exception\ValidatorException;
/**
* @Route("/admin")
*/
class SettingsController extends BaseController
{
use ControllerTrait;
/**
* @IsGranted("ROLE_ADMIN")
*
* @Route("/settings", name="admin_settings")
*/
public function indexAction(): Response
{
$manager = $this->getSettingsManager();
$schemas = $manager->getSchemas();
return $this->render(
'@ChamiloCore/Admin/Settings/index.html.twig',
[
'schemas' => $schemas,
]
);
}
/**
* Edit configuration with given namespace.
*
* @IsGranted("ROLE_ADMIN")
*
* @Route("/settings/search_settings", name="chamilo_platform_settings_search")
*/
public function searchSettingAction(Request $request): Response
{
$manager = $this->getSettingsManager();
$formList = [];
$keyword = $request->get('keyword');
$searchForm = $this->getSearchForm();
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && $searchForm->isValid()) {
$values = $searchForm->getData();
$keyword = $values['keyword'];
}
if (empty($keyword)) {
throw $this->createNotFoundException();
}
$settingsFromKeyword = $manager->getParametersFromKeywordOrderedByCategory($keyword);
$settings = [];
if (!empty($settingsFromKeyword)) {
foreach ($settingsFromKeyword as $category => $parameterList) {
$list = [];
foreach ($parameterList as $parameter) {
$list[] = $parameter->getVariable();
}
$settings = $manager->load($category, null);
$schemaAlias = $manager->convertNameSpaceToService($category);
$form = $this->getSettingsFormFactory()->create($schemaAlias);
foreach (array_keys($settings->getParameters()) as $name) {
if (!in_array($name, $list, true)) {
$form->remove($name);
$settings->remove($name);
}
}
$form->setData($settings);
$formList[$category] = $form->createView();
}
}
$schemas = $manager->getSchemas();
return $this->render(
'@ChamiloCore/Admin/Settings/search.html.twig',
[
'keyword' => $keyword,
'schemas' => $schemas,
'settings' => $settings,
'form_list' => $formList,
'search_form' => $searchForm->createView(),
]
);
}
/**
* Edit configuration with given namespace.
*
* @IsGranted("ROLE_ADMIN")
*
* @Route("/settings/{namespace}", name="chamilo_platform_settings")
*/
public function updateSettingAction(Request $request, string $namespace): Response
{
$manager = $this->getSettingsManager();
// @todo improve get the current url entity
$urlId = $request->getSession()->get('access_url_id');
$url = $this->getDoctrine()->getRepository(AccessUrl::class)->find($urlId);
$manager->setUrl($url);
$schemaAlias = $manager->convertNameSpaceToService($namespace);
$searchForm = $this->getSearchForm();
$keyword = '';
$settingsFromKeyword = null;
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && $searchForm->isValid()) {
$values = $searchForm->getData();
$keyword = $values['keyword'];
$settingsFromKeyword = $manager->getParametersFromKeyword(
$schemaAlias,
$keyword
);
}
$keywordFromGet = $request->query->get('keyword');
if ($keywordFromGet) {
$keyword = $keywordFromGet;
$searchForm->setData([
'keyword' => $keyword,
]);
$settingsFromKeyword = $manager->getParametersFromKeyword(
$schemaAlias,
$keywordFromGet
);
}
$settings = $manager->load($namespace);
$form = $this->getSettingsFormFactory()->create($schemaAlias);
if (!empty($keyword)) {
$params = $settings->getParameters();
foreach (array_keys($params) as $name) {
if (!array_key_exists($name, $settingsFromKeyword)) {
$form->remove($name);
}
}
}
$form->setData($settings);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$messageType = 'success';
try {
$manager->save($form->getData());
$message = $this->trans('Settings have been successfully updated');
} catch (ValidatorException $validatorException) {
//$message = $this->trans($exception->getMessage(), [], 'validators');
$message = $this->trans($validatorException->getMessage());
$messageType = 'error';
}
$this->addFlash($messageType, $message);
if (!empty($keywordFromGet)) {
return $this->redirect($request->headers->get('referer'));
}
}
$schemas = $manager->getSchemas();
return $this->render(
'@ChamiloCore/Admin/Settings/default.html.twig',
[
'schemas' => $schemas,
'settings' => $settings,
'form' => $form->createView(),
'keyword' => $keyword,
'search_form' => $searchForm->createView(),
]
);
}
/**
* Sync settings from classes with the database.
*/
public function syncSettings(Request $request): void
{
$manager = $this->getSettingsManager();
// @todo improve get the current url entity
$urlId = $request->getSession()->get('access_url_id');
$url = $this->getDoctrine()->getRepository(AccessUrl::class)->find($urlId);
$manager->setUrl($url);
$manager->installSchemas($url);
}
/**
* @return FormInterface
*/
private function getSearchForm()
{
$builder = $this->container->get('form.factory')->createNamedBuilder('search');
$builder->add('keyword', TextType::class);
$builder->add('search', SubmitType::class);
return $builder->getForm();
}
}