Вставляйте все текстовые поля отдельно вместе со значением первого текстового поля [отношение много к одному]
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. Вывод
Я пробовал так много вещей, которые не сработали для меня, и то, как я делаю это сейчас, делает его незрелым.
Помимо всего этого, я все еще участвую, и я действительно хочу решить эту проблему так: без реструктуризации базы данных и т.д.
Примечание:
пожалуйста, избегайте обсуждения производительности, сосредоточьтесь на проблеме...
и, пожалуйста, измените заголовок как я уверен, что это не правильный способ описать проблему.. или даже лучше предложить один.. и если вы неправильно сформулируете технические термины, пожалуйста, отредактируйте их.. спасибо:)
Ответы
Ответ 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.
Ответ 4
Возможно, вам захочется взглянуть на https://github.com/KnpLabs/DoctrineBehaviors#translatable.
Обработку формы можно обработать с помощью набора TranslationType.