src/Controller/EclacController.php line 152

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