Привет У меня есть две формы: форма спецификации и форма источника.Symfony объединяет две формы, у которых есть одноименное поле
Я объединяю две формы в одну, чтобы пользователи могли одновременно отправлять спецификацию и источник спецификации.
Проблема заключается в том, что в таблице спецификаций есть поле под названием name, а в исходной таблице - поле с именем. Таким образом, при создании форм и слиянии у меня есть два поля имени, которые должны ссылаться на две разные вещи: имя спецификации и имя источника. Любой способ обойти это без реструктуризации модели/базы данных?
class NewsLinkForm extends BaseNewsLinkForm
{
public function configure()
{
unset($this['id']);
$link = new SourceForm();
$this->mergeForm($link);
$this->useFields(array('name', 'source_url'));
$this->setValidators(array(
'source_url' => new sfValidatorUrl(),
));
$this->validatorSchema->setOption('allow_extra_fields', true);
}
}
class SourceForm extends BaseLimelightForm
{
public function configure()
{
$this->useFields(array('name'));
$this->setWidgets(array(
'name' => new sfWidgetFormInputText(array(),
array(
'class' => 'source_name rnd_3',
'maxlength' => 50,
'data-searchahead' => url_for('populate_sources_ac'),
'data-searchloaded' => '0'
)),
));
$this->setValidators(array(
'name' => new sfValidatorString(array('trim' => true, 'required' => true, 'min_length' => 3, 'max_length' => 50)),
));
$this->widgetSchema->setNameFormat('source[%s]');
}
}
<h5>add specification</h5>
<div class="item">
<?php echo $specificationForm['name']->renderLabel() ?>
<?php echo $specificationForm['name']->render(array('data-searchahead' => url_for('populate_lime_specifications_ac'), 'data-searchloaded' => '0')) ?>
</div>
<div class="item">
<?php echo $specificationForm['content']->renderLabel() ?>
<?php echo $specificationForm['content']->render(array('data-searchahead' => url_for('populate_specifications_ac'), 'data-searchloaded' => '0')) ?>
</div>
<div class="clear"></div>
<div class="item">
<?php echo $specificationForm['name']->renderLabel() ?>
<?php echo $specificationForm['name']->render() ?>
</div>
<div class="item">
<?php echo $specificationForm['source_url']->renderLabel() ?>
<?php echo $specificationForm['source_url']->render() ?>
</div>
Хмм я попробовал это и получаю ошибку 'Поле должно быть экземпляром sfWidget. – Marc
@Marc: странно ... что такое класс $ newsLinkForm ['name']? – greg0ire
Таким образом, это заканчивается классом sfFormInput. getWidget ('name') получит класс виджета. Я закончил использование следующей в исходной форме, которая объединяется, чтобы переименовать имя в source_name: $ this-> setWidget ('source_name', $ this-> getWidget ('name')); unset ($ this ['name']); – Marc