Symfon2 Выложи 3 текстовых поля с виджетом

Можно ли установить виджет так, чтобы он мог выплевывать 1-3 текстовых поля в зависимости от желаемого формата? У меня есть объект Coordainate с длинным и латовым полем. Некоторые из наших пользователей предпочитают градусы, минуты, секунды, градусы, десятичные. У нас есть настройки, чтобы справиться с этим в нашей текущей системе (Symfony 1.4), и я хотел бы использовать те же файлы настроек. Я уверен, что это прошло через варианты?

Вот мой класс формы:

    <?php
namespace ***\adminBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CoordinateType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('gps84Lat')
->add('gps84Long')
->getForm()
;
}

/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => '***\adminBundle\Entity\Coordinate'
));
}

/**
* @return string
*/
public function getName()
{
return '***_adminbundle_coordinate';
}
}

** РЕДАКТИРОВАТЬ: пример использования файла настройки:

    $custom = $options['attr']['customization_file'];
$cf     = $custom['form'];

if(!array_key_exists(0, $cf['fields']['field']))
$cf['fields']['field']  = array($cf['fields']['field']);

foreach($cf['fields']['field'] as $field)
{
if(in_array($field['name'], array('gps_84_lat', 'gps_84_long')))
{
if($field['format'] == 'dms')
{
// standard degrees-minutes-seconds GPS field
if($field['name'] == 'gps_84_lat')
$gps    = $this->getObject()->getGps84Lat();
elseif($field['name'] == 'gps_84_long')
$gps    = $this->getObject()->getGps84Long();
else
$gps    = '';

// degrees
$this->setWidget($field['name'].'_degrees', CustomWidgetExtender::createSfWidget($field, $user, $this));
$this->widgetSchema->setLabel($field['name'].'_degrees', $field['label']);

if(!$this->isNew())
$this->setDefault($field['name'].'_degrees', DataMan::getGpsDeg($gps));
elseif(trim($field['default']) != '')
$this->setDefault($field['name'].'_degrees', DataMan::getGpsDeg($field['default']));

// minutes
$this->setWidget($field['name'].'_minutes', CustomWidgetExtender::createSfWidget($field, $user, $this));
$this->widgetSchema->setLabel($field['name'].'_minutes', $field['label']);

if(!$this->isNew())
$this->setDefault($field['name'].'_minutes', DataMan::getGpsMin($gps));
elseif(trim($field['default']) != '')
$this->setDefault($field['name'].'_minutes', DataMan::getGpsMin($field['default']));

// seconds
$this->setWidget($field['name'].'_seconds', CustomWidgetExtender::createSfWidget($field, $user, $this));
$this->widgetSchema->setLabel($field['name'].'_seconds', $field['label']);

if(!$this->isNew())
$this->setDefault($field['name'].'_seconds', DataMan::getGpsSec($gps));
elseif(trim($field['default']) != '')
$this->setDefault($field['name'].'_seconds', DataMan::getGpsSec($field['default']));

// add field name to use_fields array
array_push($use_fields, $field['name'].'_degrees');
array_push($use_fields, $field['name'].'_minutes');
array_push($use_fields, $field['name'].'_seconds');

}
elseif($field['format'] == 'dm')
{
// degrees-decimal minutes GPS field
if($field['name'] == 'gps_84_lat')
$gps    = $this->getObject()->getGps84Lat();
elseif($field['name'] == 'gps_84_long')
$gps    = $this->getObject()->getGps84Long();
else
$gps    = '';

// degrees
$this->setWidget($field['name'].'_degrees', CustomWidgetExtender::createSfWidget($field, $user, $this));
$this->widgetSchema->setLabel($field['name'].'_degrees', $field['label']);

if(!$this->isNew())
$this->setDefault($field['name'].'_degrees', DataMan::getGpsDeg($gps));
elseif(trim($field['default']) != '')
$this->setDefault($field['name'].'_degrees', DataMan::getGpsDeg($field['default']));

// minutes
$this->setWidget($field['name'].'_minutes', CustomWidgetExtender::createSfWidget($field, $user, $this));
$this->widgetSchema->setLabel($field['name'].'_minutes', $field['label']);

if(!$this->isNew())
$this->setDefault($field['name'].'_minutes', DataMan::getGpsMin($gps, 5));
elseif(trim($field['default']) != '')
$this->setDefault($field['name'].'_minutes', DataMan::getGpsMin($field['default'], 5));

// add field name to use_fields array
array_push($use_fields, $field['name'].'_degrees');
array_push($use_fields, $field['name'].'_minutes');

}
else
{
// standard decimal degrees GPS field
$this->setWidget($field['name'], CustomWidgetExtender::createSfWidget($field, $user, $this));
$this->widgetSchema->setLabel($field['name'], $field['label']);

if(trim($field['default']) != '')
$this->setDefault($field['name'], $field['default']);

// add field name to use_fields array
array_push($use_fields, $field['name']);

}

0

Решение

Вы можете использовать условия в вашем методе построителя, основываясь на том, что в опциях:

public function buildForm(FormBuilderInterface $builder, array $options)
{
if(<some state of options>) {
$builder->add(...);
}
// and so on
}

Кстати, что вы подразумеваете под «настройками для обработки»?

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector