class YamlFormElementController in YAML Form 8
Provides route responses for form element.
Hierarchy
- class \Drupal\Core\Controller\ControllerBase implements ContainerInjectionInterface uses LoggerChannelTrait, MessengerTrait, LinkGeneratorTrait, RedirectDestinationTrait, UrlGeneratorTrait, StringTranslationTrait
- class \Drupal\yamlform\Controller\YamlFormElementController
Expanded class hierarchy of YamlFormElementController
File
- src/
Controller/ YamlFormElementController.php, line 18
Namespace
Drupal\yamlform\ControllerView source
class YamlFormElementController extends ControllerBase {
/**
* Returns response for message close using user or state storage.
*
* @param string $storage
* Mechanism that the message state should be stored in, user or state.
* @param string $id
* The unique id of the message.
*
* @return \Drupal\Core\Ajax\AjaxResponse
* An empty AJAX response.
*
* @throws \Exception
* Throws exception is storage is not set to 'user' or 'state'.
*
* @see \Drupal\yamlform\Element\YamlFormMessage::setClosed
*/
public function close($storage, $id) {
if (!in_array($storage, [
'user',
'state',
])) {
throw new \Exception('Undefined storage mechanism for YAML Form close message.');
}
YamlFormMessage::setClosed($storage, $id);
return new AjaxResponse();
}
/**
* Returns response for the element autocomplete route.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The current request object containing the search string.
* @param \Drupal\yamlform\YamlFormInterface $yamlform
* A form.
* @param string $key
* Form element key.
*
* @return \Symfony\Component\HttpFoundation\JsonResponse
* A JSON response containing the autocomplete suggestions.
*/
public function autocomplete(Request $request, YamlFormInterface $yamlform, $key) {
// Get autocomplete query.
$q = $request->query
->get('q') ?: '';
if ($q == '') {
return new JsonResponse([]);
}
// Get the initialized form element.
$element = $yamlform
->getElement($key);
if (!$element) {
return new JsonResponse([]);
}
// Set default autocomplete properties.
$element += [
'#autocomplete_existing' => FALSE,
'#autocomplete_items' => [],
'#autocomplete_match' => 3,
'#autocomplete_limit' => 10,
'#autocomplete_match_operator' => 'CONTAINS',
];
// Check minimum number of characters.
if (Unicode::strlen($q) < (int) $element['#autocomplete_match']) {
return new JsonResponse([]);
}
$matches = [];
// Get existing matches.
if (!empty($element['#autocomplete_existing'])) {
$matches += $this
->getMatchesFromExistingValues($q, $yamlform
->id(), $key, $element['#autocomplete_match_operator'], $element['#autocomplete_limit']);
}
// Get items (aka options) matches.
if (!empty($element['#autocomplete_items'])) {
$element['#options'] = $element['#autocomplete_items'];
$options = YamlFormOptions::getElementOptions($element);
$matches += $this
->getMatchesFromOptions($q, $options, $element['#autocomplete_match_operator'], $element['#autocomplete_limit']);
}
// Sort matches and enforce the limit.
if ($matches) {
ksort($matches);
$matches = array_values($matches);
$matches = array_slice($matches, 0, $element['#autocomplete_limit']);
}
return new JsonResponse($matches);
}
/**
* Get matches from existing submission values.
*
* @param string $q
* String to filter option's label by.
* @param string $yamlform_id
* The form id.
* @param string $key
* The element's key.
* @param string $operator
* Match operator either CONTAINS or STARTS_WITH.
* @param int $limit
* Limit number of matches.
*
* @return array
* An array of matches.
*/
protected function getMatchesFromExistingValues($q, $yamlform_id, $key, $operator = 'CONTAINS', $limit = 10) {
// Query form submission for existing values.
$query = Database::getConnection()
->select('yamlform_submission_data')
->fields('yamlform_submission_data', [
'value',
])
->condition('yamlform_id', $yamlform_id)
->condition('name', $key)
->condition('value', $operator == 'START_WITH' ? "{$q}%" : "%{$q}%", 'LIKE')
->orderBy('value');
if ($limit) {
$query
->range(0, $limit);
}
// Convert query results values to matches array.
$values = $query
->execute()
->fetchCol();
$matches = [];
foreach ($values as $value) {
$matches[$value] = [
'value' => $value,
'label' => $value,
];
}
return $matches;
}
/**
* Get matches from options.
*
* @param string $q
* String to filter option's label by.
* @param array $options
* An associative array of form options.
* @param string $operator
* Match operator either CONTAINS or STARTS_WITH.
* @param int $limit
* Limit number of matches.
*
* @return array
* An array of matches sorted by label.
*/
protected function getMatchesFromOptions($q, array $options, $operator = 'CONTAINS', $limit = 10) {
// Make sure options are populated.
if (empty($options)) {
return [];
}
$matches = [];
// Filter and convert options to autocomplete matches.
$this
->getMatchesFromOptionsRecursive($q, $options, $matches, $operator);
// Sort matches.
ksort($matches);
// Apply match limit.
if ($limit) {
$matches = array_slice($matches, 0, $limit);
}
return array_values($matches);
}
/**
* Get matches from options recursive.
*
* @param string $q
* String to filter option's label by.
* @param array $options
* An associative array of form options.
* @param array $matches
* An associative array of autocomplete matches.
* @param string $operator
* Match operator either CONTAINS or STARTS_WITH.
*/
protected function getMatchesFromOptionsRecursive($q, array $options, array &$matches, $operator = 'CONTAINS') {
foreach ($options as $value => $label) {
if (is_array($label)) {
$this
->getMatchesFromOptionsRecursive($q, $label, $matches, $operator);
continue;
}
// Cast TranslatableMarkup to string.
$label = (string) $label;
if ($operator == 'STARTS_WITH' && stripos($label, $q) === 0) {
$matches[$label] = [
'value' => $label,
'label' => $label,
];
}
elseif (stripos($label, $q) !== FALSE) {
$matches[$label] = [
'value' => $label,
'label' => $label,
];
}
}
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ControllerBase:: |
protected | property | The configuration factory. | |
ControllerBase:: |
protected | property | The current user service. | 1 |
ControllerBase:: |
protected | property | The entity form builder. | |
ControllerBase:: |
protected | property | The entity manager. | |
ControllerBase:: |
protected | property | The entity type manager. | |
ControllerBase:: |
protected | property | The form builder. | 2 |
ControllerBase:: |
protected | property | The key-value storage. | 1 |
ControllerBase:: |
protected | property | The language manager. | 1 |
ControllerBase:: |
protected | property | The module handler. | 2 |
ControllerBase:: |
protected | property | The state service. | |
ControllerBase:: |
protected | function | Returns the requested cache bin. | |
ControllerBase:: |
protected | function | Retrieves a configuration object. | |
ControllerBase:: |
private | function | Returns the service container. | |
ControllerBase:: |
public static | function |
Instantiates a new instance of this class. Overrides ContainerInjectionInterface:: |
40 |
ControllerBase:: |
protected | function | Returns the current user. | 1 |
ControllerBase:: |
protected | function | Retrieves the entity form builder. | |
ControllerBase:: |
protected | function | Retrieves the entity manager service. | |
ControllerBase:: |
protected | function | Retrieves the entity type manager. | |
ControllerBase:: |
protected | function | Returns the form builder service. | 2 |
ControllerBase:: |
protected | function | Returns a key/value storage collection. | 1 |
ControllerBase:: |
protected | function | Returns the language manager service. | 1 |
ControllerBase:: |
protected | function | Returns the module handler. | 2 |
ControllerBase:: |
protected | function |
Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait:: |
|
ControllerBase:: |
protected | function | Returns the state storage service. | |
LinkGeneratorTrait:: |
protected | property | The link generator. | 1 |
LinkGeneratorTrait:: |
protected | function | Returns the link generator. | |
LinkGeneratorTrait:: |
protected | function | Renders a link to a route given a route name and its parameters. | |
LinkGeneratorTrait:: |
public | function | Sets the link generator service. | |
LoggerChannelTrait:: |
protected | property | The logger channel factory service. | |
LoggerChannelTrait:: |
protected | function | Gets the logger for a specific channel. | |
LoggerChannelTrait:: |
public | function | Injects the logger channel factory. | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
RedirectDestinationTrait:: |
protected | property | The redirect destination service. | 1 |
RedirectDestinationTrait:: |
protected | function | Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url. | |
RedirectDestinationTrait:: |
protected | function | Returns the redirect destination service. | |
RedirectDestinationTrait:: |
public | function | Sets the redirect destination service. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
UrlGeneratorTrait:: |
protected | property | The url generator. | |
UrlGeneratorTrait:: |
protected | function | Returns the URL generator service. | |
UrlGeneratorTrait:: |
public | function | Sets the URL generator service. | |
UrlGeneratorTrait:: |
protected | function | Generates a URL or path for a specific route based on the given parameters. | |
YamlFormElementController:: |
public | function | Returns response for the element autocomplete route. | |
YamlFormElementController:: |
public | function | Returns response for message close using user or state storage. | |
YamlFormElementController:: |
protected | function | Get matches from existing submission values. | |
YamlFormElementController:: |
protected | function | Get matches from options. | |
YamlFormElementController:: |
protected | function | Get matches from options recursive. |