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. 結論
うまくいかないことをたくさん試しましたが、今のやり方では未熟に見えます。
それはさておき、私はまだ学習中であり、データベースなどを再構築することなく、この問題をそのまま解決したいと考えています。
ノート:
パフォーマンス について 議論 する の は 避け , 問題 に 焦点 を 当て て ください . そして タイトル を 変更 し て ください . これ は 問題 を 説明 する 正しい 方法 で は ない と 確信 し て います .それら..ありがとう:)