Doctrine2 | Переводы для связи OneToOne

216
29 сентября 2017, 19:38

Добрый день.

У меня есть сущность Page. С ней связана сущность Seo связью OneToOne. Я хочу сделать переводы для Страниц и сразу же для Сео. Но сущность СЕО не обновляется при смене языка(остается в главном языке, хотя Locale меняется на en), с данными для страницы все в порядке, переводятся как нужно.

<?php

/**
 * Page
 *
 * @ORM\Table(name="page")
 * @ORM\Entity(repositoryClass="App\AdminBundle\Repository\PageRepository")
 * @Gedmo\TranslationEntity(class="App\AdminBundle\Entity\Translation\PageTranslation")
 */
class Page implements Translatable
{
    /**
     * @Gedmo\Locale
     */
    private $locale;
    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
        $this->getSeo()->setTranslatableLocale($locale);
    }
    /**
     * @ORM\OneToMany(
     *   targetEntity="App\AdminBundle\Entity\Translation\PageTranslation",
     *   mappedBy="object",
     *   cascade={"persist", "remove"}
     * )
     */
    private $translations;
    public function __construct()
    {
        $this->translations = new ArrayCollection();
    }
    public function getTranslations()
    {
        return $this->translations;
    }
    public function addTranslation(PageTranslation $t)
    {
        if (!$this->translations->contains($t)) {
            $this->translations[] = $t;
            $t->setObject($this);
        }
    }

    /**
     * @var string
     *
     * @Gedmo\Translatable
     * @ORM\Column(name="title", type="string", length=255)
     * @Assert\NotBlank(
     *     message="not_blank_message"
     * )
     */
    private $title;

    /**
     * @ORM\OneToOne(targetEntity="TE\SeoBundle\Entity\Seo", cascade={"persist","remove","refresh"}, inversedBy="pages")
     * @ORM\JoinColumn(onDelete="SET NULL")
     */
    private $seo;
}

Сущность SEO

<?php
use Gedmo\Mapping\Annotation as Gedmo;
/**
 * Seo
 *
 * @ORM\Table(name="te_seo")
 * @ORM\Entity(repositoryClass="TE\SeoBundle\Repository\SeoRepository")
 * @Gedmo\TranslationEntity(class="TE\SeoBundle\Entity\SeoTranslation")
 */
class Seo
{
    /**
     * @Gedmo\Locale
     */
    private $locale;
    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }
    /**
     * @ORM\OneToMany(
     *   targetEntity="TE\SeoBundle\Entity\SeoTranslation",
     *   mappedBy="object",
     *   cascade={"persist", "remove"}
     * )
     */
    private $translations;
    public function __construct()
    {
        $this->translations = new ArrayCollection();
    }
    public function getTranslations()
    {
        return $this->translations;
    }
    public function addTranslation(SeoTranslation $t)
    {
        if (!$this->translations->contains($t)) {
            $this->translations[] = $t;
            $t->setObject($this);
        }
    }

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=128)
     * @Gedmo\Translatable
     */
    protected $title;

    /**
     * Remove translation
     *
     * @param \TE\SeoBundle\Entity\SeoTranslation $translation
     */
    public function removeTranslation(\TE\SeoBundle\Entity\SeoTranslation $translation)
    {
        $this->translations->removeElement($translation);
    }

}

Сущность для переводов СЕО

<?php
namespace TE\SeoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Translatable\Entity\MappedSuperclass\AbstractTranslation;
/**
 * @ORM\Table(name="te_seo_translations",
 *     uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={
 *         "locale", "object_id", "field"
 *     })}
 *     )
 * @ORM\Entity(repositoryClass="Gedmo\Translatable\Entity\Repository\TranslationRepository")
 */
class SeoTranslation extends AbstractTranslation{
    /**
     * Convenient constructor
     *
     * @param string $locale
     * @param string $field
     * @param string $value
     */
    public function __construct($locale, $field, $value)
    {
        $this->setLocale($locale);
        $this->setField($field);
        $this->setContent($value);
    }
    /**
     * @ORM\ManyToOne(targetEntity="TE\SeoBundle\Entity\Seo", inversedBy="translations")
     * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $object;
}

На всякий случай форма для Страниц

<?php 
class PageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title',TextType::class)               
            ->add('seo',SeoType::class)
        ;
    }
}

Answer 1

В общем, это я закосячил. Почему то не вставил @Gedmo\Translatable в СЕО для полей, которые должны переводиться. А так вариант полностью рабочий. Я его сейчас исправлю

READ ALSO
Как спарсить с сайта с установленной recaptcha?

Как спарсить с сайта с установленной recaptcha?

Итак, есть сайт, на нем ajax-форма поиска информации с рекапчей от гугла (без галочки), ответ формы мне нужно спарсить

178
Не выводит форму с редактируемым уроком

Не выводит форму с редактируемым уроком

в чём моя ошибка, не выводит форму редактирования урока любого

123
Запись видео HTML5

Запись видео HTML5

Кто-то знает где можно посмотреть пример реализации записи видео через веб камеру средствами HTML5 с последующей отправкой в виде файла на сервер...

197
передать число в строку таблицы php yii2

передать число в строку таблицы php yii2

как передать число 0 или 1 в строку таблицы ,

241