2012-03-28 7 views
17

Korzystanie Symfony2 entity field type jeden powinien określić property opcję:Symfony2 typy pól typu alternatywy do "właściwości" lub "__toString()"?

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

Ale czasami to nie wystarcza: myśleć o dwóch klientów o tej samej nazwie, więc wyświetlenie e-mail (unikalny) byłoby obowiązkowe.

Inną możliwością jest wprowadzenie __toString() do modelu:

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

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

W disadvances tych ostatnich jest to, że jesteś zmuszony do wyświetlania podmiotowi w ten sam sposób we wszystkich formach.

Czy istnieje inny sposób na zwiększenie elastyczności? mam na myśli coś w rodzaju funkcji zwrotnej:

$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

mam dokładnie ten sam sytuację i zamierza odpowiedzieć na pytanie tak szybko ... Czekam do odpowiedź. – Icode4food

Odpowiedz

40

Znalazłem to bardzo pomocne, a ja nakręciłem naprawdę łatwy sposób to zrobić z kodem tak tutaj jest rozwiązanie

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

A w klasie klienta (podmiot)

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

eh voila: D właściwość pobiera swój ciąg z encji, a nie z bazy danych.

+6

Prawdopodobnie powinieneś używać modułów pobierających i nie uzyskiwać bezpośredniego dostępu do wartości. 'return $ this-> getLastname(). ','. $ this-> getFirstname(). ' ('. $ this-> getEmail().') '; ' –

+0

To świetnie, z wyjątkiem sytuacji, gdy potrzebujesz wygenerować miniaturkę lub coś, czego nie możesz zrobić z modelu ... – darkbluesun

1

wydaje może to być osiągalne dodając następujący blok po bloku w ObjectChoiceList.phpelseif ($this->labelPath).

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

Nie wypróbowałem jednak :).

+1

Wygląda na to, że zadziała, ale wymaga hakowania Symfony. Wolałbym tego unikać, jeśli to możliwe. Z pewnością istnieje "poprawny" sposób na zrobienie tego. Wydaje mi się, że jest to dość istotny problem. – Icode4food

+0

@ Icode4food zgadzam się. – gremo

+0

Cóż, to jedyny sposób AFIK. Aby dotrzeć do rdzenia Symfony2, należy wysłać PR do github. Mogę złożyć PR z odpowiednim testem jednostkowym, jeśli dostanę wolny czas. Jeśli ktoś zgłosi PR, który jest również dobry. –

Powiązane problemy