2012-03-28 14 views
17

Usando Symfony2 entity field type uno debe especificar property opción:Tipo de campo de entidad Symfony2 alternativas a "propiedad" o "__ aString()"?

$builder->add('customers', 'entity', array(
    'multiple' => true, 
    'class' => 'AcmeHelloBundle:Customer', 
    'property' => 'first', 
)); 

Pero a veces esto no es suficiente: pensar en dos clientes con el mismo nombre, por lo que mostrará el correo electrónico (única) sería obligatorio.

Otra posibilidad es implementar __toString() en el modelo:

class Customer 
{ 
    public $first, $last, $email; 

    public function __toString() 
    { 
     return sprintf('%s %s (%s)', $this->first, $this->last, $this->email); 
    } 
} 

Los disadvances de esto último es que son obligados a mostrar la entidad de la misma manera en todas sus formas.

¿Hay alguna otra manera de hacerlo más flexible? que quiere decir algo así como una función de devolución de llamada:

$builder->add('customers', 'entity', array(
    'multiple' => true, 
    'class' => 'AcmeHelloBundle:Customer', 
    'property' => function($data) { 
     return sprintf('%s %s (%s)', $data->first, $data->last, $data->email); 
    }, 
)); 
+0

tengo esta misma situación exacta y tenía la intención de plantear una pregunta en tan poco tiempo ... Estoy deseando que llegue el responder. – Icode4food

Respuesta

40

He encontrado esto realmente útil, y yo herida de una manera muy fácil de hacer esto con su código de manera que aquí es la solución

$builder->add('customers', 'entity', array(
'multiple' => true, 
'class' => 'AcmeHelloBundle:Customer', 
'property' => 'label', 
)); 

Y en la clase de cliente (la Entidad)

public function getLabel() 
{ 
    return $this->lastname .', '. $this->firstname .' ('. $this->email .')'; 
} 

eh voila: D la propiedad obtiene su cadena de la entidad, no la base de datos.

+6

Probablemente deberías usar los captadores y no acceder a los valores directamente. 'return $ this-> getLastname(). ','. $ this-> getFirstname(). ' ('. $ this-> getEmail().') '; ' –

+0

Esto es genial, excepto si necesita generar una miniatura o algo que no puede hacer desde el modelo ... – darkbluesun

1

Parece que esto puede ser alcanzable mediante la adición siguiente bloque tras bloque en elseif ($this->labelPath)ObjectChoiceList.php.

elseif (is_callable($this->labelPath)) { 
    $labels[$i] = call_user_func($this->labelPath, $choice); 
} 

No lo he probado :).

+1

Eso parece que funcionaría, pero requiere hackear Symfony. Preferiría evitar eso si es posible. Seguramente hay una manera "correcta" de hacer esto. Me parece un problema bastante importante. – Icode4food

+0

@ Icode4food de acuerdo. – gremo

+0

Bueno, es la única manera AFIK. Para llegar al núcleo de Symfony2, se debe enviar un RP a github. Puedo presentar un PR con la prueba unitaria adecuada si tengo tiempo libre. Si alguien envía un PR también es bueno. –

Cuestiones relacionadas