Développer avec RBS Change : [Résolu] Création traduction produit
-
12/11/2012 15:39
Dans le cadre d'un import spécifique de données produits, nous devrions créer les entrées de libellé dans les différentes langues
Voici le bout de code de test implémenté$traduc=$product->getProvider()->getI18nDocument($product, self::LANG_EN); $traduc->setLabel($line[self::LIBELLE_PRODUIT_DECLINE_EN]); $newlib=$product->getLabelForLang(self::LANG_EN); $product->save();
$product étant un declinedProduct
$newlib vaut bien la future valeur, mais l'object $traduc ne contient pas de méthode save, et celle de produt est sans effet sur ce champ.
Comment persister cette modification ? -
70545.2 en réponse à 70545.1 écrit par rbs@ecocea.com
12/11/2012 17:16
Alors pour traduire un document, il n'est pas du tout recommandé de passer directement par ces méthodes du persistentprovider.
À la place il faut passer par les méthodes beginI18nWork et endI18nWork du RequestContext.
L'utilisation de beginI18nWork permet de changer globalement la langue de travail. À partir de là, tous les getters et setters appelés sur des documents travailleront sur la traduction dans cette langue du document. Une fois le traitement terminée, endI18nWork permet de revenir à la langue de travail précédente (derrière on gère une pile de langues, on peut donc imbriquer plusieurs niveaux si nécessaire).
Exemple :$rqc = RequestContext::getInstance(); try { $rqc->beginI18nWork($lang); // Insérer votre code ici. $rqc->endI18nWork(); } catch (Exception $rce) { $rqc->endI18nWork($rce); }
Attention, il est important de placer le try/catch autour car si jamais une exception intervient dans votre code, il faut tout de même revenir à la langue de travail d'origine. Notons que endI18nWork "rethrow" l'exception qu'il reçoit en paramètre.
Dernière remarque : dans le cas où vous modifiez plusieurs traductions d'un même document successivement, il est recommandé de faire un save pour chaque langue. En effet, lors d'un save, toutes les traductions modifiées sont bien enregistrées mais les pre et post save ne sont exécutés que pour la langue courante. -
Il fallait y penser, mais j'aime beaucoup la solution.
Merci de prendre connaissance et de respecter les règles des forums.