Symfony 2: Using Translatable and Loggable Together

I am working on a multilingual news publisher in symfony2 using doctrine extensions: -

Translatable and Registered

Despite the fact that I have both users with English messages by default (that is, logs when updating), I can’t get the edited translations for registration ... the record is inserted into the table "ext_log_entries", but I get an empty serialized array .

Does anyone have any ideas or examples? I pretty much followed the git-hub guide for both extensions.

Thanks!

+3
source share
1 answer

I tried to do the same thing before. I had to find out that it is impossible to use these two things together, you must realize this for yourself.

I did it like this: Text.php

use Gedmo\Mapping\Annotation as Gedmo; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="text") * @ORM\Entity * @Gedmo\Loggable */ class Text { /** @ORM\Id @ORM\GeneratedValue @ORM\Column(type="integer") */ private $id; /** @ORM\Column(name="class", type="string") */ private $class; /** @ORM\Column(name="field", type="string") */ private $field; /** @ORM\Column(name="key_id", type="integer") */ private $key_id; /** * @ORM\ManyToOne(targetEntity="Language") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="lang_id", referencedColumnName="id") * }) */ private $lang; /** * @Gedmo\Versioned * @ORM\Column(name="text", type="text") */ private $text; ...getter setter... } 

Language.php

 use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="language") * @ORM\Entity */ class Language { /** @ORM\Id @ORM\GeneratedValue @ORM\Column(type="integer") */ private $id; /** @var @ORM\Column(name="language", type="string") */ private $language; ... getter setter .... 

Now I wrote a service to manage these: TextManager.php

 /** * @param $object * @param $field * @param $langKey * @return Text * * gets the existing text for the object * if it does not exist, it creates a new one */ public function setupText($object, $field, $langKey){ $lang = $this->langRepo->findOneBy(array("language" => $langKey)); $txt = $this->textRepo->findOneBy(array( 'class' => get_class($object), 'field' => $field, 'lang' => $lang, 'key_id' => $object->getId() )); if($txt != null){ return $txt; } $txt = new Text(); $txt->setClass(get_class($object)); $txt->setField($field); $txt->setKeyId($object->getId()); $txt->setLang($lang); return $txt; } /** * @param $object * @param $field * @param $langKey * @return mixed * gives you the text object or false if not found */ public function getText($object, $field, $langKey){ $lang = $this->langRepo->findOneBy(array("language" => $langKey)); $txt = $this->textRepo->findOneBy(array( 'class' => get_class($object), 'field' => $field, 'lang' => $lang, 'key_id' => $object->getId() )); if ($txt == null){ return false; } return $txt; } 

In your controller, you can now do this: to get a text object in the ohter version

 $logRepo = $em->getRepository('Gedmo\Loggable\Entity\LogEntry'); // we use default log entry class $text = $textManager->setupText($object, 'abouttext', 'de'); $logRepo->revert($text, 1); //1 is the version you would like to have $text->getText(); //version 1 text 

to create a new text object

 $text = $textManager->setupText($object, 'otherfield', 'fr'); $text->setText("your super text"); $em->persist($text); $em->flush(); 

Hope this helps you, and if you have any questions, don't ask questions.

+1
source

Source: https://habr.com/ru/post/918171/


All Articles