src/Controller/EclacController.php line 200

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  12. use Symfony\Component\HttpKernel\KernelInterface;
  13. // Security
  14. use Symfony\Component\Security\Core\Security;
  15. // PDF
  16. use Knp\Snappy\Pdf;
  17. // DateTime
  18. use DateTime;
  19. // Files
  20. use Symfony\Component\String\Slugger\SluggerInterface;
  21. // Controller
  22. use App\Controller\PretraitementController;
  23. // Classes
  24. use App\Entity\Utilisateur;
  25. use App\Entity\Eleve;
  26. use App\Entity\Enseignant;
  27. use App\Entity\Enseignantcours;
  28. use App\Entity\Cursus;
  29. use App\Entity\Anneeuniversitaire;
  30. use App\Entity\Semestre;
  31. use App\Entity\Typecours;
  32. use App\Entity\Qualification;
  33. use App\Entity\Competence;
  34. use App\Entity\Composante;
  35. use App\Entity\Diplome;
  36. use App\Entity\Note;
  37. use App\Entity\Niveau;
  38. use App\Entity\Fichier;
  39. use App\Entity\Statutimport;
  40. use App\Entity\Csvcours;
  41. use App\Entity\Csvevaluationepreuve;
  42. use App\Entity\Csvdiplome;
  43. use App\Entity\Csveleve;
  44. use App\Entity\Csvnote;
  45. use App\Entity\Csvcoursgenerique;
  46. use App\Entity\Csvepreuvegenerique;
  47. use App\Entity\Csvenseignantgenerique;
  48. use App\Entity\Csvenseignantcoursgenerique;
  49. use App\Entity\Csvelevegenerique;
  50. use App\Entity\Csvelevecoursgenerique;
  51. use App\Entity\Cours;
  52. use App\Entity\Epreuve;
  53. use App\Entity\Evaluation;
  54. use App\Entity\Evaluationeleve;
  55. use App\Entity\Inscription;
  56. use App\Entity\Typeimport;
  57. use App\Entity\Modelenotif;
  58. use App\Entity\Parametre;
  59. #[Route('/secured')]
  60. class EclacController extends AbstractController
  61. {
  62. public string $versionapp = "v1.3.0";
  63. public string $app_env;
  64. public bool $app_public;
  65. public string $php_version;
  66. public string $projectDir;
  67. public function __construct(
  68. public Security $security,
  69. private Pdf $knpSnappyPdf,
  70. private EntityManagerInterface $entityManager,
  71. private SluggerInterface $slugger,
  72. private PretraitementController $PretraitementController,
  73. private RequestStack $requestStack,
  74. private UrlGeneratorInterface $urlGenerator,
  75. private ParameterBagInterface $params,
  76. private KernelInterface $kernel,
  77. ) {
  78. $this->app_env = $params->get('app_env');
  79. $this->app_public = $params->get('app_public');
  80. $this->php_version = $params->get('php_version');
  81. $this->projectDir = $kernel->getProjectDir();
  82. if ($this->requestStack->getCurrentRequest() != null) {
  83. if ($this->requestStack->getCurrentRequest()->hasSession()) {
  84. $session = $this->requestStack->getSession();
  85. // Variable session parametre
  86. $parametre = $this->entityManager->getRepository(Parametre::class)->findOneBy(array(
  87. 'idparametre' => 1
  88. ));
  89. $session->set('parametre', $parametre);
  90. // Variable session élève DEMO
  91. $jeanneDupont = $this->entityManager->getRepository(Eleve::class)->findOneBy(array(
  92. 'numeroidentification' => "DEMO"
  93. ));
  94. if ($jeanneDupont != null) {
  95. $session->set('jeanneDupont', true);
  96. $session->set('jeanneDupontNom', $jeanneDupont->getPrenomeleve() . ' ' . $jeanneDupont->getNomeleve());
  97. } else {
  98. $session->set('jeanneDupont', false);
  99. $session->set('jeanneDupontNom', null);
  100. }
  101. // Variable session élève DEMOFINALE
  102. $jeanDupont = $this->entityManager->getRepository(Eleve::class)->findOneBy(array(
  103. 'numeroidentification' => "DEMOFINALE"
  104. ));
  105. if ($jeanDupont != null) {
  106. $session->set('jeanDupont', true);
  107. $session->set('jeanDupontNom', $jeanDupont->getPrenomeleve() . ' ' . $jeanDupont->getNomeleve());
  108. } else {
  109. $session->set('jeanDupont', false);
  110. $session->set('jeanDupontNom', null);
  111. }
  112. // Variable session anneeUniversitaire
  113. $now = new DateTime('now');
  114. if ($session->get('anneeUniversitaire') == null) {
  115. $anneesuniversitaire = $entityManager->getRepository(Anneeuniversitaire::class)->findAll();
  116. // On recherche si une année existe pour la date actuelle
  117. $query = $entityManager
  118. ->createQuery(
  119. 'SELECT a
  120. FROM App\Entity\Anneeuniversitaire a
  121. WHERE a.datedebut <= :now
  122. AND a.datefin >= :now'
  123. )
  124. ->setParameter('now', $now);
  125. $anneeUniversitaireQuery = $query->getResult();
  126. // Si oui, on la définit en session
  127. if (!empty($anneeUniversitaireQuery)) {
  128. $session->set('anneeUniversitaire', $anneeUniversitaireQuery[0]);
  129. } // Sinon on choisit la dernière année créée
  130. else {
  131. $session->set('anneeUniversitaire', $anneesuniversitaire[0]);
  132. }
  133. }
  134. // Variable session cursus
  135. if ($session->get('cursus') == null) {
  136. $cursus = $entityManager->getRepository(Cursus::class)->findAll();
  137. $query = $entityManager
  138. ->createQuery(
  139. 'SELECT c
  140. FROM App\Entity\Cursus c
  141. ORDER BY c.libellecursus ASC'
  142. );
  143. $cursus = $query->getResult();
  144. $session->set('cursus', $cursus[0]);
  145. }
  146. $importsEnErreur = $this->entityManager->getRepository(Fichier::class)->findBy(array(
  147. "statutimport" => 3,
  148. ));
  149. if (!empty($importsEnErreur)) {
  150. $session->set('importEnErreur', true);
  151. } else {
  152. $session->set('importEnErreur', false);
  153. }
  154. if ($parametre->isModemaintenance()) {
  155. $session->set('modeMaintenance', true);
  156. if ($session->get('droitadmin') != null) {
  157. if (str_contains($this->requestStack->getMainRequest()->getRequestUri(), '/secured/')) {
  158. if ($session->get('droitadmin') != true) {
  159. if ($this->requestStack->getMainRequest()->attributes->get('_route') != "app_eclac_maintenance"
  160. && $this->requestStack->getMainRequest()->attributes->get('_route') != "app_eclac_secure-index"
  161. && str_contains($this->requestStack->getMainRequest()->getRequestUri(), '/secured/')) {
  162. $response = new RedirectResponse($this->urlGenerator->generate('app_eclac_maintenance'));
  163. $response->send();
  164. }
  165. }
  166. }
  167. }
  168. } else {
  169. $session->set('modeMaintenance', false);
  170. }
  171. if ($this->versionapp != $parametre->getVersionapp()) {
  172. $session->set('afficheNavbarre', false);
  173. $session->set('messageMaintenance', 'messages');
  174. if ($this->requestStack->getMainRequest()->attributes->get('_route') != "app_eclac_maintenance") {
  175. $session->set('afficheNavbarre', false);
  176. $response = new RedirectResponse($this->urlGenerator->generate('app_eclac_maintenance'));
  177. $response->send();
  178. }
  179. } else {
  180. $session->set('afficheNavbarre', true);
  181. $session->set('messageMaintenance', 'libelles');
  182. }
  183. }
  184. }
  185. }
  186. #[Route('/maintenance', name: 'app_eclac_maintenance', methods: ['GET'])]
  187. public function maintenance(Request $request): Response
  188. {
  189. return $this->render('eclac/maintenance.html.twig', []);
  190. }
  191. #[Route('/', name: 'app_eclac_secure-index', methods: ['GET'])]
  192. public function secureIndex(Request $request): Response
  193. {
  194. // Variables communes
  195. $entityManager = $this->entityManager;
  196. $session = $request->getSession();
  197. // On récupère l'utilisateur
  198. $utilisateur = $entityManager->getRepository(Utilisateur::class)->findOneBy(array(
  199. 'idutilisateur' => $session->get('utilisateurconnecte')->getIdutilisateur()
  200. ));
  201. // On regarde si la personne connectée est un élève
  202. $eleve = $entityManager->getRepository(Eleve::class)->findOneBy(
  203. array(
  204. 'utilisateur' => $utilisateur->getIdutilisateur()
  205. )
  206. );
  207. if ($eleve != null) {
  208. return $this->redirectToRoute('app_ecleleve_index', [], Response::HTTP_SEE_OTHER);
  209. } else {
  210. return $this->redirectToRoute('app_public_index', [], Response::HTTP_SEE_OTHER);
  211. }
  212. }
  213. // Permet de se connecter à l'application
  214. #[Route('/choix-espace/{switch}', name: 'app_eclac_choix-espace', methods: ['GET', 'POST'], defaults: ['switch' => 'switch'])]
  215. public function choixEspace(Request $request, ?string $switch): Response
  216. {
  217. // La personne a besoin d'être identifiée pour accéder à la ressource
  218. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
  219. // Variables communes
  220. $entityManager = $this->entityManager;
  221. $session = $request->getSession();
  222. // RAZ des variables
  223. $session->set('droitadmin', false);
  224. $session->set('utilisateurconnecte', null);
  225. $eleve = null;
  226. //echo "ON est la ";die();
  227. // error_log($token->getUser()->getUserIdentifier());
  228. /*
  229. $utilisateurCAS = $this->security->getUser();
  230. // On regarde si la personne connectée est un élève
  231. $utilisateur = $entityManager->getRepository(Utilisateur::class)->findOneBy(
  232. array(
  233. 'login' => $utilisateurCAS->getUserIdentifier()
  234. )
  235. );
  236. */
  237. $utilisateurCAS = $this->security->getUser();
  238. $identifier = $utilisateurCAS->getUserIdentifier();
  239. // Entra renvoie un email (ex: ext-bruyas@em-lyon.com) ; CAS/LDAP renvoie déjà le login
  240. $login = str_contains($identifier, '@')
  241. ? strtolower(explode('@', $identifier)[0])
  242. : $identifier;
  243. $utilisateur = $entityManager->getRepository(Utilisateur::class)->findOneBy(
  244. array(
  245. 'login' => $login
  246. )
  247. );
  248. if ($utilisateur == null) {
  249. // Login non trouvé
  250. $this->addFlash('error', 'Identifiant non trouvé');
  251. return $this->redirectToRoute('app_public_index', [], Response::HTTP_SEE_OTHER);
  252. } else {
  253. $session->set('utilisateurconnecte', $utilisateur);
  254. // On regarde si la personne connectée est un élève
  255. $eleve = $entityManager->getRepository(Eleve::class)->findOneBy(
  256. array(
  257. 'utilisateur' => $utilisateur->getIdutilisateur()
  258. )
  259. );
  260. if ($eleve != null) {
  261. $session->set('utilisateur', $eleve);
  262. $session->set('typeUtilisateur', 'Élève');
  263. $session->set('droitadmin', false);
  264. $session->set('vueAdministrateur', false);
  265. }
  266. // Sinon on regarde si c'est un enseignant
  267. else {
  268. $enseignant = $entityManager->getRepository(Enseignant::class)->findOneBy(
  269. array(
  270. 'utilisateur' => $utilisateur->getIdutilisateur()
  271. )
  272. );
  273. if ($enseignant != null) {
  274. $session->set('utilisateur', $enseignant);
  275. $session->set('typeUtilisateur', 'Enseignant');
  276. $session->set('enseignant', $enseignant);
  277. // On vérifie si l'enseignant est un administrateur
  278. if ($enseignant->isAdministrateur()) {
  279. $session->set('droitadmin', true);
  280. if($switch == 'switch') {
  281. if ($session->get('vueAdministrateur') == true) {
  282. $session->set('vueAdministrateur', false);
  283. } else {
  284. $session->set('vueAdministrateur', true);
  285. }
  286. }
  287. } else {
  288. $session->set('droitadmin', false);
  289. }
  290. return $this->redirectToRoute('app_eclenseignant_index', [], Response::HTTP_SEE_OTHER);
  291. }
  292. // Sinon, il n'est ni élève, ni enseignant, il faut le déconnecter et contacter un administrateur
  293. else {
  294. return $this->redirectToRoute('app_logout', [], Response::HTTP_SEE_OTHER);
  295. }
  296. }
  297. return $this->redirectToRoute('app_ecleleve_index', [], Response::HTTP_SEE_OTHER);
  298. }
  299. }
  300. // Paramètres
  301. #[Route('/parametre', name: 'app_eclac_parametre', methods: ['GET', 'POST'])]
  302. public function parametre(Request $request): Response
  303. {
  304. // La personne a besoin d'être identifiée pour accéder à la ressource
  305. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
  306. // Variables communes
  307. $entityManager = $this->entityManager;
  308. $session = $request->getSession();
  309. if ($session->get('vueAdministrateur') != true) {
  310. $this->addFlash('error', 'Vous n\'avez pas les droits d\'accéder à cette ressource');
  311. return $this->redirectToRoute('app_eclac_choix-espace', [], Response::HTTP_SEE_OTHER);
  312. }
  313. $parametre = $entityManager->getRepository(Parametre::class)->findOneBy(array(
  314. 'idparametre' => 1
  315. ));
  316. if (isset($_POST['activeMaintenance'])) {
  317. $parametre->setModemaintenance(true);
  318. $entityManager->persist($parametre);
  319. $entityManager->flush();
  320. $session->set('modeMaintenance', true);
  321. }
  322. if (isset($_POST['desactiveMaintenance'])) {
  323. $parametre->setModemaintenance(false);
  324. $entityManager->persist($parametre);
  325. $entityManager->flush();
  326. $session->set('modeMaintenance', false);
  327. }
  328. $session->set('parametre', $parametre);
  329. $notif = $entityManager->getRepository(Modelenotif::class)->findOneBy(array(
  330. 'idmodelenotif' => 1
  331. ));
  332. return $this->renderForm('eclac/parametre.html.twig', [
  333. 'modelnotif' => $notif,
  334. ]);
  335. }
  336. // Supprime les responsables du cours
  337. public function supprResponsableCours(Cours $cours)
  338. {
  339. // Variables communes
  340. $entityManager = $this->entityManager;
  341. // Variables historisation
  342. $result = true;
  343. $query = $entityManager
  344. ->createQuery(
  345. 'SELECT ec
  346. FROM App\Entity\Enseignantcours ec
  347. JOIN ec.cours c
  348. WHERE c.idcours IN (:idcours)'
  349. )
  350. ->setParameters(array('idcours' => $cours->getIdcours()));
  351. $listesEc = $query->getResult();
  352. if (!empty($listesEc)) {
  353. // On supprime toutes les lignes des fichiers
  354. $query = $entityManager
  355. ->createQuery(
  356. 'DELETE
  357. FROM App\Entity\Enseignantcours ec
  358. WHERE ec.idenseignantcours IN (:idenseignantcours)'
  359. )
  360. ->setParameters(array('idenseignantcours' => $listesEc));
  361. if ($query->getResult() == false) {
  362. $result = false;
  363. }
  364. }
  365. return $result;
  366. }
  367. public static function overrideFile(string $file, string $contenu): void
  368. {
  369. // On vérifie que le fichier existe
  370. if (!file_exists($file)) {
  371. touch($file);
  372. }
  373. // On vérifie que le fichier est accessible en écriture
  374. if (is_writable($file)) {
  375. // On vérifie qu'on arrive à ouvrir le fichier
  376. if (!$fp = fopen($file, 'w+')) {
  377. throw new \Exception();
  378. }
  379. // On vérifie qu'on arrive à écrire le yaml dans le fichier
  380. if (fwrite($fp, $contenu) === false) {
  381. throw new \Exception();
  382. }
  383. fclose($fp);
  384. } else {
  385. throw new \Exception();
  386. }
  387. }
  388. // Permet de récupérer les composantes d'un élève
  389. public function getComposantesEleve(Eleve $eleve, bool $all)
  390. {
  391. $entityManager = $this->entityManager;
  392. // On récupère les inscriptions de l'élève
  393. $inscriptions = $entityManager->getRepository(Inscription::class)->findBy(array(
  394. "eleve" => $eleve
  395. ));
  396. // Puis tous les cours auquel il est inscrit
  397. $arrayIdcours = array();
  398. foreach ($inscriptions as $inscription) {
  399. if (!in_array($inscription->getCours()->getIdcours(), $arrayIdcours)) {
  400. array_push($arrayIdcours, $inscription->getCours()->getIdcours());
  401. }
  402. }
  403. $cours = $entityManager->getRepository(Cours::class)->findBy(array(
  404. 'idcours' => $arrayIdcours
  405. ));
  406. // On récupère toutes les épreuves de ces cours
  407. $epreuves = $entityManager->getRepository(Epreuve::class)->findBy(array('cours' => $cours));
  408. // On récupère toutes les composantes de ces épreuves
  409. $arrayIdcomposantes = array();
  410. foreach ($epreuves as $epreuve) {
  411. if ($all) {
  412. array_push($arrayIdcomposantes, $epreuve->getComposante()->getIdcomposante());
  413. } else {
  414. $arrayIdcomposantes[$epreuve->getComposante()->getCodecomposante()] = $epreuve->getComposante()->getIdcomposante();
  415. }
  416. }
  417. $composantes = $entityManager->getRepository(Composante::class)->findBy(
  418. array(
  419. 'idcomposante' => $arrayIdcomposantes,
  420. ),
  421. array(
  422. 'codecomposante' => 'ASC',
  423. 'idcomposante' => 'ASC',
  424. )
  425. );
  426. return $composantes;
  427. }
  428. // Rend propre une chaîne de caractère
  429. public static function sanitizeString(string $string, bool $file = false): string
  430. {
  431. $array = [' ' => "_",
  432. '.' => "_",
  433. '\'' => "_",
  434. '"' => "_",
  435. '…' => "",
  436. '«' => "",
  437. '»' => "",
  438. ];
  439. if ($file) {
  440. $array = [' ' => "_",
  441. '\'' => "_",
  442. '"' => "_",
  443. '…' => "",
  444. '«' => "",
  445. '»' => "",
  446. ];
  447. }
  448. return strtolower(
  449. EclacController::replaceAccent(
  450. strtr($string, $array)
  451. )
  452. );
  453. }
  454. // Remplace les accents
  455. public static function replaceAccent(string $string): string
  456. {
  457. $unwanted_array = array(
  458. 'À' => 'A',
  459. 'Á' => 'A',
  460. 'Â' => 'A',
  461. 'Ã' => 'A',
  462. 'Ä' => 'A',
  463. 'Å' => 'A',
  464. 'Æ' => 'A',
  465. 'à' => 'a',
  466. 'á' => 'a',
  467. 'â' => 'a',
  468. 'ã' => 'a',
  469. 'ä' => 'a',
  470. 'å' => 'a',
  471. 'æ' => 'a',
  472. 'Ç' => 'C',
  473. 'ç' => 'c',
  474. 'È' => 'E',
  475. 'É' => 'E',
  476. 'Ê' => 'E',
  477. 'Ë' => 'E',
  478. 'è' => 'e',
  479. 'é' => 'e',
  480. 'ê' => 'e',
  481. 'ë' => 'e',
  482. 'Ì' => 'I',
  483. 'Í' => 'I',
  484. 'Î' => 'I',
  485. 'Ï' => 'I',
  486. 'ì' => 'i',
  487. 'í' => 'i',
  488. 'î' => 'i',
  489. 'ï' => 'i',
  490. 'Ñ' => 'N',
  491. 'ñ' => 'n',
  492. 'Ò' => 'O',
  493. 'Ó' => 'O',
  494. 'Ô' => 'O',
  495. 'Õ' => 'O',
  496. 'Ö' => 'O',
  497. 'Ø' => 'O',
  498. 'ð' => 'o',
  499. 'ò' => 'o',
  500. 'ó' => 'o',
  501. 'ô' => 'o',
  502. 'õ' => 'o',
  503. 'ö' => 'o',
  504. 'Š' => 'S',
  505. 'š' => 's',
  506. 'Ù' => 'U',
  507. 'Ú' => 'U',
  508. 'Û' => 'U',
  509. 'Ü' => 'U',
  510. 'ù' => 'u',
  511. 'ú' => 'u',
  512. 'û' => 'u',
  513. 'Ý' => 'Y',
  514. 'ý' => 'y',
  515. 'Ž' => 'Z',
  516. 'ž' => 'z',
  517. 'Þ' => 'B',
  518. 'ß' => 'Ss',
  519. 'þ' => 'b',
  520. 'ÿ' => 'y',
  521. "\n" => ' '
  522. );
  523. $newString = strtr($string, $unwanted_array);
  524. return $newString;
  525. }
  526. public function createTempDoc(string $path, string $docName): string
  527. {
  528. $now = date_format(new DateTime(), ('Ymd'));
  529. $outputPathBase = "";
  530. $file = $path . $docName;
  531. if (file_exists($file)) {
  532. // On génère un random
  533. $random = "";
  534. for ($i = 1; $i < 15; $i++) {
  535. $random .= mt_rand(1, 10);
  536. }
  537. if (!is_dir($this->projectDir . "/public/docs/tmp/")) {
  538. if (!mkdir($this->projectDir . "/public/docs/tmp/", 0775, true)) {
  539. $this->addFlash('error', 'Erreur à la création du dossier');
  540. }
  541. }
  542. $pathRoot = $this->projectDir;
  543. $outputPath = "/public/docs/tmp/";
  544. $outputFile = "temp-" . $now . "-" . $random . "-" . $docName;
  545. $outputComplet = $pathRoot . $outputPath . $outputFile;
  546. $outputPathBase = "/docs/tmp/" . $outputFile;
  547. if (!copy($file, $outputComplet)) {
  548. $this->addFlash('error', 'Document non trouvé');
  549. }
  550. } else {
  551. $this->addFlash('error', 'Document non trouvé');
  552. }
  553. return $outputPathBase;
  554. }
  555. public function logError(string $string, string $typeLog): void
  556. {
  557. $now = date_format(new DateTime(), ('Y-m-d'));
  558. $hours = date_format(new DateTime(), ('H:i'));
  559. if ($string == '') {
  560. $string = "Message d'erreur non défini";
  561. }
  562. if ($typeLog == '') {
  563. $typeLog = "NC";
  564. }
  565. error_log($hours . " : " . $string . chr(13) . chr(10), 3, $this->projectDir . "/logs/" . $now . "_" . $typeLog . ".log");
  566. }
  567. public static function dateToMySQL(string $date): DateTime
  568. {
  569. $tabDate = explode('/', $date);
  570. $date = $tabDate[2].'-'.$tabDate[1].'-'.$tabDate[0];
  571. $date = new DateTime(date('Y-m-d H:i:s', strtotime($date)));
  572. return $date;
  573. }
  574. // Permet de générer un PDF à partir d'une vue twig
  575. public function generatePDF(string $html, string $path, string $url): bool
  576. {
  577. $knpSnappyPdf = $this->knpSnappyPdf;
  578. $parametre = $this->entityManager->getRepository(Parametre::class)->findOneBy(array(
  579. "idparametre" => 1,
  580. ));
  581. $header = $this->renderView('pdf/header' . $parametre->getNompdf() . '.html.twig', [
  582. "url" => $url,
  583. 'parametre' => $parametre,
  584. ]);
  585. $footer = $this->renderView('pdf/footer' . $parametre->getNompdf() . '.html.twig', [
  586. 'parametre' => $parametre,
  587. ]);
  588. try {
  589. $knpSnappyPdf->setOptions(
  590. [
  591. 'page-size' => 'A4',
  592. 'margin-top' => '1.5in',
  593. 'margin-right' => '0in',
  594. 'margin-bottom' => '0.35in',
  595. 'margin-left' => '0in',
  596. 'header-html' => $header,
  597. 'footer-html' => $footer,
  598. 'disable-smart-shrinking' => true,
  599. 'enable-local-file-access' => true,
  600. 'enable-external-links' => true,
  601. 'enable-internal-links' => true,
  602. 'enable-javascript' => true,
  603. 'debug-javascript' => true,
  604. 'javascript-delay' => 2000,
  605. 'no-stop-slow-scripts' => true,
  606. 'encoding' => 'UTF-8',
  607. 'toc' => false,
  608. 'dpi' => 96,
  609. 'zoom' => 1,
  610. 'viewport-size' => '1920x1080',
  611. ]
  612. )
  613. ->generateFromHtml($html, $path);
  614. return true;
  615. } catch (\Exception $e) {
  616. $this->logError($e->getMessage(), "generateAllDegrees");
  617. return false;
  618. }
  619. }
  620. }
  621. /* Define a Read Filter class implementing \PhpOffice\PhpSpreadsheet\Reader\IReadFilter */
  622. class ChunkReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
  623. {
  624. private $startRow = 0;
  625. private $endRow = 0;
  626. /** Set the list of rows that we want to read */
  627. public function setRows($startRow, $chunkSize)
  628. {
  629. $this->startRow = $startRow;
  630. $this->endRow = $startRow + $chunkSize;
  631. }
  632. public function readCell($columnAddress, $row, $worksheetName = '')
  633. {
  634. // Only read the heading row, and the configured rows
  635. if (($row == 1) || ($row >= $this->startRow && $row < $this->endRow)) {
  636. return true;
  637. }
  638. return false;
  639. }
  640. }