【问题标题】:Two records in database on 1 form1 个表格中的数据库中有两条记录
【发布时间】:2015-03-02 14:49:04
【问题描述】:

我有一个实体页面,其中包含以下字段:

pageID (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,因为我想要 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 个不同的实体并设置语言环境,这没问题。但是当我想编辑它们时,逻辑上没有填写 contentENdescriptionEN。我怎样才能确保我得到描述和内容 where locale = .. ?

我知道 contentEN 和 descriptionEN 不是这样做的方法。但我只是想澄清一下问题。

【问题讨论】:

    标签: php symfony doctrine-orm entity locale


    【解决方案1】:

    如果要根据语言环境检索某些特定内容,则需要创建一个数组,在其中设置按语言环境排序的字段,并创建一个使用该数组的查询。

    你可以这样做:

    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));
    
         }
    } 
    

    【讨论】:

    • 我知道如何检索我的内容。但我想以相同的形式创建 2 条不同的记录。所以不是获取数据而是保存数据......
    • 但是当我想在编辑时在我的表单中显示这些字段时,我遇到了问题。它们不会被填写。我正在尝试使用 PRE_SET_DATA 但奏鸣曲没有与此集成。
    • 好的,我现在明白你想要做什么,我已经更新了我的答案。这可能不是最干净的方法,但应该可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2017-05-13
    相关资源
    最近更新 更多