Создание собственного типа поля(логического) в самописном модуле для Drupal 8.

Создание собственных типов полей довольно широко описано в примерах в сети. Вот, например, ссылка на сайт друпала, где описывается создание пользовательского типа поля, из собственного модуля. Здесь я приведу пример создания логического типа поля и создание поля на основе этого типа. Ниже описаны три файла(местами в них встречается лишняя информация, не обращайте внимания): FieldType, FieldFormatter и FieldWidget. Как создавать пользовательский модуль для создания собственного поля можно прочитать также на сайте Drupal.org, или найти информацию(ее предостаточно) в сети. Итак, сами файлы:

FieldType

<?php


    
    namespace Drupal\name_custom_module\Plugin\Field\FieldType;
 
    use Drupal\Core\Field\FieldItemBase;
    use Drupal\Core\Field\FieldStorageDefinitionInterface;
    use Drupal\Core\TypedData\DataDefinition;
    use Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem;
    use Drupal\Core\TypedData\OptionsProviderInterface;
     
    /**
     * @FieldType(
     *   id = "my_logic_field",
     *   label = @Translation("pole for cross in VK"),
     *   description = @Translation("This field stores a reference to a user and a password for this user on the entity."),
     *   default_widget = "name_custom_moduleWidget",
     *   default_formatter = "name_custom_moduleFormatter",  
     * )
     */
   
    class LogicField extends BooleanItem implements OptionsProviderInterface {

 public static function schema (FieldStorageDefinitionInterface $field_definition) {
    return [
      'columns' => [
        'value' => [
          'type' => 'int',
          'size' => 'tiny',
        ],
      ],
    ];
  }
      
 public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
     $properties['value'] = DataDefinition::create('boolean')
    ->setLabel(t('Boolean value'))
    ->setRequired(TRUE);
    // var_dump($properties);

  return $properties; 
      }

public function preSave() {
parent::preSave();
$z = $this->getFieldDefinition()->getName();
//$z = substr($z ,6);
$_SESSION['z'] = $z;
//kint($z);
}

}

FieldFormatter

<?php

/**
     * @file
     * Contains \Drupal\name_custom_module\Plugin\Field\FieldFormatter\name_custom_moduleFormatter.
     */
     
    namespace Drupal\name_custom_module\Plugin\Field\FieldFormatter;
     
    use Drupal\Core\Field\FieldItemListInterface;
    use Drupal\Core\Field\FormatterBase;
    use Drupal\Core\Field\Plugin\Field\FieldFormatter\BooleanFormatter;   
   

/** 
* @FieldFormatter(
*    id = "name_custom_moduleFormatter",
*   label = @Translation("Boolean"),
*   field_types = {
*     "my_logic_field",
*   }
* )
*/

//class name_custom_moduleFormatter extends FormatterBase {
  
  class name_custom_moduleFormatter extends BooleanFormatter {
public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = [];

    $formats = $this->getOutputFormats();

    foreach ($items as $delta => $item) {
      $format = $this->getSetting('format');

      if ($format == 'custom') {
        $elements[$delta] = ['#markup' => $item->value ? $this->getSetting('format_custom_true') : $this->getSetting('format_custom_false')];
      }
      else {
        $elements[$delta] = ['#markup' => $item->value ? $formats[$format][0] : $formats[$format][1]];
      }
  
    /*  $elements[$delta] =  [
      '#type' => 'html_tag',
      '#tag'  => 'p',
      '#value' => $this->t('my custom field VK'),
      ] + $elements[$delta]; */
     
    }
    
    

    return $elements;
  }

/*
public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = array();

    foreach ($items as $delta => $item) {
      $elements[$delta] = array(
        // We create a render array to produce the desired markup,
        // "<p style="color: #hexcolor">The color code ... #hexcolor</p>".
        // See theme_html_tag().
        '#type' => 'html_tag',
        '#tag' => 'p',
        '#attributes' => array(
          'style' => 'color: ' . $item->value,
        ),
        '#value' => $this->t('The color code in this field is @code', array('@code' => $item->value)),
      );
    }

    return $elements;
  }
*/
    }

FieldWidget

<?php
/**
 * @file
 * Contains \Drupal\name_custom_module\Plugin\Field\FieldWidget\name_custom_moduleWidget
 */
 
namespace Drupal\name_custom_module\Plugin\Field\FieldWidget;
 
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Field\Plugin\Field\FieldWidget\BooleanCheckboxWidget;

/**
*@FieldWidget(
*  id = "name_custom_moduleWidget",
*  label = @Translation("Single on/off checkbox"),
*  field_types = {
*    "my_logic_field"
*  },
*  multiple_values = TRUE
* )
*/

class name_custom_moduleWidget extends BooleanCheckboxWidget {

 public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element['value'] = $element + [
      '#type' => 'checkbox',
      '#default_value' => !empty($items[0]->value),
    ];

    // Override the title from the incoming $element.
    if ($this->getSetting('display_label')) {
      $element['value']['#title'] = $this->fieldDefinition->getLabel();
    }
    else {
      $element['value']['#title'] = $this->fieldDefinition->getSetting('on_label');
    }

    return $element;
  }


}