1

我有以下代码,我相信这不是做我想做的事情的正确方法..

这是我想要完成的

我有一个页面可以添加新的语言键和该键的翻译。翻译文本框是动态的(来自语言表)。每个文本字段的名称是该语言的区域设置(也存储在语言表中),我用它来获取语言 ID(链接在翻译表中)

这是我的数据库表

id (AI) --------> 语言ID

语言环境

语言名称


翻译

身份证 (AI)

语言标识

语言键

翻译


所以从语言表中我得到了应该在那里的文本框列表并循环它们

当用户点击保存时,我使用以下方式保存他输入的内容

   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
  }

我知道我确实完成了工作,但这是我的问题..

他们是将数据正确保存到数据库的方式还是有更好的方法..

4

1 回答 1

1

如果您的Translation实体与 有关系Locale,您可以轻松地创建一个Translation包含三个字段的表单:(language_id实体类型)language_keytranslation(两种文本类型)。您的实体类型不应该是多个。查看表格。这样,您可以将控制器代码减少到几行。

也看看教义协会我现在无法向您展示一些代码(我正在使用我的手机),但我相信您会很快找到方法

编辑:基本上你的表格看起来像:

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

不要忘记在Translationand之间添加正确的关联Language(可能您想要单向多对一关联)。当然,还有验证规则(查看Count)。

这假设您至少使用 Symfony 2.1.0。

于 2013-02-24T00:59:51.570 回答