backsystem / autocomplete
为Symfony提供的自动完成功能
v1.0.6
2024-07-03 08:31 UTC
Requires
- php: >=8.1
- doctrine/doctrine-bundle: >=2.4
- doctrine/orm: >=2.9
- symfony/dependency-injection: >=6.0
- symfony/form: >=6.0
- symfony/http-kernel: >=6.0
- symfony/security-bundle: >=6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: >=3.13
- phpstan/phpstan: >=1.8
This package is auto-updated.
Last update: 2024-10-03 09:10:39 UTC
README
信息
此Symfony包是基于Symfony UX Autocomplete创建的。后者满足其他需求,可能不会像Symfony UX Autocomplete那样适合所有人。
安装
首先,使用以下命令安装包
composer require backsystem/autocomplete
接下来,通过在config/routes/autocomplete.yaml
中创建以下文件来配置包
autocomplete: resource: '@AutocompleteBundle/config/routes.yaml' prefix: /api/search # You can choose the prefix you want
示例
<?php namespace App\Api; use App\Entity\Member; use App\Repository\MemberRepository; use BackSystem\Autocomplete\AbstractApi; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; /** * @template-extends AbstractApi<User> */ class UserApi extends AbstractApi { public function getEntityClass(): string { return User::class; } public function getUrl(): string { return '/users'; } public function createFilteredQueryBuilder(EntityRepository $repository, string $query): QueryBuilder { return $repository->createQueryBuilder('user') ->andWhere('CONCAT(user.id, user.firstName, user.lastName, user.firstName, user.email) LIKE :search') ->setParameter('search', '%' . str_replace(' ', '', $query) . '%'); } public function isValid(EntityRepository $repository, mixed $id): ?object { return $repository->createQueryBuilder('user') ->andWhere('user.id = :id') ->setParameter('id', $id) ->getQuery() ->getOneOrNullResult(); } public function getValue($entity): string { return (string) $entity->getId(); } public function getLabel($entity): string { return sprintf('<b>%s</b><span> - </span><i>%s</i><br><small>%s</small>', str_pad($entity->getId(), 5, '0', STR_PAD_LEFT), $entity->getFullName(), $entity->getEmail()); } public function getTitle($entity): string { return $entity->getFullName(); // Optional method, try with and without! :) } }
<?php namespace App\Form; use App\Api\UserApi; use App\Entity\Post; use BackSystem\Autocomplete\Type\AutocompleteType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class PostType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('title', TextType::class, [ 'label' => 'Amazing title', ])->add('user', AutocompleteType::class, [ 'class' => UserApi::class, 'placeholder' => 'Choose an user', ]); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Post::class, ]); } }