Drupal 9 创建自动填充表单
2022-03-22 本文已影响0人
又起风了_
- 如果创建的对象是实体类型(如node/user),可以直接使用Drupal原有的type,如下:
$form['my_entity'] = [
'#title' => 'My entity',
'#type' => 'entity_autocomplete',
'#target_type' => 'user',//或者node
];
//为node时可以再加个筛选器
$form['my_entity'] = [
'#title' => 'My entity',
'#type' => 'entity_autocomplete',
'#target_type' => 'node',
'#selection_handler' => 'default',
'#selection_settings' => array(
'target_bundles' => array('article', 'page'),//content type 为 article和page
),
];
- 使用
'#type' => 'entity_autocomplete'
时获取的是entity所有的集合,实际应用中可能需要特定的数据集,这就需要使用#autocomplete_route_name
来实现了
$form['article'] = [
'#type' => 'textfield',
'#title' => $this->t('Autocomplete Articles'),
//'#required' => true,
'#autocomplete_route_name' => 'mymodule.autocomplete',//指向路由mymodule.autocomplete
];
下一步在mymodule.routing.yml文件中定义下路由mymodule.autocomplete
mymodule.autocomplete:
path: '/autocomplete'
defaults:
_controller: 'Drupal\mymodule\Controller\ArticleController::handleAutocomplete'
_format: json
requirements:
_permission: 'access content'
控制器中,就可以按自己需求构造数据集了
<?php
namespace Drupal\mymodule\Controller;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Entity\Element\EntityAutocomplete;
use Drupal\node\Entity\Node;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
class ArticleController
{
public function handleAutocomplete(Request $request) {
$result = [];
$input = $request->query->get('q');
if (!$input) {
return new JsonResponse($result);
}
$input = Xss::filter($input);
$query = \Drupal::entityQuery('node')
->condition('type', 'article')
->condition('title', $input, 'CONTAINS')
->groupBy('nid')
->sort('created', 'DESC')
->range(0, 10);
$node_ids = $query->execute();
$nodes = $node_ids ? Node::loadMultiple($node_ids) : [];
foreach ($nodes as $node) {
$result[] = [
'label' => $node->getTitle() . '(' . $node->id() . ')',
'value' => EntityAutocomplete::getEntityLabels([$node]),
];
}
return new JsonResponse($result);//注意返回的是json格式
}
}
提交表单时,可以这样获取id值
/**
* Form submission handler.
*
* @param array $form
* An associative array containing the structure of the form.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the form.
*/
public function submitForm(array &$form, FormStateInterface $form_state)
{
//获取article id
$article = $form_state->getValue('article');
if ($article) {
$article_id = EntityAutocomplete::extractEntityIdFromAutocompleteInput($article);
$this->messenger()->addMessage('Article Id is:' . $article_id);
}
}
表单效果如下:
![](https://img.haomeiwen.com/i11745220/f3d5cd6823cb04c7.png)