2010-09-23 2 views
0

Привет У меня есть две формы: форма спецификации и форма источника.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> 

ответ

3

Вы можете попробовать этот кусок кода:

// rename the name field of the first form 
$sourceForm->setWidget('source_name', $sourceForm->getWidget('name')); 
unset($this['name']); 

// merge 
$newsLinkForm->mergeForm($sourceForm); 
+0

Хмм я попробовал это и получаю ошибку 'Поле должно быть экземпляром sfWidget. – Marc

+0

@Marc: странно ... что такое класс $ newsLinkForm ['name']? – greg0ire

+0

Таким образом, это заканчивается классом sfFormInput. getWidget ('name') получит класс виджета. Я закончил использование следующей в исходной форме, которая объединяется, чтобы переименовать имя в source_name: $ this-> setWidget ('source_name', $ this-> getWidget ('name')); unset ($ this ['name']); – Marc

Смежные вопросы