DoctrineExtensions - 如何翻译slug?

时间:2014-04-02 16:23:28

标签: symfony doctrine doctrine-extensions

我过去2个小时一直在翻译我的slug而没有太大的成功。首先,让我们来看看我的实体:

/**
 * BlogPost
 *
 * @ORM\Entity
 */
class BlogPost implements Translatable
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @Gedmo\Translatable
     * @ORM\Column(name="title", type="string", length=128)
     */
    private $title;

    /**
     * @Gedmo\Slug(fields={"title"})
     * @Gedmo\Translatable
     * @ORM\Column(length=128)
     */
    private $slug;

这很简单。现在,当我这样做时:

$em = $this->getDoctrine()->getManager();

$blogPost = new BlogPost();
$blogPost->setTitle('my title in FRANCAIS');
$blogPost->setTranslatableLocale('fr_ca');
$em->persist($blogPost);
$em->flush();

$blogPost->setTitle('my title in ENGLISH');
$blogPost->setTranslatableLocale('en_us');
$em->persist($blogPost);
$em->flush();

只有我的标题被翻译,但我的slug只有法语。 I tried that solution from the doc ...但是没有TranslationListener(该文件不存在)。文档中只有一个注释对我来说意义不大:

  

注意:这些翻译不会被处理为对象的普通字段,如果你翻译了一个slug,额外的翻译将不知道如何生成slug,因此在创建时应该处理作为附加翻译的值。

我必须承认我感到自己死路一条。有人可以分享一些有关此事的知识!

1 个答案:

答案 0 :(得分:1)

我建议您使用KnpDoctrineBehavious Bundle。翻译实体的任何属性非常简单:

class BlogPost
{
    use ORMBehaviors\Translatable\Translation;

    // anything that should not be translated
    // follows in this class
}

添加翻译实体:

class BlogPostTranslation
{
    /**
     * @Gedmo\Slug(fields={"title"})
     * @ORM\Column(length=128)
     */
    private $slug;

    // ...
}

现在您可以访问以下任何翻译:

$blogPost->getSlug(); // default language slug
$blogPost->translate('en')->getSlug(); // English slug
$blogPost->translate('fr')->getSlug(); // French slug

请勿忘记在$entity->mergeNewTranslations();之后致电$em->persist($entity);更新翻译表。

编辑:

请注意, DoctrineBehaviours Bundle 也支持更好的Sluggable方式。像their documentation中显示的那样使用它。