SuggestBundle або випадають ajax списки в Symfony

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

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.