Điểm:1

Tôi muốn tạo mô-đun trường phân loại tùy chỉnh

lá cờ es

Tôi muốn làm gì

Tôi muốn hiện thực hóa điều này trên Drupal9.

  • Cuối cùng, tôi muốn tạo trường tùy chỉnh trên biểu mẫu web.
  • Với trường tùy chỉnh này, Người gửi sử dụng biểu mẫu web có thể thêm thuật ngữ phân loại mới vào từ vựng (Từ vựng này được xác định trước trong mô-đun) trên biểu mẫu web này.
  • Trường này là trường văn bản.
  • Nếu thuật ngữ mới đã xuất hiện trong từ vựng, nó sẽ không được thêm vào từ vựng.
  • Nếu có thể, người gửi cũng có thể chọn một điều khoản từ các điều khoản đã được đăng ký.

Vấn đề

Tôi đang thử trường tùy chỉnh có thể đăng ký thuật ngữ trong loại nội dung. (Tôi không thể thêm trường tùy chỉnh vào biểu mẫu web. Vì vậy, tôi đã thử nó trước.) Tôi đã tạo nó một cách tạm thời. Tuy nhiên, nếu tôi viết gì đó vào trường này, một cảnh báo sẽ xuất hiện.

Cảnh báo: Chuyển đổi mảng thành chuỗi trong Drupal\mymodule2\Plugin\Field\FieldType\MyModule2Field->isEmpty() (dòng 62 của mô-đun/tùy chỉnh/mymodule2/src/Plugin/Field/FieldType/MyModule2Field.php).

MyModule2 là mô-đun tùy chỉnh mà tôi đã tạo.

Vì vậy, tôi muốn biết cách tạo trường tùy chỉnh có thể đăng ký thuật ngữ đúng cách.

Cấu trúc mã và thư mục

mymodule2(thư mục) -mymodule2.info.yml

-mymodule2.module

-src(thư mục)/Plugin(thư mục)/Trường(thư mục)

Trường(thư mục)-FieldType(thư mục)-MyModule2Field.php

Trường(thư mục)-FieldWidget(thư mục)-MyModule2Widget.php

Trường(thư mục)-FieldFormatter(thư mục)-MyModule2Formatter.php

mymodule2.info.yml

tên: mymodule2
loại: mô-đun
Mô tả: hogehoge
core_version_requirement: ^8,8 || ^9
gói: Ví dụ

mymodule2.module

<?php ?>

MyModule2Field.php

    <?php 
namespace Drupal\mymodule2\Plugin\Field\FieldType;

use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\taxonomy\Entity\Term;      
use Drupal\Core\Link;
use Drupal\Core\Url;
/**
 * Plugin implementation of the 'MyModule2' field type.
 *
 * @FieldType(
 *   id = "mymodule2",
 *   label = @Translation("MyModule"),
 *   description = @Translation("This field is used to store alpha-numeric values."),
 *   default_widget = "MyModule2Widget",
 *   default_formatter = "MyModule2Formatter"
 * )
 */
class MyModule2Field extends FieldItemBase {
 
 /**
  * {@inheritdoc}
  */
  
  public static function propertyDefinitions(FieldStorageDefinitionInterface $definition) {
    // Prevent early t() calls by using the TranslatableMarkup.
    $properties['mymodule2'] = DataDefinition::create('string')
    ->setLabel(new TranslatableMarkup('Text value'));
 
    return $properties;
  }
 
  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $definition) {
    $schema = [
        'columns' => [
          'mymodule2' => [
            'type' => 'varchar',
            'length' => 255,
          ],
        ],
    ];
    
    
    
    return $schema;
  }
 
  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    $value = $this->getValue();
    if (isset($value['mymodule2']) && $value['mymodule2'] != '') {
      
      /*this is problem code*/
      $val=implode("",$value);
      $arr = explode(',',$val);
      $categories_vocabulary='pixelarttag';
      foreach($arr as $a){
        $term = term::create(array(
        'parent' => array(),
        'name' => $a,
        'vid' => $categories_vocabulary,))->save();
      }
      return FALSE;
    }
    return TRUE;
  }
 
}
?>

MyModule2Widget.php

<?php 
namespace Drupal\mymodule2\Plugin\Field\FieldWidget;
 
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
 
/**
 * Plugin implementation of the 'MyModule2Widget' widget.
 *
 * @FieldWidget(
 *   id = "MyModule2Widget",
 *   label = @Translation("My Field widget"),
 *   field_types = {
 *     "mymodule2"
 *   }
 * )
 */
class MyModule2Widget extends WidgetBase {
 
 /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
   
    $element['mymodule2'] =  [
      '#type' => 'textfield',
      '#title' => 'AddictionTaxonomy',
      '#description' => 'Custom field to be used for alpha-numeric values',
      '#default_value' => isset($items[$delta]->title) ? $items[$delta]->title : NULL,
      '#weight' => 0,
    ];
 
    return $element;
  }
 
}
?>

MyModule2Formatter.php

<?php
namespace Drupal\mymodule2\Plugin\Field\FieldFormatter;
 
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Field\FieldItemListInterface;
 
/**
 * Plugin implementation of the 'MyModule2Formatter' formatter.
 *
 * @FieldFormatter(
 *   id = "MyModule2Formatter",
 *   label = @Translation("My Field Formatter"),
 *   field_types = {
 *     "mymodule2"
 *   }
 * )
 */
class MyModule2Formatter extends FormatterBase {
 
 /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    return [
      // Implement default settings.
    ] + parent::defaultSettings();
  }
 
  /**
   * {@inheritdoc}
   */
  public function settingsSummary() {
    $summary = [];
    $summary[] = $this->t('Displays the random string.');
    return $summary;
  }
 
  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
 
    $elements = [];
    foreach ($items as $delta => $item) {
      $elements[$delta] = [
        '#type' => 'markup',
        '#markup' => $item->mymodule2
      ];
    }
 
    return $elements;
  }
}
?>

Tái bút

Mình không giỏi tiếng Anh và cũng không biết nhiều về Drupal. Mình học Drupal được 1 tháng rồi nên có thể hỏi hơi vớ vẩn. Mong các bạn thứ lỗi

Trân trọng

apaderno avatar
lá cờ us
Chào mừng bạn đến với Câu trả lời của Drupal! Nếu `$value` chứa một mảng, `$val = implode("", $value);` sẽ đưa ra cảnh báo đó. Thật không may, một câu hỏi hỏi tại sao mã do người dùng viết lại gây ra cảnh báo PHP và cách tránh cảnh báo đó là lạc đề đối với chúng tôi, đặc biệt là khi mã gây ra cảnh báo không sử dụng bất kỳ hàm/phương thức Drupal nào, vì đó không phải là một câu hỏi cần kiến ​​thức về Drupal để trả lời.
yohei shibasaki avatar
lá cờ es
Cảm ơn và xin lỗi vì đã đặt câu hỏi không đúng chỗ. Tôi sẽ đặt câu hỏi tương tự vào đúng chỗ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.