otago/autocomplete-suggest-field

自动补全建议字段

安装次数: 7,908

依赖: 0

建议者: 0

安全性: 0

星级: 7

关注者: 4

分支: 4

开放问题: 0

类型:silverstripe-vendormodule

5.0 2024-08-06 21:54 UTC

This package is auto-updated.

Last update: 2024-09-12 22:41:18 UTC


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 成员。

When you start typing, suggestions will appear gif

安装

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));
	}
}