我有以下代码,我相信这不是我尝试做的正确方法..
这是我想要完成的事情
我有一个页面可以添加新的语言键和该键的翻译。 翻译文本框是动态的(来自语言表)。 每个文本字段的名称是该语言的语言环境(也存储在语言表中),我用它来获取语言ID(在转换表中链接)
id(AI)--------> languageid
区域设置
languageName
id(AI)
languageid
languagekey
翻译
所以从语言表中我得到应该存在的文本框列表并循环它们
当用户点击保存时,我使用以下方式保存他输入的内容
if ($form->isValid()) {
print_r($form->getData()); // debug
foreach($form->getData() as $key => $value){ // get the submitted data
$oTranslation = new Translations(); // creat a new entity object
if($key == 'languageKey'){ // if it was the language key text field
$languageKey = $value;
continue;
}
$locale = $key; // the locale to extract the language id later on
$translation = $value;
//----- start getting the language id
$language = $this->getDoctrine()
->getRepository('CodeizSDBTranslatorBundle:Languages');
$query = $language->createQueryBuilder('l')
->select('l.id')
->where('l.locale = :locale')
->setParameter('locale' , $locale)
->getQuery();
$id = $query->getResult();
//----- end getting the language id
$oTranslation->setLanguageId($id[0]['id']); // setting the vlaues
$oTranslation->setLanguageKey($languageKey);
$oTranslation->setTranslation($translation);
$em = $this->getDoctrine()->getManager();
$em->persist($oTranslation);
$em->flush();// getting them into the database
}
return $this->redirect($this->generateUrl('codeiz_sdb_translator_addlanguagekey')); // redirect to some place
}
我知道我所做的工作已完成,但这是我的问题..
他们是如何将数据保存到数据库正确的,还是有更好的方法..
答案 0 :(得分:1)
如果您的Translation
实体与Locale
有关系,您可以轻松地为Translation
创建一个包含三个字段的表单:language_id
(实体类型),{{1 }和language_key
(两种文本类型)。您的实体类型不应该是多个。看看Forms。这样,您可以将控制器代码减少到几行。
另请查看Doctrine associations。 我现在无法向你展示一些代码(我正在使用我的手机),但我相信你会很快找到方法。
编辑:基本上您的表单如下:
translation
不要忘记在use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class TranslationType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('language_id', 'entity', array(
'class' => 'AcmeHelloBundle:Language', // The entity
'property' => 'language_name', // The label to show
))
->add('language_key')
->add('translation');
}
public function getName()
{
return 'translation';
}
}
和Translation
之间添加正确的关联(可能您需要单向多对一关联)。当然还有验证规则(请查看Count)。
这假设您至少使用Symfony 2.1.0。