В symfony2 у меня есть сущность Foo, которая имеет поле с именем $ kind, которое может иметь несколько (максимум около 10) различных значений (по одному в каждый момент времени) примерно так:
$kindArray('1' => 'type1', '2'=> 'type2');
и поле $ kind может получить один из индексов $ kindArray.
Я хочу одно местоположение, которое имеет $ kindArray и использовать его для значений choiceType при создании FooFormType.
как я могу показать это в сущности? я должен использовать массив или что-то вроде объекта значения?
Вы можете хранить эти виды как константы в классе сущностей.
class Foo
{
const KIND_1 = 1;
const KIND_2 = 2;
const KIND_3 = 3;
//...
/**
* @ORM\Column(type="smallint")
*/
protected $kind;
}
Обратите внимание, что константы являются целыми числами, поэтому они легко хранятся в базе данных. я использовал smallint
потому что это наименьшее целое число, доступное в Doctrine2.
Создайте новое поле формы для вида:
class KindChoiceType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$class = new \ReflectionClass('Namespace\Bar\Foo');
$resolver->setDefaults(array(
'choices' => array_flip($class->getConstants()),
'translation_domain' => 'kinds'
));
}
public function getName()
{
return 'kind_choice';
}
public function getParent()
{
return 'choice';
}
}
'Namespace\Bar\Foo'
полное имя вашего класса сущностей с пространством имен. (Обратите внимание, что это работает только потому, что все константы в классе являются разновидностями. Если вы добавите другие константы, вы должны изменить этот код.)
Теперь создайте файлы перевода для всех языков вашего сайта. Я обычно создаю YAML файл. Для английского это должно выглядеть так:
# YOUR_BUNDLE/Resources/translations/kinds.en.yml
KIND_1: first kind
KIND_2: kind no. 2
KIND_3: next kind
# ...
Теперь передайте ваш новый тип поля вместо 'choice'
когда вы создаете форму для вашей сущности Foo:
->add('kind', new KindChoiceType());
Вы можете иметь состояния в качестве констант, а затем возвращать их статическим методом, например так …
class Thing
{
const STATE_1 = 'state_1';
const STATE_2 = 'state_2';
const STATE_3 = 'state_3';
public static function getAllStates()
{
return array(
self::STATE_1,
self::STATE_2,
self::STATE_3,
);
}
}