commit
8928373318
@ -0,0 +1,49 @@ |
|||||||
|
<?php |
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Controller\Api; |
||||||
|
|
||||||
|
use Chamilo\CourseBundle\Entity\CLink; |
||||||
|
use Chamilo\CourseBundle\Repository\CShortcutRepository; |
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; |
||||||
|
use Symfony\Component\HttpFoundation\Response; |
||||||
|
|
||||||
|
class CLinkDetailsController extends AbstractController |
||||||
|
{ |
||||||
|
public function __invoke(CLink $link, CShortcutRepository $shortcutRepository): Response |
||||||
|
{ |
||||||
|
$shortcut = $shortcutRepository->getShortcutFromResource($link); |
||||||
|
$isOnHomepage = null !== $shortcut; |
||||||
|
|
||||||
|
$parentResourceNodeId = null; |
||||||
|
if ($link->getResourceNode() && $link->getResourceNode()->getParent()) { |
||||||
|
$parentResourceNodeId = $link->getResourceNode()->getParent()->getId(); |
||||||
|
} |
||||||
|
|
||||||
|
$resourceLinkList = []; |
||||||
|
if ($link->getResourceLinkEntityList()) { |
||||||
|
foreach ($link->getResourceLinkEntityList() as $resourceLink) { |
||||||
|
$resourceLinkList[] = [ |
||||||
|
'visibility' => $resourceLink->getVisibility(), |
||||||
|
'cid' => $resourceLink->getCourse()->getId(), |
||||||
|
'sid' => $resourceLink->getSession()->getId() |
||||||
|
]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$details = [ |
||||||
|
'url' => $link->getUrl(), |
||||||
|
'title' => $link->getTitle(), |
||||||
|
'description' => $link->getDescription(), |
||||||
|
'onHomepage' => $isOnHomepage, |
||||||
|
'target' => $link->getTarget(), |
||||||
|
'parentResourceNodeId' => $parentResourceNodeId, |
||||||
|
'resourceLinkList' => $resourceLinkList, |
||||||
|
'category' => $link->getCategory()?->getIid(), |
||||||
|
]; |
||||||
|
|
||||||
|
return $this->json($details, Response::HTTP_OK); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
<?php |
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Controller\Api; |
||||||
|
|
||||||
|
use Chamilo\CoreBundle\Settings\SettingsManager; |
||||||
|
use Chamilo\CourseBundle\Entity\CLink; |
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; |
||||||
|
use Symfony\Component\HttpFoundation\JsonResponse; |
||||||
|
use Symfony\Component\HttpFoundation\Request; |
||||||
|
|
||||||
|
class CheckCLinkAction extends AbstractController |
||||||
|
{ |
||||||
|
public function __invoke(CLink $link, Request $request, SettingsManager $settingsManager): JsonResponse |
||||||
|
{ |
||||||
|
$url = $request->query->get('url'); |
||||||
|
$result = $this->checkUrl($url, $settingsManager); |
||||||
|
|
||||||
|
return new JsonResponse(['isValid' => $result]); |
||||||
|
} |
||||||
|
|
||||||
|
private function checkUrl(string $url, SettingsManager $settingsManager): bool |
||||||
|
{ |
||||||
|
// Check if curl is available. |
||||||
|
if (!\in_array('curl', get_loaded_extensions())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
// set URL and other appropriate options |
||||||
|
$defaults = [ |
||||||
|
CURLOPT_URL => $url, |
||||||
|
CURLOPT_FOLLOWLOCATION => true, // follow redirects |
||||||
|
CURLOPT_HEADER => 0, |
||||||
|
CURLOPT_RETURNTRANSFER => true, |
||||||
|
CURLOPT_TIMEOUT => 4, |
||||||
|
]; |
||||||
|
|
||||||
|
// Check for proxy settings in your application configuration |
||||||
|
$proxySettings = $settingsManager->getSetting('platform.proxy_settings', true); |
||||||
|
if ($proxySettings && isset($proxySettings['curl_setopt_array'])) { |
||||||
|
$defaults[CURLOPT_PROXY] = $proxySettings['curl_setopt_array']['CURLOPT_PROXY']; |
||||||
|
$defaults[CURLOPT_PROXYPORT] = $proxySettings['curl_setopt_array']['CURLOPT_PROXYPORT']; |
||||||
|
} |
||||||
|
|
||||||
|
// Create a new cURL resource |
||||||
|
$ch = curl_init(); |
||||||
|
curl_setopt_array($ch, $defaults); |
||||||
|
|
||||||
|
// grab URL and pass it to the browser |
||||||
|
ob_start(); |
||||||
|
$result = curl_exec($ch); |
||||||
|
ob_get_clean(); |
||||||
|
|
||||||
|
// close cURL resource, and free up system resources |
||||||
|
curl_close($ch); |
||||||
|
|
||||||
|
// Check for any errors |
||||||
|
if ($result === false || curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,72 @@ |
|||||||
|
<?php |
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Migrations\Schema\V200; |
||||||
|
|
||||||
|
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo; |
||||||
|
use Chamilo\CourseBundle\Entity\CLink; |
||||||
|
use Chamilo\CourseBundle\Repository\CLinkRepository; |
||||||
|
use Chamilo\CourseBundle\Repository\CShortcutRepository; |
||||||
|
use Doctrine\DBAL\Schema\Schema; |
||||||
|
|
||||||
|
class Version20240202122300 extends AbstractMigrationChamilo |
||||||
|
{ |
||||||
|
public function getDescription(): string |
||||||
|
{ |
||||||
|
return 'Create shortcuts for c_link entries with on_homepage = 1'; |
||||||
|
} |
||||||
|
|
||||||
|
public function up(Schema $schema): void |
||||||
|
{ |
||||||
|
$container = $this->getContainer(); |
||||||
|
$doctrine = $container->get('doctrine'); |
||||||
|
|
||||||
|
$em = $doctrine->getManager(); |
||||||
|
$connection = $em->getConnection(); |
||||||
|
|
||||||
|
$admin = $this->getAdmin(); |
||||||
|
|
||||||
|
$linkRepo = $container->get(CLinkRepository::class); |
||||||
|
$shortcutRepo = $container->get(CShortcutRepository::class); |
||||||
|
|
||||||
|
$sql = 'SELECT * FROM c_link WHERE on_homepage = 1'; |
||||||
|
$stmt = $connection->prepare($sql); |
||||||
|
$result = $stmt->executeQuery(); |
||||||
|
|
||||||
|
while ($row = $result->fetchAssociative()) { |
||||||
|
$linkId = $row['iid']; |
||||||
|
|
||||||
|
/* @var CLink $link */ |
||||||
|
$link = $linkRepo->find($linkId); |
||||||
|
|
||||||
|
if (!$link) { |
||||||
|
error_log("Link with ID $linkId not found"); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
$course = $link->getFirstResourceLink()->getCourse(); |
||||||
|
$session = $link->getFirstResourceLink()->getSession(); |
||||||
|
|
||||||
|
$shortcut = $shortcutRepo->getShortcutFromResource($link); |
||||||
|
if (null === $shortcut) { |
||||||
|
try { |
||||||
|
$shortcutRepo->addShortCut($link, $admin, $course, $session); |
||||||
|
error_log("Shortcut created for link ID $linkId"); |
||||||
|
} catch (\Exception $e) { |
||||||
|
error_log("Failed to create shortcut for link ID $linkId: " . $e->getMessage()); |
||||||
|
} |
||||||
|
} else { |
||||||
|
error_log("Shortcut already exists for link ID $linkId"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$em->flush(); |
||||||
|
} |
||||||
|
|
||||||
|
public function down(Schema $schema): void |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue