2012-03-28 7 views
17

Mit Symfony2 entity field type einem property Option angeben soll:Symfony2 Entity Feldtyp Alternativen zu "Eigenschaft" oder "__toString()"?

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

Aber manchmal ist dies nicht ausreichend: etwa zwei Kunden mit dem gleichen Namen denken, so zeigt die E-Mail (unique) würde obligatorisch sein.

Eine andere Möglichkeit ist __toString() in das Modell zu implementieren:

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

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

Die disadvances des letzteren ist, dass Sie das Unternehmen gezwungen sind in allen Formen die gleiche Art und Weise angezeigt werden soll.

Gibt es eine andere Möglichkeit, dies flexibler zu machen? Ich meine so etwas wie eine Callback-Funktion:

$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

Ich habe diese genau die gleiche Situation und plante auf SO bald eine Frage zu stellen ... Ich freue mich auf die Antworten. – Icode4food

Antwort

40

Das fand ich sehr hilfreich, und ich gewickelt, um eine wirklich einfache Möglichkeit, dies so hier mit Ihrem Code zu tun, ist die Lösung

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

Und in der Klasse Kunden (Entity)

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

eh voila: D Die Eigenschaft erhält ihren String von der Entity, nicht von der Datenbank.

+6

Sie sollten wahrscheinlich die Getter verwenden und nicht direkt auf die Werte zugreifen. 'return $ this-> getLastname(). ','. $ this-> getFirstname(). ' ('. $ this-> getEmail().') '; ' –

+0

Das ist großartig, außer wenn Sie ein Thumbnail oder etwas erzeugen müssen, was Sie nicht mit dem Modell machen können ... – darkbluesun

1

Es scheint, dies kann durch Zugabe von folgendem Block nach elseif ($this->labelPath) Block in ObjectChoiceList.php erreichbar sein.

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

Habe es aber nicht versucht :).

+1

Das sieht so aus, als würde es funktionieren, aber Symfony hacken müssen. Ich würde das lieber vermeiden, wenn es möglich ist. Sicherlich gibt es einen "richtigen" Weg, dies zu tun. Es scheint mir ein ziemlich substanzielles Problem zu sein. – Icode4food

+0

@Icode4food zustimmen. – gremo

+0

Nun, es ist der einzige Weg AFIK. Um es zu Symfony2 core zu machen, muss eine PR an github gesendet werden. Ich kann eine PR mit einem richtigen Unit Test einreichen, wenn ich freie Zeit habe. Wenn jemand eine PR einreicht, ist das auch gut. –

Verwandte Themen