Bonjour,
Dans une boucle j'appel une API pour récupérer une liste d'éléments et les enfants de cette liste.
foreach ($listes as $liste) {
$listesDTO = new DocuwareListeDTO();
$return = $this->docuware->getDocumentForListe($liste["file_cabinet_id"],true);
foreach ($return as $docDTO) {
$listesDTO->listeDocument->add($docDTO);
}
if ($log) {
$message = "\r\nDes documents ont trouvés";
$output->writeln($message);
$message = "\r\nDébut de synchronisation des documents";
$output->writeln($message);
}
// TODO : Call méthode SyncFile save $liste["file_cabinet_id"]
$this->syncFileDocuware->loadAndSaveFile($log, $listesDTO, $path, $liste["file_cabinet_id"]);
}
La méthode loadAnsSaveFile
public function loadAndSaveFile(bool $log, DocuwareListeDTO $listesDTO, string $path, string $fileCabinetId)
{
$directoryPath = $path . '/extranet/' . $fileCabinetId . '/';
// Vérifier si le répertoire existe déjà
if (!is_dir($directoryPath)) {
// Créer le répertoire
mkdir($directoryPath, 0777, true);
if ($log) {
echo "\r\nRépertoire créé avec succès.";
}
}
$listeDocuments = $listesDTO->listeDocument;
foreach ($listeDocuments as $listeDocument) {
/** @var \App\DTO\DocumentDTO $document*/
foreach ($listeDocument as $document) {
try {
$listeColonnes = new \Doctrine\Common\Collections\ArrayCollection($document->colonnes->toArray());
$this->saveData($document, $listeColonnes, $fileCabinetId);
$content = $this->docuware->getDocument($document->id, $fileCabinetId);
$directoryPathC = $path . '/crypte/' . $fileCabinetId . '/';
$directoryPathCrypte = $path . '/crypte/' . $fileCabinetId . '/' . $document->id . '.' . $document->extention;
if (!is_dir($directoryPathC)) {
// Créer le répertoire
mkdir($directoryPathC, 0777, true);
if ($log) {
echo "\r\nRépertoire créé avec succès.";
}
}
// Chemin complet du fichier sur le serveur
$documentPath = $directoryPath . $document->id . '.' . $document->extention;
// Sauvegarde du contenu dans le fichier
$result = file_put_contents($documentPath, $content);
$this->crypte_fichier($documentPath, $_ENV['AUTO_HEBERGER_SECRET'], $directoryPathCrypte);
//$this->decrypte_file($directoryPathCrypte, 'azerty',$documentPath);
// Vérification si la sauvegarde a réussi
if ($result !== false) {
// La sauvegarde a réussi
if ($log) {
echo "\r\nSauvegarde : " . $documentPath;
}
} else {
// La sauvegarde a échoué
if ($log) {
echo "\r\nErreur de sauvegarde du fichier : " . $documentPath;
}
}
} catch (Exception $ex) {
if ($log) {
echo $ex;
}
}
}
}
$this->entityManager ->flush();
}
Ma méthode saveData
public function saveData(DocumentDTO $object, ArrayCollection $listeColonne, string $fileCabinetId)
{
$fileDocument = $this->moduleSynchronisationRepository->findByIdAndFileCabinet($object->id, $fileCabinetId);
$parsed = $this->commun->get_string_between($object->DWSTOREDATETIME, '(', ')');
$parsed = preg_replace("/000/", "", $parsed, 1);
$create = date('d-m-Y H:i:s', $parsed);
$parsed = $this->commun->get_string_between($object->DWMODDATETIME, '(', ')');
$parsed = preg_replace("/000/", "", $parsed, 1);
$modify = date('d-m-Y H:i:s', $parsed);
$validUntilCreate = new DateTimeImmutable($create);
$validUntilModify = new DateTimeImmutable($modify);
if (null === $fileDocument) {
$fileDocument = new Module_Synchronisation();
}
$fileDocument
->setFileCabinetId($fileCabinetId)
->setIdDocument($object->id)
->setExtension($object->extention)
->setNumero($object->numero)
->setTaille($object->DWDOCSIZE)
->setNbpage($object->DWPAGECOUNT)
->setDateCreer($validUntilCreate)
->setDateSModifier($validUntilModify)
->setLien('/' . $fileCabinetId . '/' . $object->id . '.' . $object->extention);
foreach ($listeColonne as $col) {
$colonne_sync = $this->moduleSynchronisationColonneRepository->findOneBy(['name' => $col->name, 'module_Synchronisation' => $fileCabinetId],null,null,null);
if(null === $colonne_sync)
{
$colonne_sync = new Module_Synchronisation_Colonne();
$fileDocument->addModuleSynchronisationColonne($colonne_sync);
}
$colonne_sync->setName($col->name);
$colonne_sync->setValue($col->value);
$this->entityManager ->persist($colonne_sync);
}
}
Mes deux relations enfants parents
class Module_Synchronisation_Colonne
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $name = null;
#[ORM\Column(length: 4000)]
private ?string $value = null;
#[ORM\ManyToOne(inversedBy: 'moduleSynchronisationColonnes', cascade: ["persist", "remove"])]
#[ORM\JoinColumn(onDelete:"CASCADE")]
private ?Module_Synchronisation $module_Synchronisation = null;
class Module_Synchronisation
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column]
private ?int $idDocument = null;
#[ORM\Column(length: 4000)]
private ?string $lien = null;
#[ORM\Column(length: 15)]
private ?string $extension = null;
#[ORM\Column(length: 255)]
private ?string $numero = null;
#[ORM\Column(length: 255)]
private ?string $fileCabinetId = null;
#[ORM\Column]
private ?int $taille = null;
#[ORM\Column]
private ?int $nbpage = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
private ?\DateTimeInterface $dateCreer = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
private ?\DateTimeInterface $dateSModifier = null;
#[ORM\OneToMany(mappedBy: 'module_Synchronisation', targetEntity: Module_Synchronisation_Colonne::class, cascade: ['persist', 'remove'])]
private Collection $moduleSynchronisationColonnes;
Ce que je veux
C'est que pour chaque boucle d'origine est d'enregistrer le parent et les enfants
Ce que j'obtiens
Le souci c'est que l'iétration suivante dans ma boucle supprime les entitées enfants de l'éléments de la boucle précédente :(