Как стать автором
Обновить

SuggestBundle или выпадающие ajax списки в Symfony

Время на прочтение3 мин
Количество просмотров7.2K

Практически во всех проектах возникает необходимость отобразить выпадающий список в форме, данный в котором грузились бы с помощью 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.

Теги:
Хабы:
Всего голосов 8: ↑8 и ↓0+8
Комментарии8

Публикации

Истории

Работа

PHP программист
107 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань