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,但在这种情况下这并不重要。
正如您在我的实体中看到的那样,我手动添加了 contentEN 和 descriptionEN 因为我想要 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));
}
}
我有一个实体 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,但在这种情况下这并不重要。
正如您在我的实体中看到的那样,我手动添加了 contentEN 和 descriptionEN 因为我想要 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));
}
}