otago / autocomplete-suggest-field
自动补全建议字段
5.0
2024-08-06 21:54 UTC
Requires
README
开箱即用 - 且更出色
https://docs.silverstripe.org/en/5/changelogs/5.2.0/#searchable-dropdown-field
https://api.silverstripe.org/5/SilverStripe/Forms/SearchableDropdownField.html
SilverStripe 的 Ajax 自动补全建议字段
使用 3.0 版本适用于 SilverStripe 3.*,使用 4.0 版本适用于 SilverStripe 4.*
允许用户在键入时从选项列表中选择。它将一个 ID 与字段关联;可以是 Int、Text 等。一些实用的用例包括;从大型列表中选择 CSS 类,从远程 API 选择用户,或者当您有成千上万的成员时选择 SilverStripe 成员。
安装
composer require otago/autocomplete-suggest-field
特性
- 灵活的自动补全 此字段允许开发者自定义自动补全列表中的内容。它填充一个 HTML5 元素,允许用户通过 AJAX 选择选项。要构建 AJAX 列表,创建一个名为 autocomplete 的操作,针对提供的控制器。它需要一个 GET 参数,并输出一个 id:etc, name:etc 格式的 json 数组。
- 友好的显示名称 您可以在 DataObject 或 Page 上有一个 $has_one 或 $db,并显示友好的名称而不是丑陋的 ID。这使得您的代码库更整洁,让您在不真正需要时忘记强制使用 many_many,并允许您的 CMS 管理员不讨厌您的界面。
- 前后端兼容 唯一的要求是 jQuery。不需要 entwine。
公开 JS 文件
composer vendor-expose
测试
vendor/silverstripe/framework/sake dev/tests/AutocompleteSuggestTest
支持
所有现代浏览器都支持此功能。较旧的 MSIE 版本无法工作
基本示例
以下将在 CMS 中创建一个搜索字段。注意已登录用户必须有权访问 Member 对象。搜索逻辑由随 autocomplete-suggest-field 一同提供的控制器处理。
<?php use OP\AutocompleteSuggestField; use SilverStripe\Security\Member; class MyFavouriteUserPage extends Page { private static $has_one = array( 'FavouriteUser' => Member::class ); public function getCMSFields() { $fields = parent::getCMSFields(); $suggesteduser = AutocompleteSuggestField::create('FavouriteUserID', Member::create()); $suggesteduser->setDescription('Enter text to search for your favourite user'); $fields->addFieldToTab('Root.Main', $suggesteduser); return $fields; } }
自定义搜索示例
以下显示开发者如何在同一文件中创建自定义搜索查询以返回结果
<?php use OP\AutocompleteSuggestField; use SilverStripe\CMS\Controllers\ModelAsController; use SilverStripe\Control\HTTPRequest; use SilverStripe\View\Requirements; use SilverStripe\Security\Member; class MyFavouriteUserPage extends Page { private static $has_one = array( 'FavouriteUser' => Member::class ); public function getCMSFields() { $fields = parent::getCMSFields(); $suggesteduser = AutocompleteSuggestField::create('FavouriteUserID', Member::create(), 'Favourite user', ModelAsController::controller_for($this), null); $suggesteduser->setDescription('Enter text to search for your favourite user'); $fields->addFieldToTab('Root.Main', $suggesteduser); return $fields; } } class MyFavouriteUserPageController extends PageController { private static $allowed_actions = array( 'autocompleteFavouriteUserID', ); /** * searches users in the local db * @param SS_HTTPRequest $httprequest */ public function autocompleteFavouriteUserID(HTTPRequest $httprequest) { Requirements::clear(); $query = $httprequest->getVar('query'); $returnarray = array(); if ($query && strlen($query) > 1) { $name = explode(' ', $query); $members = array(); if (count($name) === 1) { $members = Member::get()->filter(array('FirstName:StartsWith:nocase' => $name[0]))->limit(10); } if (count($name) > 1) { $members = Member::get()->filter(array('FirstName:StartsWith:nocase' => $name[0], 'Surname:StartsWith:nocase' => $name[1]))->limit(10); } foreach ($members as $member) { $returnarray[] = array('id' => $member->ID, 'name' => $member->getName()); } } print_r(json_encode($returnarray)); } }
一个更复杂的示例,它从外部 API 拉取数据
注意 [id=>'', name=>''] JSON 格式
class TeamPage_Controller extends Page_Controller { private static $allowed_actions = array( 'autocompleteTeam' ); /** * used to autocomplete the teams on office 365 * @param SS_HTTPRequest $httprequest */ public function autocompleteTeam(SS_HTTPRequest $httprequest) { Requirements::clear(); $query = $httprequest->getVar('query'); $returnarray = array(); if ($query && strlen($query) > 1) { $searchresult = office365::searchForTeam(urlencode($query)); foreach ($searchresult->value as $team) { $returnarray[] = array('id' => $team->id, 'name' => $team->displayName . ' (' . $team->description . ')'); } } print_r(json_encode($returnarray)); } }