Drupal մոդուլում դաշտի տիպի ստեղծում
Դաշտի տիպերը սահմանում են դաշտերի հատկություններն ու վարքագիծը։ Դաշտի տիպերը սահմանվում են որպես plugin-ներ, ուստի խորհուրդ է տրվում ծանոթանալ plugin API-ին նախքան նոր դաշտի տիպի ստեղծումը։
Drupal 8-ում դաշտի տիպ ստեղծելու համար անհրաժեշտ է դաս, որի վրա առկա է FieldType անոտացիա։
Դասի տեղադրումը պետք է լինի MODULE_NAME/src/Plugin/Field/FieldType, օրինակ՝ /modules/foo/src/Plugin/Field/FieldType/BazItem.php։
Դասի անունների տարածքը պետք է լինի Drupal\MODULE_NAME\Plugin\Field\FieldType։
<?php namespace Drupal\MODULE_NAME\Plugin\Field\FieldType;
Դասի վերևում դրված անոտացիան պետք է պարունակի եզակի ID, լեյբլ, լռելյայն ֆորմատոր և լռելյայն վիջեթ։ Լռելյայն ֆորմատորը համարժեք է դաշտի ֆորմատորի դասի անոտացիայի id-ին։
/**
* Provides a field type of baz.
*
* @FieldType(
* id = "baz",
* label = @Translation("Baz field"),
* default_formatter = "baz_formatter",
* default_widget = "baz_widget",
* )
*/
Դասը պետք է իրագործի FieldItemInterface ինտերֆեյսը և սովորաբար ժառանգում է FieldItemBase դասը՝ ինտերֆեյսի ընդհանուր իրագործման համար։
class BazItem extends FieldItemBase {
}
FieldItemInterface::schema() մեթոդը պետք է ավերագրել՝ համակարգին հայտնելու, թե ինչպես պահպանել դաշտի արժեքները։
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
// columns պարունակում է այն արժեքները, որոնք դաշտը կպահպանի
'columns' => [
// Ցուցակ դաշտի պահվող արժեքների. այս դաշտը պահպանում է միայն մեկ արժեք՝ 'value'
'value' => [
'type' => 'text',
'size' => 'tiny',
'not null' => FALSE,
],
],
];
}
Այս մեթոդը վերադարձնում է API սքիմայի սյուների բնութագրերի զանգված։
FieldItemInterface::propertyDefinitions() մեթոդը հայտնում է համակարգին դաշտի հատկությունների մասին ավելի մանրամասն տվյալներ։
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties = [];
$properties['value'] = DataDefinition::create('string');
return $properties;
}
Map::isEmpty() մեթոդը (որը նախնին է FieldItemBase-ին) պետք է ավերագրել՝ համակարգին հայտնելու, թե երբ է դաշտը դատվում որպես դատարկ։
/**
* {@inheritdoc}
*/
public function isEmpty() {
$value = $this->get('value')->getValue();
return $value === NULL || $value === '';
}
Դաշտի կարգավորումները
Դաշտի կարգավորումները թույլ են տալիս օգտագործողներին հարմարեցնել դաշտը իրենց պահանջներին համապատասխան։ Եթե դաշտն ունի կարգավորումներ, պետք է կատարել երեք քայլ՝
- Ավերագրել FieldItemBase::defaultFieldSettings()՝ լռելյայն արժեքներ սահմանելու համար
- Ստեղծել կոնֆիգուրացիոն սքիմա ձեր կարգավորումների համար
- Ստեղծել ֆորմ՝ օգտագործողներին թույլ տալու կարգավորումներ փոխելու
Քայլ 1․ Ավերագրել FieldItemBase::defaultFieldSettings()
/**
* {@inheritdoc}
*/
public static function defaultFieldSettings() {
return [
// Սահմանել 'size' կարգավորումը լռելյայն արժեքով՝ 'large'
'size' => 'large',
] + parent::defaultFieldSettings();
}
Քայլ 2․ Ստեղծել կոնֆիգուրացիոն սքիմա ձեր կարգավորումների համար
Սքիման տեղադրվում է հետևյալ ֆայլում՝
[MODULE ROOT]/config/schema/[MODULE_NAME].schema.yml
Այստեղ նկարագրեք այն կարգավորումների տիպերը, որոնք ստեղծել եք defaultFieldSettings()-ում։
Քայլ 1-ում ստեղծվեց «size» անունով տեքստային կարգավորում, որի սքիման՝
field.field_settings.[FIELD ID]:
type: mapping
label: 'FIELDNAME կարգավորումներ'
mapping:
size:
type: string
label: 'Չափս'
Քայլ 3․ Ստեղծել ֆորմ՝ օգտագործողներին թույլ տալու կարգավորումներ փոխելու
Կարգավորումների արժեքների փոփոխման ֆորմը ստեղծվում է՝ ավերագրելով FieldItemBase::fieldSettingsForm() մեթոդը։
/**
* {@inheritdoc}
*/
public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
$element = [];
// էլեմենտի բանալին պետք է համապատասխանի կարգավորման անվան
$element['size'] = [
'#title' => $this->t('Size'),
'#type' => 'select',
'#options' => [
'small' => $this->t('Small'),
'medium' => $this->t('Medium'),
'large' => $this->t('Large'),
],
'#default_value' => $this->getSetting('size'),
];
return $element;
}
Իրական օրինակ
RgbItem դասը field_example մոդուլից Օրինակի նախագծից՝
namespace Drupal\field_example\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
/**
* 'field_example_rgb' դաշտի տիպի plugin իրականացում։
*
* @FieldType(
* id = "field_example_rgb",
* label = @Translation("Օրինակ՝ RGB գույն"),
* module = "field_example",
* description = @Translation("Ցուցադրում է RGB գույնը կազմող դաշտ։"),
* default_widget = "field_example_text",
* default_formatter = "field_example_simple_text"
* )
*/
class RgbItem extends FieldItemBase {
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
'columns' => [
'value' => [
'type' => 'text',
'size' => 'tiny',
'not null' => FALSE,
],
],
];
}
/**
* {@inheritdoc}
*/
public function isEmpty() {
$value = $this->get('value')->getValue();
return $value === NULL || $value === '';
}
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['value'] = DataDefinition::create('string')
->setLabel(t('Hex value'));
return $properties;
}
}