Две записи в базе данных по 1 форме

У меня есть сущность страница с полями:

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, но в данном случае это не имеет значения.

Как вы можете видеть в моей сущности, я добавил вручную contentEN а также descriptionEN потому что я хочу содержание & описание на 2 языках.

И я хочу иметь возможность сделать это в одной форме, а не в 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 логически не заполнены. Как я могу убедиться, что я получаю описание и содержание где локаль = .. ?

Я знаю содержание & descriptionEN не способ сделать это. Но я просто хотел уточнить проблему.

2

Решение

Если вы хотите получить какой-то конкретный контент на основе локали, вам нужно создать массив, в котором вы установите поля, упорядоченные по локали, и создадите запрос, использующий этот массив.

Вы могли бы сделать это так:

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

Также, по моему мнению, вам не следует использовать эту схему в вашем проекте, если вы хотите добавить больше языков, вам придется дублировать поля.

Обновить

Вы должны использовать события prePersist / preUpdate, если хотите создать / обновить 2 объекта из данных той же формы.

Вы можете добавить в свой 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 нет в вашей модели.
Чтобы заполнить описания EN и contentEN в Edit, вы должны получить связанный 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));

}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]