logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll
20/06/2025, by Ivan

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:

  1. Prekoračiti FieldItemBase::defaultFieldSettings() da postavite podrazumevane vrednosti
  2. Kreirati konfiguracionu šemu za podešavanja
  3. 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.