Zend 2 Doctrine 2 Gedmo可翻译 [英] Zend 2 Doctrine 2 Gedmo Translatable

查看:163
本文介绍了Zend 2 Doctrine 2 Gedmo可翻译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我正在尝试在Zend Framework 2应用程序中使用Doctrine 2的Gedmo可翻译扩展。

 'doctrine'=>数组(
'eventmanager'=>数组(
'orm_default'=>数组(
'subscribers'=>数组(
'Gedmo\Translatable\TranslatableListener '


),
'driver'=>数组(
'application_entities'=>数组(
'class'=> ;'doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache'=>'array',
'paths'=>数组(__ DIR__。 src / application / Entity')
),
'translatable_metadata_driver'=>数组(
'class'=>'Doctrine\ORM\Mapping\Driver\AnnotationDriver' ,
'cache'=>'array',
'paths'=> array(
'vendor / gedmo / doctrine-extensions / lib / Gedmo / Translatable / Entity',

),
'orm_default'=>数组(
'drivers'=>数组(
'Application\Entity'=> 'application_entities',
'Gedmo\Translatable\Entity'=> 'translateable_metadata_driver'


),
),

示例实体:

 <?php 

命名空间Application\Entity;

使用Gedmo\Mapping\Annotation作为Gedmo;
使用Doctrine\ORM\Mapping作为ORM;
使用Doctrine\Common\Collections\ArrayCollection;

/ **
* @ ORM\Entity(repositoryClass =Application\Repository\CategoryRepository)
* /
class类别{

/ **
* @ ORM\Id
* @ ORM\GeneratedValue
* @ ORM\Column(type =integer)
* /
private $ id;

/ **
* @ ORM\Column(type =string)
* @ Gedmo\Translatable
* /
private $名称;

/ **
* @ Gedmo\Locale
* /
private $ locale;

}

持续翻译工作正常,我可以使用可翻译库。



我有两个问题:


  1. 我无法弄清楚以获得订阅实体管理员的可翻译听众。我想在Module类中得到它,以在bootstrap中设置默认语言环境。


  2. 当我有一个实体对象时,我无法获得可翻译列的翻译,只有标准值。据我所知,我应该将一个值转换为默认语言环境,并且应该能够通过在使用语言环境注释的Entity中设置一个变量来覆盖默认语言环境,但似乎不起作用。 >


任何帮助将不胜感激!

解决方案

  public function onBootstrap(MvcEvent $ event)
{
$ serviceManager = $ event-> getApplication() - > getServiceManager();

$ this-> prepareGedmoTranslatable($ serviceManager);
}

/ **
* Gedmo\TranslatableListener的初始配置
*设置默认语言环境并将其注册为服务
*
*读者可以问为什么?
*如果您自己尝试使用TranslatableListener,您将会明白我的意思。)
*
* @param ContainerInterface $ services
* /
public function prepareGedmoTranslatable(ContainerInterface $ services )
{
/ **
* @var EventManager $ ormEventManager
* /
$ ormEventManager = $ services-> get('doctrine.eventmanager.orm_default' );
//假设postLoad事件有TranslatableListener作为监听器
//如果在doctrine配置中启用TranslatableListener,则
// Doctrine\ORM\Events :: postLoad
$ listeners = $ ormEventManager-> getListeners(Events :: postLoad);
$ translatableListener = null;

//搜索TranslatableListener导致Gedmo喜欢hardcore东西;)
foreach($ listeners as $ listener){
if($ listener instanceof TranslatableListener){
$ translatableListener = $ listener;
break;
}
}

if($ translatableListener instanceof TranslatableListener){
$ translatableListener-> setDefaultLocale(
//假设translator config提供默认语言环境
//例如在config
$ services-> get('config')['translator'] ['locale']
)中设置的区域设置;

//让翻译回到默认语言环境
$ translatableListener-> getTranslationFallback(true);

//行下面添加Listener作为一个服务,所以你可以访问
// $ services-> get(TranslatableListener :: class)
//你想要的地方
$ services-> setAllowOverride(true);
$ services-> setService(TranslatableListener :: class,$ translatableListener);
$ services-> setAllowOverride(false);
}
}

很高兴为您服务!


I am trying to use the Gedmo translatable extension for Doctrine 2 in a Zend Framework 2 application.

I have it setup like this:

'doctrine' => array(
    'eventmanager' => array(
        'orm_default' => array(
            'subscribers' => array(
                'Gedmo\Translatable\TranslatableListener'
            )
        )
    ),
    'driver' => array(
        'application_entities' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/Application/Entity')
        ),
        'translatable_metadata_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(
                'vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity',
            )
        ),
        'orm_default' => array(
            'drivers' => array(
                'Application\Entity' => 'application_entities',
                'Gedmo\Translatable\Entity' => 'translatable_metadata_driver'
            )
        )
    ),
),

Sample Entity:

<?php

namespace Application\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity (repositoryClass="Application\Repository\CategoryRepository") 
 */
class Category {

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @Gedmo\Locale
     */
     private $locale;

}

Persisting translations works fine and I can get them using the translatable repository.

I have two problems:

  1. I cannot figure out how to get the translatable listener subscribed to the entitymanager. I would like to get it in the Module class to set the default locale on bootstrap.

  2. When I have an entity object I cannot get the translations of translatable columns, only the standard values. As far as I can figure out, I should get a value translated to the default locale, and should be able to override the default locale by setting a variable in the Entity annotated with Locale, but it does not seem to work.

Any help would be greatly appreciated!

解决方案

public function onBootstrap(MvcEvent $event)
{
    $serviceManager = $event->getApplication()->getServiceManager();

    $this->prepareGedmoTranslatable($serviceManager);
}

/**
 * Does initial config of Gedmo\TranslatableListener
 * sets default locale and registers it as service
 *
 * Reader you can ask why?
 * You will understand me if you try to use TranslatableListener yourself ;)
 *
 * @param ContainerInterface $services
 */
public function prepareGedmoTranslatable(ContainerInterface $services)
{
    /**
     * @var EventManager $ormEventManager
     */
    $ormEventManager      = $services->get('doctrine.eventmanager.orm_default');
    // assume that postLoad event has TranslatableListener as listener
    // it will be if TranslatableListener enabled in doctrine config
    // Doctrine\ORM\Events::postLoad
    $listeners            = $ormEventManager->getListeners(Events::postLoad);
    $translatableListener = null;

    // search for TranslatableListener cause Gedmo loves hardcore stuff ;)
    foreach ($listeners as $listener) {
        if ($listener instanceof TranslatableListener) {
            $translatableListener = $listener;
            break;
        }
    }

    if ($translatableListener instanceof TranslatableListener) {
        $translatableListener->setDefaultLocale(
            // assume that translator config provides default locale
            // e.g locale that have been set in config
            $services->get('config')['translator']['locale']
        );

        // let translations to fallback to default locale
        $translatableListener->getTranslationFallback(true);

        // lines below adds Listener as a service so you can access it by
        // $services->get(TranslatableListener::class)
        // everywhere you want
        $services->setAllowOverride(true);
        $services->setService(TranslatableListener::class, $translatableListener);
        $services->setAllowOverride(false);
    }
}

Glad to help you!

这篇关于Zend 2 Doctrine 2 Gedmo可翻译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