Практически во всех проектах возникает необходимость отобразить выпадающий список в форме, данный в котором грузились бы с помощью ajax. В связи с этим еще 2 года назад я написал SuggestBundle для симфони, который содержит дополнительный тип формы, который может использоваться вместо стандартных типов entity
и document
. Ключевая особенность бандла в том, что выпадающий список подгружается с помощью ajax (при помощи библиотеки select2). На днях я наконец собрался с силами, чтобы написать документацию по бандлу и решил поделиться разработкой с сообществом.
Кроме того бандл можно использовать и для построения выпадающих список, которые никак не связаны с Doctrine ORM и Doctrine ODM.
Под катом инструкция по установке, настройке и использованию бандла.
Ссылка на бандл: https://github.com/sirian/suggest-bundle.
1. Установка
Добавьте sirian/suggest-bundle
пакет в секцию require
в файле composer.json
.
$ composer require sirian/suggest-bundle
Добавьте SuggestBundle в ваш AppKernel.php:
<?php
public function registerBundles()
{
$bundles = array(
// ...
new Sirian\SuggestBundle\SirianSuggestBundle(),
// ...
);
...
}
2. Конфигурация
После утсановки бандла, добавьте следующие строки в конфигурацию роутинга:
# app/config/routing.yml
_sirian_suggest:
resource: "@SirianSuggestBundle/Resources/config/routing.yml"
prefix: /suggest
И выберите версию виджета, которая будет использоваться по-умолчанию для форм (зависит от версии библиотеки select2, которую вы будете использовать в проекте). Допустимые значения select2_v3
, select2_v4
. Также вы можете указать другие опции формы, которые будут использоваться по умолчанию при использовании типа формы SuggestType::class
# app/config/config.yml
...
sirian_suggest:
form_options:
widget: select2_v4
attr:
placeholder: "Search..."
3. Настройка саггестеров
Для документов из Doctrine ODM и сущностей Doctrine ORM вы можете легко описать необходимые саггестеры в файле config.yml вашего проекта.
3.1. Doctrine ODM Document (Mongodb)
# app/config/config.yml
...
sirian_suggest:
odm:
category:
class: "MainBundle:Category"
property: name
user:
class: "MainBundle:User"
property: username
search:
email: ~
username: ~
3.2. Doctrine ORM Entity
# app/config/config.yml
...
sirian_suggest:
orm:
category:
class: "MainBundle:Category"
property: name
user:
class: "MainBundle:User"
property: username
search:
email: ~
username: ~
3.3. Произвольные саггестеры
В случае если вам необходима дополнительная логика для построения выпадающего спика — вы можете создать свой собственный саггестер. Например, давайте создадим AdminSuggester
который будет содержать только тех пользователей, которые имеют роль ROLE_ADMIN
. Для простоты мы может унаследовать класс от абстрактного класса DocumentSuggester (или EntitySuggester для Doctrine ORM).
<?php
namespace App\MainBundle\Suggest;
use App\MainBundle\Document\User;
use Doctrine\Common\Persistence\ManagerRegistry;
use Sirian\SuggestBundle\Suggest\DocumentSuggester;
use Sirian\SuggestBundle\Suggest\Item;
use Sirian\SuggestBundle\Suggest\SuggestQuery;
class AdminSuggester extends DocumentSuggester
{
public function __construct(ManagerRegistry $registry)
{
$options = [
'class' => User::class,
'id_property' => 'id',
'property' => 'username', // Свойство или метод, который будет использоваться для текстового представления в выпадающем списке
'search' => ['name' => 1, 'username' => 1, 'email' => 1]
];
parent::__construct($registry, $options);
}
protected function createSuggestQueryBuilder(SuggestQuery $query)
{
$qb = parent::createSuggestQueryBuilder($query);
$qb->field('roles')->equals('ROLE_ADMIN');
return $qb;
}
}
Опишите новый сервис в services.yml
с тегом sirian_suggest.suggester
app.suggester.admin:
class: App\MainBundle\Suggest\AdminSuggester
arguments: ["@doctrine_mongodb"]
tags:
- {name: 'sirian_suggest.suggester', alias: 'admin'}
Алиас admin
будет использоваться в параметре suggester
для типа формы SuggestType::class
и в url-адресе /suggest/admin
.
4. Использование
$formBuilder->add('category', SuggestType::class, [
'suggester' => 'category'
])
P.S.Больше информации по использованию бандла и дополнительному функционалу вы найдете на странице https://github.com/sirian/suggest-bundle.