Symfony2 - 结合可翻译和可慢量 - 不起作用


Symfony2 - combine translatable and sluggable - not working

我使用 https://github.com/Atlantic18/DoctrineExtensions,我想在我的项目中组合可翻译和可慢速。首先我使用了可翻译语言,默认语言是波兰语,翻译成英语和德语。一切都很好,添加,编辑,删除。然后我使用了 sluggable,也很好用,但只能使用默认语言。但是不会为其他语言创建辅助信息域。

config.yml:

doctrine:
dbal:
    driver:   "%database_driver%"
    host:     "%database_host%"
    port:     "%database_port%"
    dbname:   "%database_name%"
    user:     "%database_user%"
    password: "%database_password%"
    charset:  UTF8
    # if using pdo_sqlite as your database driver:
    #   1. add the path in parameters.yml
    #     e.g. database_path: "%kernel.root_dir%/data/data.db3"
    #   2. Uncomment database_path in parameters.yml.dist
    #   3. Uncomment next line:
    #     path:     "%database_path%"
orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    auto_mapping: true
    mappings:
        translatable:
            type: annotation
            alias: Gedmo
            prefix: Gedmo'Translatable'Entity
            # make sure vendor library location is correct
            dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"

服务.yml:

    parameters:
#    portal_cms.example.class: Portal'CmsBundle'Example
services:
    extension.listener:
        class: Portal'CmsBundle'EventListener'DoctrineExtensionListener
        calls:
            - [ setContainer, [ @service_container ] ]
        tags:
            # translatable sets locale after router processing
            - { name: kernel.event_listener, event: kernel.request, method: onLateKernelRequest, priority: -10 }
    gedmo.listener.sluggable:
        class: Gedmo'Sluggable'SluggableListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ @annotation_reader ] ]
    gedmo.listener.translatable:
        class: Gedmo'Translatable'TranslatableListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ @annotation_reader ] ]
            - [ setDefaultLocale, [ %locale% ] ]
            - [ setTranslationFallback, [ false ] ]
#    portal_cms.example:
#        class: %portal_cms.example.class%
#        arguments: [@service_id, "plain_value", %parameter%]

DoctrineExtensionListener.php:

    <?php
namespace Portal'CmsBundle'EventListener;
use Symfony'Component'HttpKernel'Event'GetResponseEvent;
use Symfony'Component'DependencyInjection'ContainerAwareInterface;
use Symfony'Component'DependencyInjection'ContainerInterface;
class DoctrineExtensionListener implements ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    protected $container;
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
    public function onLateKernelRequest(GetResponseEvent $event)
    {
        $translatable = $this->container->get('gedmo.listener.translatable');
        $translatable->setTranslatableLocale($event->getRequest()->getLocale());
    }
}

实体标签.php:

    <?php
namespace Portal'CmsBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use Doctrine'Common'Collections'ArrayCollection;
use Gedmo'Mapping'Annotation as Gedmo;
use Gedmo'Translatable'Translatable;
/**
 * Tag
 *
 * @ORM'Table()
 * @ORM'Entity
 */
class Tag implements Translatable
{
    /**
     * @ORM'OneToMany(targetEntity="ArticleTag", mappedBy="tag")
     */
    protected $articleTags;
    public function __construct()
    {
        $this->articleTags = new ArrayCollection();
    }
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var 'DateTime
     *
     * @ORM'Column(name="created", type="datetime", nullable=true)
     */
    private $created;
    /**
     * @var string
     *
     * @Gedmo'Translatable
     * @Gedmo'Slug(fields={"name"})
     * @ORM'Column(name="url", type="string", length=150, unique=true)
     */
    private $url;
    /**
     * @var string
     *
     * @Gedmo'Translatable
     * @ORM'Column(name="name", type="string", length=150)
     */
    private $name;
    /**
     * @Gedmo'Locale
     * Used locale to override Translation listener`s locale
     * this is not a mapped field of entity metadata, just a simple property
     */
    private $locale;
    private $translations;

