将每个文本字段保留在单独的行中

时间:2013-02-23 22:59:05

标签: php symfony doctrine-orm

我有以下代码,我相信这不是我尝试做的正确方法..

这是我想要完成的事情

我有一个页面可以添加新的语言键和该键的翻译。 翻译文本框是动态的(来自语言表)。 每个文本字段的名称是该语言的语言环境(也存储在语言表中),我用它来获取语言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
  }

我知道我所做的工作已完成,但这是我的问题..

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

1 个答案:

答案 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。