|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Développeur Web Inscription : septembre 2008 Messages : 253 ![]() |
Hello,
J'ai remarqué que sur un objet i18n, les méthodes preUpdate(), postUpdate() ne se déclenchent que si on a modifié au moins un champs non internationalisé. Y a t-il une fonction embarquée pour gérer cette incohérence ? Sémantiquement, l'objet est modifié donc ces méthodes devraient être déclenchées. |
|
|
00
|
|
|
#2 | |||||||
|
Membre régulier
![]() Développeur Web Inscription : septembre 2008 Messages : 253 ![]() |
Après débug et génération d'un nombre incalculable d'erreurs (Rasmus Lerdorf a dur en avoir des frissons dans le dos), en remontant le cours de Doctrine,
il s'avère que ces méthodes sont en fait bien appelées. Mais ! Pas sur "monObjet" comme je m'y attendais, mais, sur l'objet : monObjetTranslation. -------- Du coup première idée, je créé monObjetTranslation.class et j'y met une méthode potUpdate(). Code :
Logique me direz vous ! Bref, --------- Donc je test avec : Code :
--------- Dernière piste ; revenir sur la solution numéro 1 et imiter la structure des objets de symfony. Code :
Citation:
Bref, au final, la solution est un puzzle : Ajouter la fonction postUpdate() dans monObjetTranslation ; objet qui n'existe pas en tant que fichier, mais créé par doctrine. Help me ! |
|||||||
|
|
00
|
|
|
#3 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Tu veux faire quoi dans ton pre et/ou post update ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#4 |
|
Membre régulier
![]() Développeur Web Inscription : septembre 2008 Messages : 253 ![]() |
Générer immédiatement des changements sur d'autres objets si n'importe quelle donnée de l'objet ou de l'objet traduit à été modifiée.
En fait c'est pour des PDF accessibles en ligne en plusieurs langues. Il faut qu'il soient toujours à jour sachant que les changements sont imprévisibles (jamais ou souvent), je veux que cela soit transparent pour la personne qui édite les données. D'ou le post update : si modifié -> générer nouveau PDF. |
|
|
00
|
|
|
#5 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Et la difficulté à générer depuis le post vu que les tables translation et leur tables d'origine ne sont pas intimement liées.
Je pré-suppose que tu utilises du code dans une autre procédure pour générer ton PDF. L'idée pourrait être de générer le fichier PDF si l'une ou l'autre (ou les deux) tables sont modifiées. Ce qui implique que dans certains cas, tu peux te retrouver avec deux générations... Voir plus si le PDF englobe 6 tables traduites, et qu'elles sont toutes modifiées. Je vois donc deux autres solutions, une génération différée, traitée par batch. La méthode post permettant alors l'inscription dans une table des "a générer" avec une vérification de l’existence d'un enregistrement de demande de génération pour ce document. L’inconvénient étant qu'il est possible (probable suivant Murphy) que l'utilisateur soit mis en présence d'un PDF avec des données dépassées (de quelques minutes, serte, mais dépassées). Une autre solution serait simplement que le code dans le post supprime le fichier PDF sans le régénérer. La génération étant alors dédiée à la lecture. On aurait alors non pas un stock de fichiers généré mais une génération "à la demande" avec une mise en cache du PDF généré. Lors de la demande de lecture, ton code vérifie l’existence, si oui, il envoie, si non, il génère et envoie. Lors de la moindre modification, le cache pour ce PDF est supprimé. Le lecteur est alors sur de toujours avoir une version récente. Tu as un accès rapide, sauf à la première demande. Ce système peut être masqué entièrement, en effet, symfony peut parfaitement router des url pour des fichier d'extention pdf et donner l'impression qu'ils existent alors qu'il sont stockés dans une base de données... La deuxième solution aurait plutôt ma préférence. D'autant que rien n'empêche que, régulièrement, le cache soit purger pour s'assurer d'une mise à jour des PDF généré (en cas de changement d'un template par exemple). Ce qui permet facilement de modifier tous les PDF sans risquer de passer plusieurs minutes à tous les régénérer d'un coup, au risque de rendre indisponible le service plus que nécessaire.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#6 | |
|
Membre régulier
![]() Développeur Web Inscription : septembre 2008 Messages : 253 ![]() |
Exactement Michel,
C'est cette deuxième solution que je cherche à mettre en place. Citation:
Si on modifie uniquement un champ internationalisé, impossible d'avoir un déclencheur qui supprime le PDF existant, puisque postUpdate n'est pas déclenché. On revient au problème de base. Sinon, il faut surcharger l'internationalisation en tant que "timestampable", puis ajouter une date de génération aux données du PDF, donc aussi le stocker. Ça m’embête un peu si j'en arrive là, c'est un site et des données déjà en ligne, je préférerais rester dans le contrôleur uniquement pour gérer tout ça. |
|
|
|
00
|
|
|
#7 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
L'idéal serait d'être dans le modèle plutôt que dans le contrôleur.
Et utiliser postSave() du modèle pourrait être une solution. Ensuite, je ne sais pas comment tu comptes nommer tes fichiers mais tu as l'id de base dans la table traduite, donc, au pire et au prix d'une requête, tu as le nom du fichier. Il conviendrait donc de générer sur ta classe matableTable.class.php une méthode statique du style supprimeCachePourId() qui prendrait l'Id en paramètre. Et supprime le cache correspondant. Il faudra alors mettre cette appel dans la table Et dans la translationtable.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() Développeur Web Inscription : septembre 2008 Messages : 253 ![]() |
C'est bien ça.
Le soucis est toujours le même. Je ne peux pas réécrire monObjetTranslation.class pour y ajouter un appel à une quelconque fonction, car il est créé par Doctrine automatiquement. |
|
|
00
|
|
|
#9 | |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Citation:
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
|
00
|
|
|
#10 | ||
|
Membre régulier
![]() Développeur Web Inscription : septembre 2008 Messages : 253 ![]() |
C'est peut-être là qu'on ne se comprend pas.
Mon objet s'appelle "Document" en l'occurence. On peut le résumer à ça : Code :
lib/model/doctrine/Document.class.php lib/model/doctrine/base/BaseDocument.class.php Mais DocumentTranslation.class.php n'est pas généré. En le créant à la main, il y a une erreur (fonctions manquantes). Car, doctrine le génère virtuellement dans son code. Donc impossible de le réécrire et d'y ajouter mes méthodes. |
||
|
|
00
|
|
|
#11 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Je comprend vite, à condition que l'on me parle longuement !
Juste comme cela, un objet du modèle ayant été modifié returne isModified() a true. Il est possible de forcer le isModified à parcourir toute l’arborescence des objets liés par isModified(true) . Est-ce que dans ton cas tu ne pourrais pas utiliser ceci, avant la sauvegarde, pour effacer le cache ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() Développeur Web Inscription : septembre 2008 Messages : 253 ![]() |
C'est une piste qui n'a rien donné non plus.
Finalement, j'ai réécris processForm dans l'action. N'importe quelle modification appel cette fonction. Dedans je supprime le fichier existant. Il est recréé lorsque l'on rappelle pour la première fois le PDF. Je cherche toujours à faire des trucs bizarres ! |
|
|
00
|
|
|
#13 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Cette solution ne me semble pas bizarre et me semble très réaliste.
Bonne chance !
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
Copyright © 2000-2012 - www.developpez.com