Вставляйте все текстовые поля отдельно вместе со значением первого текстового поля [отношение много к одному] - программирование
Подтвердить что ты не робот

Вставляйте все текстовые поля отдельно вместе со значением первого текстового поля [отношение много к одному]

1. Введение

Мне интересно, есть ли способ сохранить набор текстовых полей каждый из них в новой строке в базе данных, и в каждом из них также будет сохранено значение первого окна.

2. Объяснение

Вот форма:

enter image description here

Когда пользователь нажимает "Сохранить", он должен быть сохранен в базе данных следующим образом:

enter image description here

Моя структура таблицы

enter image description here

3. Что я делаю прямо сейчас?!

3.1 - В моем addNew.php (из файла класса (я знаю, что я не соблюдаю соглашение об именах, мое плохое) в конструкторе я получаю список языков из моего контроллера (addNewAction()).

Я просматриваю массив языков и генерирую текстовые поля для перевода языка.

3.2- Когда пользователь нажимает кнопку "Сохранить", я просматриваю текстовые поля и проверяю текстовое поле ключевого слова и сохраняю его значение в переменной и использую эту переменную каждый раз, когда я прокручиваю текстовые поля перевода

4. Мой текущий код


4.1 - addNewAction

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. Вывод

Я пробовал так много вещей, которые не сработали для меня, и то, как я делаю это сейчас, делает его незрелым.

Помимо всего этого, я все еще участвую, и я действительно хочу решить эту проблему так: без реструктуризации базы данных и т.д.

Примечание:

пожалуйста, избегайте обсуждения производительности, сосредоточьтесь на проблеме... и, пожалуйста, измените заголовок как я уверен, что это не правильный способ описать проблему.. или даже лучше предложить один.. и если вы неправильно сформулируете технические термины, пожалуйста, отредактируйте их.. спасибо:)

4b9b3361

Ответ 1

То, что вы ищете в этом случае, Встроенные формы.

Это позволяет вам создать форму перевода с несколькими переводами внутри нее.

Добавьте свое языковое поле ключа в родительскую форму, а затем вы можете перебирать дочерние переводы в данных POST.

Это более элегантное и расширяемое решение, но если оно не сломано, не исправляйте его.

Ответ 2

Нижеприведенный код имеет форму, аналогичную вашей, и выписывает операторы SQL select/insert для каждого из переводов. ПРИМЕЧАНИЕ. SELECT должен передать идентификатор во второй запрос (часть, которая говорит 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";
                }
        }
?>

Результаты:

snip of page when it's run

Ответ 3

Если вы не возражаете перестроить свой код, я бы предложил взглянуть на расширение Translatable для Doctrine. Он предлагает массивный набор функций, касающихся обработки бизнес-переводов в Symfony2.