1

私は次のコードを持っています、私はこれが私がやろうとしていることをする正しい方法ではないと信じています。

これが私が達成したいことです

新しい言語キーとそのキーの翻訳を追加するページがあります。翻訳テキストボックスは動的です(言語テーブルから取得)。各テキストフィールドの名前は、その言語のロケール(言語テーブルにも格納されています)であり、それを使用して言語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
  }

私は自分が何をしたかが仕事を成し遂げたことを知っていますが、ここに私の質問があります..

それらはデータをDBに正しく保存する方法ですか、それともより良い方法がありますか..

4

1 に答える 1

1

Translationエンティティにとの関係がある場合は、 (エンティティタイプ)と(両方のテキストタイプ)の3つのフィールドを持つLocaleのフォームを簡単に作成できます。エンティティタイプは複数であってはなりません。フォームを見てください。このようにして、コントローラーコードをほんの数行に減らすことができます。Translationlanguage_idlanguage_keytranslation

Doctrineの関連付けもご覧ください。現在、コードを表示することはできません(電話を使用しています)が、すぐに道を見つけることができると確信しています

編集:基本的にあなたのフォームは次のようになります:

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との間に適切な関連付けを追加することを忘れないでくださいLanguage(おそらく、一方向の多対1の関連付けが必要です)。そしてもちろん、検証ルール(カウントを見てください)。

これは、少なくともSymfony2.1.0を使用していることを前提としています。

于 2013-02-24T00:59:51.570 に答える