Я использую 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;
Я был бы признателен за любой ответ, может быть, ведя меня, чтобы решить эту проблему.
Это должно быть разбито на несколько вопросов с * только * соответствующий код включен. –