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; } }
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.