/** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { if (isset($options['include'])) { $this->include = $options['include']; } if (isset($options['multiple'])) { $this->multiple = $options['multiple']; } if ($this->include && !$this->multiple) { throw new \LogicException("You can't include an object in a single selection!"); } $builderName = ucfirst($builder->getName()); // TODO: Use a more accurate placeholder $placeholder = $this->multiple ? 'brad, kierra, ...' : null; if ($this->include) { $exclude = $this->include->getType() . ':' . $this->include->getId(); } else { $exclude = null; } // Model IDs that will be manipulated by javascript $builder->add('ids', 'hidden', array('attr' => array('class' => 'select2-compatible', 'data-exclude' => $exclude, 'data-label' => $builderName, 'data-multiple' => $this->multiple, 'data-required' => $options['required']))); // Model name inputs that will be edited by users if javascript is // disabled foreach ($this->types as $type) { $pluralType = $this->multiple ? Inflector::pluralize($type) : $type; $label = count($this->types) > 1 ? "{$builderName} {$pluralType}" : $builderName; $builder->add($builder->create($type, 'text', array('attr' => array('class' => 'model-select', 'data-type' => $type, 'placeholder' => $placeholder), 'label' => $label, 'required' => false))); } if ($this->multiple) { $transformer = new MultipleAdvancedModelTransformer($this->types); if ($this->include) { $transformer->addInclude($this->include); } } else { $transformer = new SingleAdvancedModelTransformer($this->types); } $builder->addViewTransformer($transformer); // Make sure we can change the values provided by the user $builder->setDataLocked(false); }