2015-01-29 3 views
0

Я использую https://github.com/Atlantic18/DoctrineExtensions, я хочу объединить в моем проекте переводимый и sluggable. Сначала я использовал translatable, по умолчанию язык польский, перевод на английский и немецкий. Все работает красиво, добавляет, редактирует, удаляет. то я использовал sluggable, также работает красиво, но только с языком по умолчанию. однако не создает пули для других языков.Symfony2 - комбинировать переводимые и 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" 

services.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()); 
    } 
} 

Сущность Tag.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 правильно генерирует польский язык. Может ли это быть проблемой в генерации пули для переводов?

Третий вопрос, является ли это необходимо, чтобы добавить эти поля в объекте:

<?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; 

Я был бы признателен за любой ответ, может быть, ведя меня, чтобы решить эту проблему.

+1

Это должно быть разбито на несколько вопросов с * только * соответствующий код включен. –

ответ

1

Изменить эту строку:

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

Для этого:

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

Обратите внимание на изменение имени класса (ation против atable).

Смежные вопросы