美文网首页Drupal
Drupal 9 创建自动填充表单

Drupal 9 创建自动填充表单

作者: 又起风了_ | 来源:发表于2022-03-22 16:33 被阅读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

    相关文章

      网友评论

        本文标题:Drupal 9 创建自动填充表单

        本文链接:https://www.haomeiwen.com/subject/ifufjrtx.html