Kreiranje tipa polja u Drupal modulu
Tipovi polja definišu svojstva i ponašanje polja. Tipovi polja definišu se kao plugini, zato se preporučuje da proučite Plugin API pre nego što počnete sa pisanjem novog tipa polja.
Da biste napravili tip polja u Drupalu 8, potreban vam je klasa sa anotacijom FieldType.
Lokacija klase tipa polja treba da bude u MODULE_NAME/src/Plugin/Field/FieldType
/modules/foo/src/Plugin/Field/FieldType/BazItem.php
Namespace ove klase treba da bude Drupal\MODULE_NAME\Plugin\Field\FieldType
<?php namespace Drupal\MODULE_NAME\Plugin\Field\FieldType;
Anotacija iznad klase unutar PHP dokumentacionog komentara treba da sadrži jedinstveni ID, labelu i podrazumevani formaterski plugin. Podrazumevani formaterski plugin koristi se kao ID u anotaciji klase formatara polja.
/**
* Provides a field type of baz.
*
* @FieldType(
* id = "baz",
* label = @Translation("Baz field"),
* default_formatter = "baz_formatter",
* default_widget = "baz_widget",
* )
*/
Klasa treba da implementira interfejs FieldItemInterface i nasledi klasu FieldItemBase za osnovnu implementaciju.
class BazItem extends FieldItemBase {
}
FieldItemInterface::schema() treba da bude prekoračen da bi sistemu rekao kako da skladišti vrednosti polja:
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
// columns sadrži vrednosti koje polje skladišti
'columns' => [
// Navodimo koje vrednosti polje skladišti. Ovo polje skladišti
// samo jednu vrednost 'value'
'value' => [
'type' => 'text',
'size' => 'tiny',
'not null' => FALSE,
],
],
];
}
Ova metoda vraća niz specifikacija kolona za schema API.
Metod FieldItemInterface::propertyDefinitions() pruža sistemu detaljnije informacije o svojstvima vašeg polja.
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties = [];
$properties['value'] = DataDefinition::create('string');
return $properties;
}
Metod Map::isEmpty (predek klase FieldItemBase) treba da bude prekoračen da bi sistemu rekao kako da prepozna kada je polje prazno.
/**
* {@inheritdoc}
*/
public function isEmpty() {
$value = $this->get('value')->getValue();
return $value === NULL || $value === '';
}
Podešavanja polja
Podešavanja polja omogućavaju korisnicima da prilagode polje po svojim potrebama. Ako polje ima podešavanja, potrebno je uraditi tri koraka:
- Prekoračiti FieldItemBase::defaultFieldSettings() da postavite podrazumevane vrednosti
- Kreirati konfiguracionu šemu za podešavanja
- Kreirati formu da korisnici mogu menjati podešavanja
Korak 1: Prekoračiti FieldItemBase::defaultFieldSettings()
/**
* {@inheritdoc}
*/
public static function defaultFieldSettings() {
return [
// Deklarišite jedno podešavanje 'size' sa podrazumevanom vrednošću 'large'
'size' => 'large',
] + parent::defaultFieldSettings();
}
Korak 2: Kreirati konfiguracionu šemu za podešavanja
Konfiguraciona šema se nalazi u fajlu:
[MODULE ROOT]/config/schema/[MODULE_NAME].schema.yml
U ovom fajlu opisujete tipove podataka podešavanja definisanih u defaultFieldSettings():
Korak 1 je definisao podešavanje 'size' koje čuva string vrednost. Šema izgleda ovako:
field.field_settings.[ID POLJA]:
type: mapping
label: 'FIELDNAME podešavanja'
mapping:
size:
type: string
label: 'Veličina'
Korak 3: Kreirati formu da korisnici menjaju podešavanja
Forma za menjanje podešavanja se pravi prekoračenjem FieldItemBase::fieldSettingsForm()
/**
* {@inheritdoc}
*/
public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
$element = [];
// Ključ elementa treba biti ime podešavanja
$element['size'] = [
'#title' => $this->t('Veličina'),
'#type' => 'select',
'#options' => [
'small' => $this->t('Malo'),
'medium' => $this->t('Srednje'),
'large' => $this->t('Veliko'),
],
'#default_value' => $this->getSetting('size'),
];
return $element;
}
Pravi primer
RgbItem iz modula field_example u projekat primera:
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;
/**
* Plugin implementacija tipa polja 'field_example_rgb'.
*
* @FieldType(
* id = "field_example_rgb",
* label = @Translation("Primer boje RGB"),
* module = "field_example",
* description = @Translation("Prikazuje polje sastavljeno od RGB boje."),
* 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 vrednost'));
return $properties;
}
}