Développer avec RBS Change : [Résolu] Création de document à partir du code

  • 70586.1

    13/11/2012 23:51


    Mathias
    Rang : Expert
    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
  • 70586.2 en réponse à 70586.1 écrit par Mathias

    14/11/2012 09:01


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    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

  • 70586.3 en réponse à 70586.2 écrit par Gaël Port

    14/11/2012 17:03


    Mathias
    Rang : Expert
    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
  • 70586.4 en réponse à 70586.3 écrit par Mathias

    14/11/2012 17:44


    Mathias
    Rang : Expert
    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
  • 70586.5 en réponse à 70586.4 écrit par Mathias

    15/11/2012 08:53


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    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

  • 70586.6 en réponse à 70586.5 écrit par Gaël Port

    15/11/2012 18:06


    Mathias
    Rang : Expert
    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.
 
1366 membres
Aucun membre connecté