Symfony 2:一起使用可翻译和可记录

时间:2012-06-25 16:35:03

标签: symfony doctrine-orm

我正在使用教条扩展在symfony2中处理多语言新闻发布者: -

可翻译和可记录

虽然我让他们都使用默认的英文帖子(即登录更新)我不能记录编辑的翻译...记录被插入'ext_log_entries'表但我只得到一个空的序列化数组。 / p>

有没有人有任何想法或例子?我几乎都遵循git-hub指南进行扩展。

谢谢!

1 个答案:

答案 0 :(得分:1)

我之前尝试过做同样的事情。我不得不发现不可能将这两件事一起使用,你必须为你自己实现它。

我是这样做的: 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 ....

现在我写了一个管理这些服务的服务: 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;
}

在您的控制器中,您现在可以执行以下操作: 获取ohter版本的文本对象

$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

制作新的文字对象

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

希望对您有所帮助,如果您有任何疑问,请不要在意。