15

1. はじめに

テキスト フィールドのセットをそれぞれデータベースの新しい行に保存し、それぞれに最初のボックスの値も一緒に保存する方法があるかどうか疑問に思っています。

2. 説明

フォームは次のとおりです。

ここに画像の説明を入力

ユーザーが保存すると、次のようにデータベースに保存されます。

ここに画像の説明を入力

私のテーブル構造は

ここに画像の説明を入力

3. 今何してるの?!

3.1 -addNew.phpコンストラクターの (from クラス ファイル (名前付け規則に従っていないことはわかっていますが、悪い)) で、コントローラーから言語のリストを取得します ( addNewAction())。

言語の配列をループして、言語翻訳用のテキスト フィールドを生成します。

3.2- ユーザーが保存をクリックすると、テキスト フィールドをループして言語キー テキスト フィールドをチェックし、その値を変数に保存して、翻訳テキスト フィールドをループするたびにその変数を使用します。

4.現在のコード


4.1 - 新しいアクションを追加

public function addNewAction()
{
  // to add new key and translation associated with it
  // an array of optnions which cotains list of languages

  $options = $this->getAllLanguages();
  $form = $this->createForm(new AddNew($options));
  $form->bind($this->getRequest());

  if ($form->isValid()) {
      foreach($form->getData() as $key => $value){
        $oTranslation = new Translations();
        if($key == 'languageKey'){
          $languageKey = $value;
          continue;
        }

        $locale = $key;
        $translation = $value;
        $language = $this->getDoctrine()
                    ->getRepository('CodeizSDBTranslatorBundle:Languages');
        $query = $language->createQueryBuilder('l')
                           ->select('l.id')
                           ->where('l.locale = :locale')
                           ->setParameter('locale' , $locale)
                           ->getQuery();
        $id = $query->getResult();
        $oTranslation->setLanguageId($id[0]['id']);
                     $oTranslation->setLanguageKey($languageKey);
                     $oTranslation->setTranslation($translation);
                  $em = $this->getDoctrine()->getManager();
      $em->persist($oTranslation);
      $em->flush();
    }



      return $this->redirect($this->generateUrl('codeiz_sdb_translator_addlanguagekey'));
  }
   return $this->render('CodeizSDBTranslatorBundle:Default:addNewKey.html.twig', array(
        'form' => $form->createView(),
    ));
}

4.2 - addNew.php (クラスから)

<?php
namespace Codeiz\SDBTranslatorBundle\Form\Add;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class AddNew extends AbstractType
{
    private $languages;
    public function __construct($languages){
        $this->languages = $languages;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->add('languageKey');
        foreach ($this->languages as $key => $value) {
                    $builder->add($value['locale'] , 'text' , array('label'=>$value['description']) );
        }


    }

    public function getName()
    {
        return 'addnew';
    }
}

4.3 - テキスト フィールドを生成するためにフォームに渡す配列は $this->languages次のようになります。

Array
(
    [0] => Array
        (
            [id] => 1
            [locale] => en_US
            [description] => English - United States
        )

    [1] => Array
        (
            [id] => 2
            [locale] => fr_FR
            [description] => Frenish
        )

)

5. 考えられる解決策

これらは、回避策として実行できると思ったものです。

5.1- 私のコード BLAH を使用してください。

5.2- 各言語が列になるようにデータベースを再構築します。

6. 結論

うまくいかないことをたくさん試しましたが、今のやり方では未熟に見えます。

それはさておき、私はまだ学習中であり、データベースなどを再構築することなく、この問題をそのまま解決したいと考えています。

ノート:

パフォーマンス について 議論 する の は 避け , 問題 に 焦点 を 当て て ください . そして タイトル を 変更 し て ください . これ は 問題 を 説明 する 正しい 方法 で は ない と 確信 し て います .それら..ありがとう:)

4

4 に答える 4

2

以下のコードは、あなたのものと同様の形式を持ち、各翻訳に対して SQL の select/insert ステートメントを書き出します。注: 言語の名前に基づいてデータベースから ID を取得する必要があるため、SELECT は ID を 2 番目のクエリ (値に languageid を示す部分) に渡す必要があります。

<?php
echo '<form method="post">
<input type="text" name="LanguageKey" value="_hello"/>
<input type="text" name="EnglishUS" value="sup"/>
<input type="text" name="French" value="bon"/>
<input type="submit" value="Submit"/>
</form>';

print_r($_POST);
echo "<br />\n";

        foreach ($_POST as $key => $val)
        {
                if ($key != 'LanguageKey')
                {
                        echo $key.': '.$val."<br />\n";
                        echo "SELECT id FROM Languages where description = '$key'<br />\n";
                        echo 'INSERT INTO translation (LanguageId,LanguageKey,Translation) VALUES (\'languageid\',\''.$_POST['LanguageKey'].'\',\''.$val.'\')'."<br />\n";
                }
        }
?>

結果:

実行時のページの切り取り

于 2013-03-01T10:56:17.207 に答える
1

https://github.com/KnpLabs/DoctrineBehaviors#translatableもご覧ください。

フォームのものは、TranslationType のコレクションを使用して処理できます。

于 2013-03-04T15:24:09.640 に答える
1

コードの再構築を気にしない場合は、DoctrineのTranslatable拡張機能を検討することをお勧めします。Symfony2 での翻訳ビジネスの処理に関する膨大な機能セットを提供します。

于 2013-03-01T14:28:23.190 に答える
1

このインスタンスで探しているのはEmbedded Formsです。

これにより、複数の翻訳を含む翻訳フォームを作成できます。

言語キー フィールドを親フォームに追加すると、POST データの子翻訳をループできます。

これはよりエレガントで拡張可能なソリューションですが、壊れていない場合は修正しないでください。

于 2013-03-05T16:20:22.040 に答える