Skip to content

Instantly share code, notes, and snippets.

@DavidBadura
Created May 15, 2015 12:46
Show Gist options
  • Save DavidBadura/94e8636f8fec5d9a2a03 to your computer and use it in GitHub Desktop.
Save DavidBadura/94e8636f8fec5d9a2a03 to your computer and use it in GitHub Desktop.
Symfony2 Datalist Extension
<?php
namespace AppBundle\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
/**
* @author David Badura <d.a.badura@gmail.com>
*/
class DataListExtension extends AbstractTypeExtension
{
/**
* @param FormView $view
* @param FormInterface $form
* @param array $options
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
if (!$options['datalist']) {
return;
}
$dataListId = $view->vars['id'] . '_datalist';
$view->vars['attr']['list'] = $dataListId;
$view->vars['datalist_id'] = $dataListId;
$view->vars['datalist'] = $options['datalist'];
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(['datalist' => []]);
}
/**
* Returns the name of the type being extended.
*
* @return string The name of the type being extended
*/
public function getExtendedType()
{
return 'text';
}
}
{% block form_widget_simple -%}
{{ parent() }}
{% if datalist is defined %}
<datalist id="{{ datalist_id }}">
{% for item in datalist %}
<option value="{{ item }}">
{% endfor %}
</datalist>
{% endif %}
{%- endblock %}
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="form.typ_extension.data_list" class="AppBundle\Form\Extension\DataListExtension">
<tag name="form.type_extension" alias="text"/>
</service>
</services>
</container>
@ThomasLandauer
Copy link

Update for Symfony 4.4:

namespace App\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * https://gist.github.com/DavidBadura/94e8636f8fec5d9a2a03
 * @author David Badura <d.a.badura@gmail.com>
 */
class DatalistExtension extends AbstractTypeExtension
{
    /**
     * @param FormView $view
     * @param FormInterface $form
     * @param array $options
     */
    public function finishView(FormView $view, FormInterface $form, array $options): void
    {
        if (!$options['datalist']) {
            return;
        }

        $datalistId = $view->vars['id'] . '_datalist';
        $view->vars['attr']['list'] = $datalistId;

        $view->vars['datalist_id'] = $datalistId;
        $view->vars['datalist'] = $options['datalist'];
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults(['datalist' => []]);
    }

    public static function getExtendedTypes(): iterable
    {
        return [TextType::class];
    }
}

And the configuration in services.xml (or services.yaml) is not necessary any more.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment