group_by im formbuilder: erstellen von optgroups im dropdown

11. Juni 2015

Ich habe 2 Entities, “Category” und “DetailCategory”. Jede DetailCategory hat eine Category. Um dem User das Finden der richtigen DetailCategory zu erleichtern (da sie oft auch gleich benannt sind), wollte ich nicht einfach ein Dropdown, sondern eines, wo die Categories optgroups sind. Ich fand heraus, dass das eigentlich mit group_by geht, also versuchte ich zunächst folgendes:

  1. $form = $this->createFormBuilder()
  2. ->add('detailCategories', 'entity', array('label' => 'Kategorien', 'multiple' => true, 'class' => 'Package\Bundle\Entity\DetailCategory', 'group_by' => 'category', 'property' => 'name'))
  3. ->getForm();

Da hat Symfony aber nicht mitgemacht und eine Fehlermeldung geworfen:

  1. Warning: Illegal offset type in isset or empty

Der Grund dafür ist wohl, dass Symfony mit “category” so nicht klarkommt, da es kein Feld sondern eine Entity ist. Also habe ich diesen hilfreichen Beitrag auf Stackoverflow gefunden und dementsprechend in meiner DetailCategory Entity eine Funktion hinzugefügt:

  1. public function getCategoryName(){
  2. if (null === $this->getCategory()) {
  3. return null;
  4. }
  5. if (null === $this->getCategory()->getName()) {
  6. return null;
  7. }
  8. return $this->getCategory()->getName();
  9. }

Und dann habe ich im Formbuilder das group_by entsprechend geändert:

  1. 'group_by' => 'categoryName'

Und tatsächlich, damit ging’s auf einmal!