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
mã
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