Тип поля сущности Symfony2 альтернативы "свойству" или "__toString()"?
Используя тип поля сущности Symfony2, нужно указать property
опция:
$builder->add('customers', 'entity', array(
'multiple' => true,
'class' => 'AcmeHelloBundle:Customer',
'property' => 'first',
));
Но иногда этого недостаточно: подумайте о двух клиентах с одинаковыми именами, поэтому показ электронной почты (уникальной) будет обязательным.
Другая возможность заключается в реализации __toString()
в модель:
class Customer
{
public $first, $last, $email;
public function __toString()
{
return sprintf('%s %s (%s)', $this->first, $this->last, $this->email);
}
}
Недостаток последнего заключается в том, что вы вынуждены одинаково отображать сущность во всех ваших формах.
Есть ли другой способ сделать это более гибким? Я имею в виду что-то вроде функции обратного вызова:
$builder->add('customers', 'entity', array(
'multiple' => true,
'class' => 'AcmeHelloBundle:Customer',
'property' => function($data) {
return sprintf('%s %s (%s)', $data->first, $data->last, $data->email);
},
));
3 ответа
Я нашел это действительно полезным, и я нашел очень простой способ сделать это с вашим кодом, так что вот решение
$builder->add('customers', 'entity', array(
'multiple' => true,
'class' => 'AcmeHelloBundle:Customer',
'property' => 'label',
));
А в классе Заказчик (Entity)
public function getLabel()
{
return $this->lastname .', '. $this->firstname .' ('. $this->email .')';
}
вуаля:D свойство получает свою строку от сущности, а не базы данных.
Прохождение закрытия пока не работает, но скоро будет добавлено в Symfony: https://github.com/symfony/symfony/issues/4067
Кажется, это может быть достигнуто путем добавления следующего блока после elseif ($this->labelPath)
блок в ObjectChoiceList.php.
elseif (is_callable($this->labelPath)) {
$labels[$i] = call_user_func($this->labelPath, $choice);
}
Хотя не пробовал это:).