src/Controller/EclacController.php line 237

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