Korzystam z https://github.com/Atlantic18/DoctrineExtensions, dokładnie interesuje mnie wdrożenie do swojego projektu translatable i sluggable. Najpierw podpiąłem bez wiekszych problemów translatable, język domyślny to polski, tłumaczę na angielski i na niemiecki. Wszystko pięknie działa, dodawanie, edycja, usuwanie. Potem podpiąłem sluggable, też ładnie działa, ale jedynie z domyślnym językiem. Natomiast nie tworzy i nie zapisuje slug'ów z innych języków. Przekopałem cały internet i nie mogę znaleźć rozwiązania.
Część z config.yml:
Kod
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"
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"
Kod z services.yml:
Kod
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%]
# 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%]
Kod z 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()); } }
Kod z encji 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; } }
Na forum jest jakiś błąd. Nie mogłem dodać całego tematu w jednym poście, bo był za długi. Próbuje resztę dodać w odpowiedzi, to dostaje komunikat że są błędy i pustą listę błędów.
Więc temat jest nie pełny, bo nie mam narazie możliwości dodania reszty
Generalnie część dokumentacji znajdująca się tutaj: https://github.com/Atlantic18/DoctrineExten...nslate-our-slug jest dla mnie nie do końca jasna. Czy kod:
<?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
muszę gdzieś wstawiać, a jeśli tak to gdzie? Nie ma nigdzie takiej informacji. Z ciekawości wstawiłem go w kontrolerze w addAction i dostałem błąd, że nie można znaleźć \Gedmo\Translatable\TranslationListener(). I rzeczywiście w tej lokalizacji w Gedmo nie ma takiej klasy. Wogóle zapuściłem przeszukiwanie wszystkich plików w projekcie i nigdzie nie ma takiej klasy. Czy to pomyłka w dokumentacji, czy nie powinno tam być \Gedmo\Translatable\TranslatableListener() ?
Druga sprawa, czy pole na slug w encji i w bazie powinnu się nazywać 'slug'? U mnie nazywa się inaczej, jak widać, ale slug dla języka polskiego generuje się prawidłowo. Czy może to stanowić problem w wygenerowaniu sluga dla tłumaczeń?
Trzecia sprawa, czy konieczne jest dodanie w encji tych pól:
<?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;
Będę wdzięczny za wszelkie odpowiedzi, może coś naprowadzi mnie na rozwiązanie tego problemu.
No i nie udało mi się dodać kodu mojego kontrolera.
Cały temat tutaj: http://symfonylab.pl/forum/index.php/topic,613.0.html
Tam nie miałem problemu z dodaniem wszystkiego w jednym poście