    /**
     * Set created
     *
     * @param 'DateTime $created
     * @return Tag
     */
    public function setCreated($created)
    {
        $this->created = $created;
        return $this;
    }
    /**
     * Get created
     *
     * @return 'DateTime 
     */
    public function getCreated()
    {
        return $this->created;
    }
    /**
     * Set url
     *
     * @param string $url
     * @return Tag
     */
    public function setUrl($url)
    {
        $this->url = $url;
        return $this;
    }
    /**
     * Get url
     *
     * @return string 
     */
    public function getUrl()
    {
        return $this->url;
    }
    /**
     * Set name
     *
     * @param string $name
     * @return Tag
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set translations
     *
     * @param string $translations
     * @return Tag
     */
    public function setTranslations($translations)
    {
        $this->translations = $translations;
        return $this;
    }
    /**
     * Get translations
     *
     * @return string 
     */
    public function getTranslations()
    {
        return $this->translations;
    }
    /**
     * Add articleTags
     *
     * @param 'Portal'CmsBundle'Entity'ArticleTag $articleTags
     * @return Tag
     */
    public function addArticleTag('Portal'CmsBundle'Entity'ArticleTag $articleTags)
    {
        $this->articleTags[] = $articleTags;
        return $this;
    }
    /**
     * Remove articleTags
     *
     * @param 'Portal'CmsBundle'Entity'ArticleTag $articleTags
     */
    public function removeArticleTag('Portal'CmsBundle'Entity'ArticleTag $articleTags)
    {
        $this->articleTags->removeElement($articleTags);
    }
    /**
     * Get articleTags
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getArticleTags()
    {
        return $this->articleTags;
    }
    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }
}

控制器

    <?php
namespace Portal'CmsBundle'Controller;
use Portal'CmsBundle'Entity'Tag;
use Portal'CmsBundle'Entity'ArticleTag;
use Symfony'Component'HttpFoundation'Request;
use Doctrine'ORM'EntityRepository;
use Gedmo'Translatable'TranslatableListener;
class AdminTagsController extends AbstractController
{
    public function indexAction(Request $request)
    {
// action code here - negligible
    }
    public function addAction(Request $request)
    {
        if ($request->getMethod() == 'POST') {
            $tag = new Tag();
            $em = $this->getDoctrine()->getManager();
            $formArray = $request->request->get('formTag');
            $repository = $em->getRepository('PortalCmsBundle:Article');
            $repository2 = $em->getRepository('Gedmo''Translatable''Entity''Translation');
            $tag->setName($formArray['name']);
            $repository2->translate($tag, 'name', 'en', $formArray['name_en']);
            $repository2->translate($tag, 'name', 'de', $formArray['name_de']);
            $tag->setCreated(new 'DateTime('now', new 'DateTimeZone('Europe/Warsaw')));
            $validator = $this->get('validator');
            $errors = $validator->validate($tag);
            if (count($errors) > 0) {
                foreach ($errors as $error) {
                    $this->message .= $error->getPropertyPath().' <-- '.$error->getMessage().'
    ';
                }
            } else {
                $em->persist($tag);
                if (isset($formArray['articles'])) {
                    foreach ($formArray['articles'] as $article_id) {
                        $article = $repository->find((int)$article_id);
                        $article_tag = new ArticleTag($article, $tag);
                        $em->persist($article_tag);
                    }
                }
                $em->flush();
                $this->message = 'Tag dodany';
            }
            return $this->redirect($this->generateUrl(
                    'admin_tags',
                    array(
                        'message' => $this->message,
                        'messageType' => $this->messageType
                    )
                ));
        }
        return $this->redirect($this->generateUrl(
                    'admin_tags'
                )); 
    }
// other actions
}

通常,此处的文档的一部分:对我来说 https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/sluggable.md#using-translationlistener-to-translate-our-slug 并不完全清楚。代码是否:

    <?php
$evm = new 'Doctrine'Common'EventManager();
$sluggableListener = new 'Gedmo'Sluggable'SluggableListener();
$evm->addEventSubscriber($sluggableListener);
$translatableListener = new 'Gedmo'Translatable'TranslationListener();
$translatableListener->setTranslatableLocale('en_us');
$evm->addEventSubscriber($translatableListener);
// now this event manager should be passed to entity manager constructor

我必须插入某个地方,如果是这样,在哪里?没有这些信息。出于好奇,我把它放在addAction的控制器中,得到了一个错误,找不到''Gedmo''Translatable''TranslationListener()。事实上,在这个地方,格德莫没有这样的班级。这是文档中的错误,不应该有''Gedmo''Translatable''TranslatableListener()?

第二个问题,或实体和数据库中的 slug 字段应该称为"slug"?就我而言,它有另一个名称,但 slug 可以正确生成波兰语。这可能是生成用于翻译的 slug 时的问题吗?

第三个问题,是否有必要在实体中添加这些字段:

    <?php
/**
     * @ORM'Column(type="string", length=64)
     */
    private $uniqueTitle;
    /**
     * @Gedmo'Slug(fields={"uniqueTitle"}, prefix="some-prefix-")
     * @ORM'Column(type="string", length=128, unique=true)
     */
    private $uniqueSlug;

我将不胜感激任何回应,也许是指导我解决这个问题。

更改此行:

$translatableListener = new 'Gedmo'Translatable'TranslationListener();

对此:

$translatableListener = new 'Gedmo'Translatable'TranslatableListener();

注意类名的更改(ation vs atable )。