Drupal

Drupal 9 创建自动填充表单

2022-03-22  本文已影响0人  又起风了_
  1. 如果创建的对象是实体类型(如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
      ),
    ];
  1. 使用'#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);
    }
  }

表单效果如下:


22.png
上一篇 下一篇

猜你喜欢

热点阅读