1 份表格中数据库中的两条记录

Two records in database on 1 form

我有一个实体 Page,其字段为:

页面 ID (PK) 和标签

我有一个实体 PageLocale,其字段为:

pagelocaleid (PK)、描述、内容、语言环境、翻译和 pageID (FK).

我的数据库结构:

我的实体PageLocale:

<?php

namespace DX\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Pagelocale
 *
 * @ORM\Table(name="pageLocale", indexes={@ORM\Index(name="fk_pageLocale_page1_idx", columns={"pageID"})})
 * @ORM\Entity(repositoryClass="DX\MyBundle\Repository\PagelocaleRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Pagelocale
{
    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", length=65535, nullable=true)
     */
    private $description;

    /**
     * @var string
     */
    private $descriptionEN;

    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text", length=65535, nullable=true)
     */
    private $content;

    /**
     * @var string
     */
    private $contentEN;

    /**
     * @var string
     *
     * @ORM\Column(name="locale", type="string", length=5, nullable=true)
     */
    private $locale;

    /**
     * @var boolean
     *
     * @ORM\Column(name="translated", type="boolean", nullable=true)
     */
    private $translated;

    /**
     * @var integer
     *
     * @ORM\Column(name="pageLocaleID", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $pagelocaleid;

    /**
     * @var \DX\MyBundle\Entity\Page
     *
     * @ORM\ManyToOne(targetEntity="DX\MyBundle\Entity\Page")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="pageID", referencedColumnName="pageID")
     * })
     */
    private $pageid;

    /**
     * @var string
     */
    private $tag;

    /**
     * Set tag
     *
     * @param string $tag
     * @return Articlelocale
     */
    public function setTag($tag)
    {
        if($this->pageid)
        {
            $this->pageid->setTag($tag);
        }
        else
        {
            $this->tag = $tag;
        }

        return $this;
    }

    /**
     * Get tag
     *
     * @return string
     */
    public function getTag()
    {
        if($this->pageid)
        {
            return $this->pageid->getTag();
        }
        else
        {
            return $this->tag;
        }
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Pagelocale
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set descriptionEN
     *
     * @param string $descriptionEN
     * @return Pagelocale
     */
    public function setDescriptionEN($descriptionEN)
    {
        $this->descriptionEN = $descriptionEN;

        return $this;
    }

    /**
     * Get descriptionEN
     *
     * @return string
     */
    public function getDescriptionEN()
    {
        return $this->descriptionEN;
    }

    /**
     * Set content
     *
     * @param string $content
     * @return Pagelocale
     */
    public function setContent($content)
    {
        $this->content = $content;

        return $this;
    }

    /**
     * Get content
     *
     * @return string 
     */
    public function getContent()
    {
        return $this->content;
    }


    /**
     * Set contentEN
     *
     * @param string $contentEN
     * @return Pagelocale
     */
    public function setContentEN($contentEN)
    {
        $this->contentEN = $contentEN;

        return $this;
    }

    /**
     * Get contentEN
     *
     * @return string
     */
    public function getContentEN()
    {
        return $this->contentEN;
    }

    /**
     * Set locale
     *
     * @param string $locale
     * @return Pagelocale
     */
    public function setLocale($locale)
    {
        $this->locale = $locale;

        return $this;
    }

    /**
     * Get locale
     *
     * @return string 
     */
    public function getLocale()
    {
        return $this->locale;
    }

    /**
     * Set translated
     *
     * @param boolean $translated
     * @return Pagelocale
     */
    public function setTranslated($translated)
    {
        $this->translated = $translated;

        return $this;
    }

    /**
     * Get translated
     *
     * @return boolean 
     */
    public function getTranslated()
    {
        return $this->translated;
    }

    /**
     * Get pagelocaleid
     *
     * @return integer 
     */
    public function getPagelocaleid()
    {
        return $this->pagelocaleid;
    }

    /**
     * Set pageid
     *
     * @param \DX\MyBundle\Entity\Page $pageid
     * @return Pagelocale
     */
    public function setPageid(\DX\MyBundle\Entity\Page $pageid = null)
    {
        $this->pageid = $pageid;

        return $this;
    }
}

我正在使用 Sonata Admin Bundle,但在这种情况下这并不重要。

正如您在我的实体中看到的那样,我手动添加了 contentENdescriptionEN 因为我想要 content & 2 种语言的描述.

而且我希望能够以一种形式而不是分两步完成(为每种语言内容创建)。

现在我的表格中有:

$formMapper
    ->add('tag', 'text', array('label' => 'Tag'))
    ->add('description', 'text', array('label' => 'Beschrijving'))
    ->add('descriptionEN', 'text', array('label' => 'Beschrijving Engels'))
    ->add('content', 'textarea', array('label' => 'Tekst', 'attr' => array('class' => 'ckeditor'), 'help' =>
        'My help text.'))
    ->add('contentEN', 'textarea', array('label' => 'Tekst Engels', 'attr' => array('class' => 'ckeditor'), 'help' =>
        'My help text.'))
;

我可以创建 2 个不同的实体并设置语言环境,这没问题。但是当我想编辑它们时 contentEN & descriptionEN 逻辑上没有填写。我怎样才能确保我得到描述和内容 哪里 locale = .. ?

我知道 contentEN 和 descriptionEN 不是执行此操作的方法。但我只是想把问题弄清楚。

如果您想根据区域设置检索某些特定内容,您需要创建一个数组,您可以在其中设置按区域设置排序的字段,并创建一个使用该数组的查询。

你可以这样做:

class PageLocaleManager 
{
    public function getParametersLocale()
    {
        // retrieve the current locale.
        $locale = $this->get('request')->getLocale();
        // set the fields you want retrieve based on the locale, you have to set an alias before the name for the query.
        $parameters = array(
            'fr' => array('pl.description', 'pl.content'),
            'en' => array('pl.descriptionEN', 'pl.contentEN')
        );
        // if the locale is set return the parameters related to it, else return the default parameters (in this case default = fr)
        return (isset($parameters[$locale]) ? $parameters[$locale] : $parameters['fr'];
    }
}

class PageLocaleRepository
{
    public function findLocalePageById($parameters, $pageId)
    {
        return $this->createQueryBuilder('pl')
            ->select($parameters)
            ->where('pl.page = :pageId')
            ->setParameter('pageId', $id)
            ->getQuery()
            ->getResult();
    }
}

然后,当您想要检索特定区域设置的页面内容时,您必须执行以下操作:

$pageId = 1;
$parameters = $this->get('page_locale.manager')->getParametersLocale();
$pageLocaleEntity = $this->getDoctrine()->getRepository('TestBundle:PageLocale')->findLocalePageById($parameters, $pageId);

另外,我认为你不应该在你的项目中使用这个模式,如果你想添加更多的语言,你将不得不复制字段。

更新

如果您想从同一表单的数据创建/更新 2 个实体,则必须使用事件 prePersist / preUpdate。

您可以在您的 Sonata Admin 中添加一个 prePersist 方法 (http://sonata-project.org/bundles/admin/master/doc/reference/saving_hooks.html) 并根据您的表单数据创建一个新实体。

class PageLocaleAdmin extends Admin
{
    public function prePersist($object)
    {
        $pageLocaleEnEntity = new PageLocale();
        $pageLocaleEnEntity->setDescriptionEN($object->getDescriptionEN());
        $pageLocaleEnEntity->setContentEN($object->getContentEN());
        $this->getConfigurationPool()->getContainer()->get('doctrine')->persist($pageLocaleEnEntity);
    }
}

更新 2

好的,我没有看到字段 descriptionEN 和 contentEN 不在您的模型中。 要在 Edit 上填写 descriptionEN 和 contentEN,您必须检索相关的 PageLocale 并设置语言环境值,您可以这样做:

class PageLocaleAdmin extends Admin
{
     public function configureFormFields(FormMapper $formMapper)
     {
         $locale = 'en';
         if ($this->subject->getId() !== null) {
             $pageLocaleEntity = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository('DXMyBundle:PageLocale')->findOneby($this->subject->getId(), $locale);
             $descriptionEN = $pageLocaleEntity->getDescriptionEN();
             $contentEN = $pageLocaleEntity->getContentEN();
         } else {
             $pageLocaleEntity = null;
             $descriptionEN = null;
             $contentEN = null;
         }

         $formMapper
             ->add('description', 'text', array('label' => 'Beschrijving'))
             ->add('descriptionEN', 'text', array('label' => 'Beschrijving Engels', 'data' => $descriptionEN))
             ->add('content', 'textarea', array('label' => 'Tekst', 'attr' => array('class' => 'ckeditor'), 'help' => 'My help text.'))
             ->add('contentEN', 'textarea', array('label' => 'Tekst Engels', 'attr' => array('class' => 'ckeditor'), 'help' => 'My help text.', 'data' => $contentEN));

     }
}