Développer avec RBS Change : [Résolu] Création de document à partir du code
-
13/11/2012 23:51
Bonjour,
j'ai un petit soucis avec la création de documents dynamiquement à partir du code.
Voici les propriétés de mon document :<document xmlns="http://www.rbs.fr/schema/change-document/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.rbs.fr/schema/change-document/1.0 http://www.rbschange.fr/static/schema/change-document/3.5.xsd" model-version="3.5" has-url="false" use-rewrite-url="false"> <properties> <add name="subscriber" type="modules_securedwld/subscriber" min-occurs="1"/> <add name="media" type="modules_securedwld/media" min-occurs="1"/> <add name="dwldtimes" type="Integer" default-value="0" min-occurs="1"/> <add name="dwldid" type="String" min-occurs="1"/> <add name="verified" type="Boolean" default-value="false"/> <add name="notified" type="Boolean" default-value="false"/> </properties> <statuses default="ACTIVE" />
Au sein d'un block, j'ai le code suivant qui se charge de l'enregistrement en base de données :$tm = f_persistentdocument_TransactionManager::getInstance(); try { $tm->beginTransaction(); // ici je setup les sous documents du document à enregistrer $mediaid = 11321; $media = securedwld_MediaService::getInstance()->getDocumentInstance($mediaid); $subid = 11453; $subscriber = securedwld_SubscriberService::getInstance()->getDocumentInstance($subid); // Here the code to be in the transaction $regs = securedwld_RegistrationService::getInstance(); $registration = $regs->getNewDocumentInstance(); $registration->setLabel('test3'); $registration->setMedia($media); $registration->setSubscriber($subscriber); $registration->setDwldid('dwldid'); $registration->setDwldtimes(0); $registration->setNotified(false); $registration->setVerified(false); $registration->save(); $tm->commit(); } catch (Exception $e) { Framework::fatal('#####TRANSACTION FAILED : '.var_export($document->getValidationErrors(), true)); throw $tm->rollBack($e); }
Quand j'affiche la page, je n'ai pas d'erreurs dans les logs, ni sur le site.
En base de données, via phpmyadmin, je retrouve bien mon document, avec les propriétés settées avec les valeurs renseignées dans mon code.
Mon problème, est quand j'essaye de requêter mes documents avec le code suivant ://récupération des documents ayant pour label test3 $regs = securedwld_RegistrationService::getInstance(); $query = $regs->createQuery() ->add(Restrictions::published()) ->add(Restrictions::eq('label','test3')); $registration = $query->find(); Framework::fatal(__METHOD__.'#### $registration #######'.var_export($registration,true));
le log me montre que la requête fonctionne, qu'elle me trouve bien le document que je viens de créer, mais toutes les propriétés du document sont séttées à NULL !securedwld_persistentdocument_registration::__set_state(array( 'm_author' => NULL, 'm_authorid' => NULL, 'm_creationdate' => NULL, 'm_modificationdate' => NULL, 'm_publicationstatus' => NULL, 'm_modelversion' => NULL, 'm_documentversion' => NULL, 'm_startpublicationdate' => NULL, 'm_endpublicationdate' => NULL, 'm_metastring' => NULL, 'm_subscriber' => NULL, 'm_media' => NULL, 'm_dwldtimes' => NULL, 'm_dwldid' => NULL, 'm_verified' => NULL, 'm_notified' => NULL, 'm_persistentState' => 2, 'm_id' => 11511, 'm_treeId' => NULL, 'm_providerId' => NULL, 'm_i18nInfo' => I18nInfo::__set_state(array( 'm_vo' => 'fr', 'm_labels' => array ( 'fr' => 'test3', ), )), 'validationErrors' => NULL, 'modifiedProperties' => array ( ), 'modifiedPropertyValues' => array ( ), 'm_documentInverse' => NULL, 'is_i18InfoModified' => false, 'insertInTree' => true, '_parentNodeId' => NULL, 'm_metas' => NULL, 'metasModified' => false, 'i18nVoObject' => NULL, )), )
Sauf : l'id du document (qui correspond bien à celui que je vois via phpmyadmin, et le label du document.
Du coup, le document récupéré n'est pas considéré comme un document de type modules_securedwld/registration et ne peut donc pas être manipulé dans la suite de mon code...
Need help
Développe sous linux Ubuntu 12.04 LTS Desktop
Projet ecommerce core 3.6.7 -
Bonjour,
A priori le symptôme que vous décrivez s'explique simplement par le fait que lorsqu'un document est instancié, ses données ne sont pas chargées immédiatement (seules les informations présentes dans f_document le sont : id, modèle, labels dans les différentes langues). Les autres données ne sont chargées que lorsque vous utilisez un getter ou un setter sur le document (hors getLabel puisqu'il est déjà chargé depuis f_document). C'est le rôle de l'appel à $this->checkLoaded(); que vous trouvez à de nombreux endroits dans les classes de base des documents générées dans le dossier build.
Ce chargement en deux temps est fait pour alléger les instanciations, notamment sur les requêtes qui renvoient un grand nombre d'instances qui ne seront pas forcément toutes utilisées.Édité par Gaël Port 14/11/2012 09:02
-
Bonjour Gaël,
au temps pour moi... j'essayai d'appliquer les getter sur le tableau de résultat de l'objet query et non sur une instance du document.
Ca marche bien sur mon block de test depuis que j'utilise la méthode findUnique()...
je vous tiens au courant si ça résout mon problème dans mon code complet
Développe sous linux Ubuntu 12.04 LTS Desktop
Projet ecommerce core 3.6.7 -
Donc pour résumer le sujet, lorsque l'on récupère un tableau de document ou une instance de document via findUnique(), il faut tout de même instancier le document en faisant par exemple :
$queryDoc = $query->findUnique(); $doc = mymodule_docService::getInstance()->getDocumentInstance($queryDoc->getId(),'modules_mymodule/doc);
A partir de là seulement j'aurai la possibilité d'accéder aux properties qui ne sont pas dans la table f_document.
Développe sous linux Ubuntu 12.04 LTS Desktop
Projet ecommerce core 3.6.7 -
Heu non, on s'est mal compris : le findUnique() renvoie bien le bon objet, inutile de le ré-instancier.
Par contre un var_dump montrera un objet "presque vide" (avec uniquement les informations présentes dans f_document : label, id essentiellement) tant qu'aucun getter ou setter n'a été appelé, car les données du document ne sont effectivement chargées que lorsqu'elles sont utilisées plutôt qu'immédiatement à l'instanciation.
EDIT : par exemple, en supposant que l'id 13771 soit celui d'une page, en exécutant le code suivant :$doc = website_persistentdocument_page::getInstanceById(13771); var_dump($doc); $doc->getIsHomePage(); var_dump($doc);
On obtient sur le premier var_dump l'équivalent de ce que vous aviez indiqué plus tôt avec de nombreuses propriétés à NULL, alors que sur le second var_dump on a bien les valeurs dans les propriétés.Édité par Gaël Port 15/11/2012 09:00
-
ah ok !
c'est plus logique en effet
Merci !
Développe sous linux Ubuntu 12.04 LTS Desktop
Projet ecommerce core 3.6.7
Merci de prendre connaissance et de respecter les règles des forums.